مسئله از کجاست؟#

بسیاری از سایت‌ها اطلاعات را در پایگاه داده نگه می‌دارند و برای خواندن آن‌ها دستورهای SQL می‌سازند. اگر برنامه ورودی کاربر مثل نام کاربری را مستقیم در متن دستور بچسباند، ورودی خاص می‌تواند معنی دستور را تغییر دهد. به این ضعف تزریق SQL می‌گویند. مشکل از برنامه‌نویسی ناامن است، نه از خود دیتابیس.

چرا مهم است؟#

پیامدهای آن می‌تواند افشای اطلاعات کاربران، تغییر یا حذف داده و دور زدن ورود باشد. سال‌هاست جزو رایج‌ترین ضعف‌های سایت‌هاست و هنوز در پروژه‌های قدیمی یا عجولانه دیده می‌شود.

راه درست در کد (برای توسعه‌دهنده)#

اصل ساده این است که داده را از دستور جدا کنید:

  • از کوئری پارامتری یا Prepared Statement استفاده کنید.
  • در وردپرس از توابع آماده‌ی امن مثل prepare استفاده کنید.
  • ورودی را اعتبارسنجی و محدود کنید.
  • حساب دیتابیس برنامه فقط دسترسی لازم را داشته باشد، نه همه‌چیز.
  • خطاهای دیتابیس را به کاربر نشان ندهید.

برای صاحب سایت#

اگر از قالب و افزونه‌ی آماده استفاده می‌کنید، مهم‌ترین کار به‌روزرسانی منظم و دوری از افزونه‌های کرک‌شده یا رهاشده است؛ چون ضعف‌ها معمولاً در همین‌ها پیدا می‌شود. وجود فایروال برنامه‌ی وب و بکاپ منظم هم لایه‌ی اضافه است.

نکته#

این مقاله فقط جنبه‌ی دفاعی دارد: هدف شناخت خطر و پیشگیری در کد خودتان است. آزمایش روی سیستم دیگران بدون اجازه جرم است.