امنیت در پایگاههای داده ای - بخش اول
امنیت سرور
مقدمه
با گسترش استفاده از تکنولوژی وب و توسعه برنامه هایی که برای کارکرد درین بستر تولید میشوند مباحث مربوط به امنیت پایگاههای داده ای بعد جدیدتری پیدا کرده اند. هر چند از آغاز پیداش پایگاههای داده همواره امنیت و تامین آن یک دغدغه مهم و پیاده سازی مناسب و کارای آن یک خصوصیت بنیادی در پایگاههای داده بوده است اما بهر روی بحث امنیت (Security)همواره در سایه مقولاتی همچون عملکرد مناسب (Functionality) ، کارایی (Performance) و قابلیت اطمینان (Reliability) قرار میگرفت. به عبارتی هنوز هم چندان عجیب نیست اگر ببینیم یک برنامه رده سازمانی (Enterprise Level) با تعداد زیادی Client بدون هیچگونه ملاحظه امنیتی تولید شده و مورد استفاده باشد. حتی میتوان درین زمینه مثالهای جالبتری یافت. اغلب برنامه های Client-Server با نام کاربری sa(System Administrator) به پایگاههای داده متصل میشوند. از دید امنیتی این مطلب یک فاجعه محسوب میشود. هیچ تغییر و یا خرابکاری ای قابل ردیابی نیست، همه کاربران به همه اطلاعات دسترسی دارند و الی آخر.
آنچه ذکر شد ، در واقع تصویری از وضعیت جاری بود، که باید از دو منظر نگریسته شود: عدم وجود مکانیزمهای امنیتی مناسب و نیز در صورت وجود چنین مکانیزمهایی عدم بهره گیری صحیح ازانها یا نداشتن سیاست امنیتی مطلوب.
این وضعیت شاید در دنیای برنامه های مبتنی بر تکنولوژی های Mainframe یا Client-Server قابل تحمل بود اما در شرایط فعلی که برنامه ها با سرعت زیادی به سمت بهره گیری از بستر وب میروند ادامه این روند فاجعه بار است. در حال حاضر دیگر کاربران یک برنامه به صورت بالقوه تنها کارمندان یک سازمان نیستند. هر فردی میتواند به سادگی باز کردن یک مرورگر وب به پایگاه داده شما متصل شود و مطمئن باشید اگر مکانیزمهای امنیتی را رعایت نکرده باشید ، حذف تمامی داده های شما حتس از عهده یک نفوذگر عادی هم بر می آید.
اجازه دهید یک فرض اساسی را مطرح کنیم. مدیران IT یک سازمان بر دو دسته اند: مدیران نوگرایی که به صورت داوطلبانه سازمان را به سمت ارائه خدمات عمومی و گسترده هدایت میکنند و به همین دلیل تکنولوژی وب را به عنوان تنها بستر موجود برای ارائه این خدمات میپذیرند و مدیران سنتی محافظه کاری که قابلیت اطمینان و کارایی سیستم جاری را تحت هیچ شرایطی حاضر نیستند در معرض خطر قرار دهند. وب از نظر این گروه دوم کماکان یک تکنولوژی مشکوک غیر قابل اطمینان است. در واقع دلایل فنی این گروه دوم هنوز هم چشمگیر و قابل اعتناست، به خصوص گروهی که از mainframe ها صحبت میکنند. قابلیت اطمینان 0.99999 هنوز هم در دنیای غیر Mainframe یک رویاست.
زمانی که بحث امنیت در بستر وب مطرح میشود به صورت عمده سه جزء زیر مد نظر است:
امنیت سرور(Server Security)
امنیت در تصدیق اعتبار(Authentication Security)
امنیت محاوره(Session Security)
در ادامه نگاهی به جزئیات هریک از اجزای این دسته بندی خواهیم داشت.
شاید بخش عمده امنیت سرور مربوط به مدیر شبکه و نیز کارشناس امنیت اطلاعات باشد. ازین نظر DBA مسئولیت چندانی ندارد ، البته این به شرطی ست که قبلا متخصص امنیت شبکه مکانیزمهای امنیتی مناسب را جهت سرور پیش بینی کرده باشد. این مکانیزمها محدوده وسیعی از ابزارها و راه حلهای امنیتی را در بر میگیرد: فایروالها ، تشخیصگرهای نفوذ (Intrusion Detectors) ، ضد ویروسها ، ... از جمله ابزارها هستند . معماری امن شبکه و لحاظ کردن مسائل امنیتی درین معماری نیز میتواند حائز اهمیت باشد. تمامی این مباحث زیر مجموعه بحث امنیت شبکه می باشند که در بخش آتی به صورت خیلی مختصر به آن اشاره خواهیم کرد:
معماری امن شبکه با نگاه به پایگاه داده
الف. در نظر گرفتن سخت افزار جداگانه جهت سرور وب و سرور پایگاه داده
بسیاری از سرویسهای کنونی وب و حتی شبکه های داخلی (Intranet) به گونه ای طراحی شده اند که سرور اصلی پایگاه داده (Back End Server) را روی همان سروری در نظر میگیرند که سرویس وب روی آن راه اندازی شده است. البته برای این کار چندین توجیه وجود دارد :
توجیه اقتصادی: در نظر گرفتن هر دو سرویس بر روی یک ماشین از جهت هزینه کل سازمان یک صرفه جویی محسوب میشود. باید توجه داشت که برای ارایه هر دوی این خدمات ماشینهای با قدرت پردازش بالا باید در نظر گرفته شوند.
توجیه فنی: عده ای برین عقیده اند که ارائه این دو خدمت بر روی یک ماشین سبب بهبود کلی کارایی میشود. استدلال اصلی محدودیت سرعت بر روی شبکه است. این استدلال نیز توجیه چندانی ندارد زیرا حداقل سرعت شبکه های محلی فعلی ???Mb/s است که بسیار بالاتر از حداکثر سرعت شبکه های WAN در حال حاضر است.
بنابراین از دو توجیه بالا تنها استدلال مبتنی بر صرفه جویی اقتصادی کماکان میتواتند مطرح باشد. اما خطرات اجرای این دو سرویس بر روی یک مکاشین به حدی ست که بهتر است سازمان به جای پذیرش این ریسکها، هزینه اضافی مربوطه را متحمل شود. تا کنون روشهای متعددی برای نفوذ به سرورهای وب طراحی و اجرا شده است. بسیاری از ویروسهای کامپیوتری و نیز کرمهای اینترنتی (Code Redو Nimda) نیز اساسا بر پایه همین ضعفها عمل میکنند. صرف نظر از نوع سرور وبی که در نظر میگیرید (Apache،IIS یا هر سرور دیگر) همیشه باید این احتمال را بدهید که در صورت وجود یک شکاف امنیتی در سرور مربوطه، شما در مجموع کمترین ضرر را متحمل شوید.
جدا کردن فیزیکی دو سرور وب و پایگاه داده این امر را تا حدی (دقت کنید که فقط تا حدی و نه به طور کامل) برای شما تضمین میکند که حتی اگر نفوذگری توانست اختیارات مدیر سیستم مربوط به سرور وب را به دست بیاورد نتواند به سادگی به اطلاعات موجود روی پایگاه داده نیز دست یابد.
ب. قرار ندادن پایگاه داده در DMZ:
در صورتی که از یک معماری امن برای پیاده سازی شبکه خود استفاده کرده باشید به احتمال زیاد شبکه شما دارای یک بخش DMZ(Don’t Militarized Zone) خواهد بود. معمولا ارائه دهندگان خدمات عمومی را درین بخش از شبکه قرار میدهند. بعنوان مثال سرورهای وب، سرورهای میل ... که همگی جهت خدمات عمومی بکار میروند درین بخش از شبکه قرار دارند.
ایده عمومی داشتن یک بخش DMZ ساده ست: سرورهایی که خدمات عمومی بیرون سازمانی ارایه میدهند نیازمند سطح کمتری از امنیت هستند. در واقع همه میتوانند به آنها دسترسی داشته باشند. این دسترسی همگانی به هیچ وجه لازم نیست در مورد تمامی منابع شبکه اعمال شود. بنابرین منابع عمومی شبکه را در بخشی از شبکه قرار میدهند که حساسیت امنیتی کمتری نسبت به آن وجود دارد. این همان بخش DMZ است. با توجه به مطالب بالا بسیار بدیهی به نظر میرسد سرور پایگاه داده را باید در همان بخش DMZ قرار دهیم زیرا که عموما این سرور نیز مسئولیت ارائه خدمات همگانی را بعهده دارد. اما قضیه در باره سرور پایگاه داده تا حدی متفاوت است. این سرور گرچه خدمات همگانی نیز عرضه میکند اما تنها بخشی از داده های آن ممکن است جنبه همگانی داشته باشد در حالی که عمده آن در اغلب اوقات سری ست. بعنوان مثال سروری که اطلاعات مربوط به کارت اعتباری افراد را نگهداری میکند از اهمیت فوق العاده ای برخوردار است و هرگونه دسترسی به کل داده های آن میتواند فاجعه بار باشد.
بنابراین بر خلاف دید اولیه به این نتیجه میرسیم که پایگاه داده نمیتواند و نباید که در بخش DMZ قرار گیرد. اما راهکار جداسازی آن ازین بخش چیست؟
شکل ?: پایگاه داده و DMZ
راه حل ایده آل برای این جداسازی به شرح زیر است: به صورت عام از یک فایروال اصلی برای ایمنی کل شبکه و جداسازی آن از دنیای بیرون استفاده میشود. این فایروال در قسمت بیرونی DMZ قرار دارد و دارای قواعد خاص خود است. بدلایلی که در بخش پیش ذکر شد که کلا عبارت بود از نیاز به ارائه خدمات عمومی ،این فایروال نمیتواند کل ترافیک ورودی را محدود کند و ناچار است یک سیاست (Policy) حداکثری را اعمال کند.
اما در داخل خود شبکه ، مابیت LAN داخلی و DMZ از فایروال دومی استفاده میشود. این فایروال دوم در حالت ایده آل تمامی ترافیک ورودی را سد میکند بجز ترافیک ورودی از وب سرور به پایگاه داده. با این تمهید خاص هم پچایگاه داده خدمات عمومی خود را ارائه میدهد و هم دستیابی عموم را به آن سد کرده ایم. درین صورت یک نفوذ گر حتی پس ازینکه کنترل کامل سرور وب را در اختیار گرفت ناچار است از قواعد سختگیرانه فایروال دوم نیز عبور کند و تازه پس ازان باید بتواند به سرور پایگاه داده نیز نفوذ کند که انجام این هر دو کار بسیار دشوار میباشد و ریسک چنین شبکه ای عملا پایین می باشد.
اما شاید در مقابل روش ما استدلالی اینچنین ارائه شود: میتوان تنها با استفاده از یک فایروال امنیت را تامین کرد. روش آنهم اینست که برای سرورهای پایگاه داده از IP مجازی استفاده کنیم. در واقع این سرورها پشت یک NAT قرار داشته باشند. درین صورت نفوذگر اساسا از وجود پایگاه داده خبر ندارد تا بخواهد به آن نفوذ کند. این استدلال یک ابراد عمده دارد و آنهم اینست که اگر نفوذ گر بتواند کنترل سرور وب را در اختیار بگیرد عملا در همان شبکه ای قرار گرفته است که سرور پایگاه داده دران قرار دارد و دارای همان رنج IP میشود. بنابراین پس ازینکار در واقع تمهید قبلی ما بلااثر میشود و نفوذ گر میتواند بسادگی مانند یک کاربر داخلی شبکه ما عمل کند.
حال که استدلالات فوق را پذیرفته ایم میتوانیم کمی ایده آل تر باشیم و شبکه را ایمن تر کنیم. فرض کنید که یک نفوذگر بتواند از لایه اول امنیتی شما عبور کرده وارد DMZ شود. اگر این نفوذ به دلیل نقص قواعد امنیتی فایروال شماره یک باشد احتمال نفوذ همین شخص به لایه دوم بسیار پایین است. اما اگر این نفوذ به دلیل وجود شکاف امنیتی خاصی بر روی فایروال باشد چطور؟ فرض کنید به عنوان مثال هردو فایروال شما Check Point است. آنوقت نفوذگر بهمان سادگی که از لایه اول عبور کرده از لایه دوم امنیتی شما نیز خواهد گذشت چون هر دو فایروال ما از یک نوع است و طبیعتا شکاف امنیتی هردو یکسان است. بنابراین میتوان پیشنهاد داد که فرضا اگر فایروال لاه اول شما Check Point است در لایه دوم بهتر است از PIX استفاده کنید. این مطلب باعث امنیت بالاتر شبکه شما خواهد شد.
این روش گرچه موثر است اما از عهده هرسازمانی بر نمی آید. نگهداری، بروزسازی و پیکربندی فایروال عموما خودش یک تخصص خاص و بالنسبه گرانقیمت است. بنابراین وقتی از دو نوع فایروال استفاده میکنید دو تخصص جداگانه را در سازمان خود نیاز خواهید داشت که این مطلب باعث دو برابر شدن هزینه نیروی انسانی شما خواهد شد. علاوه برینکه اصولا خود سخت افزار فایروال هم گرانقیمت است و اصولا مشخص نیست که سازمان شما حاضر باشد چنین هزینه ای را متقبل شود (حتی با فرض دانستن ریسک امنیتی بالای آن)
راه حل دیگری که میتوان برای جداسازی بخش امن شبکه ارائه داد استفاده از بیش از یک کارت شبکه در فایروال است (شکل ?)
شکل ?: استفاده از دو کارت شبکه برای جداسازی DMZ
همانطور که مشخص است درین روش توسط یک فایروال، DMZ از بخش امن شبکه جداسازی میشود. تنها ترافیکی که حق عبور از اینترفیس اول (eth1) به اینترفیس امن (eth2) را دارد ترافیک ورودی از وب سرور به سرور پایگاه داده میباشد. این روش بسیار ارزان تر از روش قبلی ست اما مشخصا امنیت آن در حد امنیت روش قبل نیست و علاوه برآن ممکن است فایروال موجود ما عملا از چندین کارت شبکه پشتیبانی نکند.
علاوه بر دو راهی که در فوق برای جداسازی پایگاه داده از مابقی شبکه ارائه دادیم راه حل سومی هم وجود دارد: اینکه اساسا پایگاه داده را از مابقی شبکه جدانکنیم! دقت کنید که با توجه به هزینه و نیز اندازه سازمان ممکن است جداسازی امکان پذیر نباشد و حتی مجبور شویم که این دو سرور را برروی یک ماشین اجرا کنیم. حتی درین صورت نیز بهتر است حداقل کارهایی که جهت ایمنی مضاعف پایگاه داده از دستمان بر می آید انجام دهیم. بعنوان مثال میتوانیم از یک فایروال نرم افزاری ارزان قیمت جهت ایمنی بیشتر استفاده کنیم. بهر حال این راه حل توصیه نمیشود مگر در شرایط اجبار.
ج. رمز نگاری اطلاعات مابین سرور وب و سرور پایگاه داده
برای جلوگیری از سرقت اطلاعات در بین راه(Sniffing) عموما از روشهای رمز نگاری استفاده میشود. متداول ترین روش تحت وب برای انجام این منظور استفاده از پروتکل SSL است. عموم اطلاعات امن که بر روی اینترنت منتقل میشوند از همین پروتکل استفاده میکنند . بعنوان مثال انتقال اطلاعات شناسایی با سرورهای معروف ایمیل، انتقال اطلاعات مربوط به کارت اعتباری و غیره.
تا بدینجا این پروتکل که اغلب سرورهای وب و نیز مرورگرها ازان پشتیبانی میکنند سطحی از امنیت را تامین میکند. اما آیا همین کافی ست؟
اغلب این اشتباه پیش می آید که همین سطح از رمز نگاری را در مقابل حمله Sniffing کافی میدانند. باید دقت کرد که SSL به صورت عام تنها برای رمزنگاری اطلاعات مابین Client و سرور وب به کار میرود و به صورت عادی اطلاعات مابین وب سرور و سرور پایگاه داده به صورت عادی و بدون رمزنگاری (Plain Text) منتقل میشوند. بنابراین حتی اگر همه جوانب را در شبکه بیرونی رعایت کرده باشیم، یک نفوذگر داخلی به سادگی میتواند اطلاعات در حال انتقال مابین این دو سرور را شنود کند. این مطلب زمانی بسیار جدی میشود که بدانیم بر اساس داده های موجود، بالاتر از ??? حملات موجود حملات درون سازمانی می باشد.
چاره کار استفاده از یک روش رمز نگاری مابین سرور وب و سرور پایگاه داده است. اغلب سرور های پایگاه داده امروزه از SSL حمایت میکنند. MS SQL Server2000 ، Oracle،Sybase ازین جمله اند. البته استفاده از SSL برای ارتباط مابین این دو سرور لازمه اش اینست که برنامه اصلی شما (Web Application) با همین ملاحظه طراحی و پیاده سازی شده باشد.
اما در صورتی که برنامه شما از قبل موجود باشد یا از SSL پشتیبانی نکند یا به هر صورت شما مایل به ایجاد هزینه اضافی نباشید چه؟ آیا راه حل دیگری برای رمزنگاری مابین دو سرور وجود دارد؟ خوشبختانه چنین راه حلی وجود دارد: استفاده از SSH یا یک برنامه مشابه.
اصولا SSH برنامه ای شبیه Telnet است اما نسخه امن آن. یکی از قابلیتهای SSH ایجاد یک تونل امن است. به این صورت که میتوان برنامه SSH را به گونه ای اجرا کرد که بر روی یک پورت شنود کند کل اطلاعات آن را رمز کرده به کامپیوتر مقصد ارسال کند و آنجا پس از تبدیل به حالت عادی به پورت مقصد تحویل دهد. با استفاده از این روش (SSH Port Forwarding) یک تونل امن به صورت شفاف مابین دو سرور ایجاد شده است(شکل ?).
شکل ?: استفاده از SSH برای برقراری تونل امن
مزیت استفاده ازین روش اینست که نیاز به هیچگونه تغییری در سرورها و یا برنامه ها ندارد و تنها توسط چند خط دستور قابل اجراست.
د. عدم استفاده از Hub و بهره گیری از Switch
به صورت عادی زمانی که از Hub استفاده میکنیم تمامی اطلاعات عبوری در هریک از سیستمهای موجود در شبکه داخلی قابل شنود است. یک نفوذ گر معمولی با استفاده از یکی از ابزارهای Sniffing میتواند اینترفیس شبکه با به حالت Promiscuous برده ، تمامی اطلاعات در حال جابجایی بر روی LAN را دریافت کند. البته استفاده از رمز نگاری خطر بالقوه بهره گیری ازین روش را کم میکند اما هیچگاه نمیتوان مطمئن بود که کل اطلاعات رمز نگاری شده است. بنابراین بهتر است حتی المقدور امکان بهره گیری از Sniffing را بر روی شبکه کاهش دهیم. استفاده از سوپیچها به جای هاب یکی از روشهای حل این مساله است. با استفاده از سوئیچ در واقع یک مدار مجازی (Virtual Circuit) مابین دو نود در حال مکالمه ایجاد میشود و دیگران به اطلاعات در حال انتقال مابین آن دو دسترسی ندارند.
?-?. ارائه امن اطلاعات
از دید کلی امنیت اطلاعات برای ارائه خدمات اطلاع رسانی بر روی وب به صورت عمده دو راه وجود دارد:
تولید اطلاعات به صورت استاتیک
تولید اطلاعات به صورت دینامیک
?-?-?. تولید اطلاعات به صورت استاتیک و مسائل امنیتی آن
معمولترین نوع دسترسی به اطلاعات در اینترنت استفاده از صفحات HTML است. هنوز هم بسیاری از متخصصین، این روش در دسترس گذاری اطلاعات (Web Publishing) را به روشهای دیگر ترجیح میدهند. البته دلایل اصلی آنها بیشتر مربوط به سادگی و قابلیت انعطاف این روش است.
درین روش اطلاعات یک بار تولید میشود. تولید اطلاعات (صفحات HTML) میتواند به صورت دستی یا به صورت اتوماتیک توسط برنامه های معمولی Client-Server انجام شود. پس از انجام این فاز کلیه اطلاعات بر روی سایت و سرور اصلی قرار میگیرد (Upload).
امنیت این روش به سادگی تامین میشود. کافیست که اشخاص نام فایلهای HTML را ندانند، درین صورت هرگز به آنها دسترسی نخواهند داشت. اینکار با استفاده از مکانیزم ساده ای صورت میگیرد. عموم وب سرورها برای دایرکتوریهای مختلف حق دسترسی تعریف میکنند که یکی ازین حقوق دسترسی حق مشاهده محتویات یک دایرکتوری است. در صورتی که کاربری این حق را نداشته باشد از اسامی فایلها بی خبر خواهد بود و در نتیجه قادر به مشاهده آنها نیست.
استفاده ازین روش مزایا و معایب خاص خود را دارد. مزیت آن امنیت بالاست. در واقع درینجا هیچ ارتباز اکیتیوی با سرور پایگاه داده وجود ندارد. اطلاعات به صورت برون خط (Offline) بر روی سرور وب بارگذاری میشوند و پس ازان هیچ ارتباطی مابین کاربر عادی و چپایگاه داده وجود نخواهد داشت. بدین ترتیب خطر حملات به پایگاه داده کاهش چشمگیری می یابد. اما از دیگر سو مدیریت حجم انبوه اطلاعات با استفاده ازین روش بسیار دشوار میباشد . ضمن اینکه قابلیت انعطاف روش نیز بسیار محدود است. در واقع زمانی که ازین روش استفاده میکنیم هدف اصلی خدمت رسانی و سهولت استفاده را قربانی امنیت کرده ایم.
?-?-?. تولید اطلاعات به صورت دینامیک
این روش متداول ترین شیوه ایست که امروزه جهت ارائه خدمات بر بستر وب مورد استفاده قرار میگیرد. درین روش صفحات موجود بر روی سرور وب عملا دارای هیچ اطلاعاتی نمیباشند یا دارای حداقل اطلاعات هستند. تمامی اطلاعات در پایگاه داده است. به محض دریافت هر تقاضایی توسط سرور وب ، صفحات مورد درخواست او به صورت دینامیک از طریق جستجوی (Query) مناسب در پایگاه داده تولید میشود.
برای پیاده سازی این روش طیف وسیعی از تکنولوژیها وجود دارد. ASP،JSP،PHP،CGI،ISAPI... و چندین روش دیگری که عم??ما حول همین تولید?دینامیک اطلاعات ??ر محیط?وب طراحی شده اند. ??منیت هریک ازین زبانها و روشها خود ? موضوع ب??ث مفصل و جداگانه ??یست اما از دید بح?? حاضر چند نکته مه?? را با??د مد نظر داشت:
?
? تا ک??ون شکافهای ? جدی امنیتی در مورد هر یک ازین ??وشها شناخته شده ??ست و با وجود ? حل اغلب آن??ا هنوز هم هیچکدام?آنها امنیت بالای?? را به تنهایی ? تضمین نمیکنند. ?
? با و??ود نکته ? بالا، چون هدف ??صلی ارائه خدمت یا?سرویس است در بسیا??ی موارد ? چاره ای بجز اس??فاده از یکی ازین ??وشها نداریم.
هنگام انتخ??ب هری?? ازین روشها باید ??لاحظات امنیتی مر??وط به ابزارهای مدیریت ?? توسعه را نیز لحاظ کنیم. ?
?
? طی بخش گذشته عموما توجه ما معطوف به این مطلب بود که چگونه جلوی دستیابی افراد غیر مجاز به سیستم و اطلاعات گرفته شود. اما هیچ گاه به این مطلب اشاره نکردیم که مجاز یا غیر مجاز بودن افراد را چگونه تشخیص میدهیم. در واقع روش شناسایی افراد در یک سیستم امن چگونه میتواند باشد.
ابتدایی ترین روشی که درین زمینه میتوان در نظر گرفت تصدیق اعتبار ساده بر حسب نام کاربری و کلمه عبور است. گرچه پیاده سازی این روش سنتی بسیار ساده است اما امنیتی هم که تامین میکند حداقل امنیت ممکن است. درین روش کاربر یکبار در سیستم شناسایی میشود و پس ازان اطلاعات به صورت عادی بر روی شبکه جریان می یابد. مشکلات این روش را میتوان به صورت زیر خلاصه کرد:
· تمامی اطلاعات در بین راه قابل شنود هستند.
بند بالا به خصوص شامل خود نام کاربری و کلمه عبور هم میشود. به عبارتی این دو هم به سادگی میتوانند توسط شخص ثالثی در بین راه شنود شده و بعدا مورد استفاده قرار گیرند.
در شرایطی که نام کاربری و کلمه عبور لو رود کل امنیت سیستم دچار اخلال خواهد شد.
در واقع این روش تنها تضمین کننده حداقل غیر قابل قبولی از امنیت در تصدیق اعتبار افراد است. بنابراین باید به دنبال روشهای جایگزینی بود که معایب فوق را نداشته باشند.
.::مرجع کد آهنگ::.
.::دریافت کد موزیک::.