SQL Injection یا تزریق SQL یکی از قدیمیترین و درعینحال خطرناکترین حملات علیه وبسایتها و اپلیکیشنهای مبتنی بر پایگاهداده است. این حمله زمانی رخ میدهد که ورودی کاربر بهدرستی اعتبارسنجی نشده و مهاجم بتواند دستورات SQL خود را به پایگاهداده تزریق کند.
SQLi در لیست OWASP Top 10 همیشه بهعنوان یکی از بحرانیترین آسیبپذیریها شناخته میشود، زیرا میتواند منجر به سرقت اطلاعات، حذف دیتابیس، ورود غیرمجاز کاربران و حتی کنترل کامل سرور شود.
🔥 SQL Injection چیست؟
SQL Injection یک روش نفوذ است که در آن مهاجم، بجای وارد کردن دادههای عادی در فرمها، URL یا ورودیهای سایت، دستورهای SQL قرار میدهد تا کوئری اصلی برنامه تغییر کرده و پایگاهداده کاری را انجام دهد که مهاجم میخواهد.
این حمله معمولاً زمانی رخ میدهد که برنامهنویس:
-
ورودیها را فیلتر نکرده باشد
-
از کوئریهای پارامتری (Prepared Statement) استفاده نکرده باشد
-
از روشهای ناامن مانند اتصال مستقیم متغیرها در کوئری استفاده کرده باشد
🎯 یک مثال ساده از SQL Injection
فرض کنید سیستم لاگین سایت این کوئری را اجرا میکند:
مهاجم در قسمت username وارد میکند:
کوئری تبدیل میشود به:
نتیجه👇
🔓 بدون داشتن رمز عبور، ورود موفق انجام میشود.
🚨 چه خطراتی با SQL Injection ایجاد میشود؟
✔ دسترسی به اطلاعات دیتابیس
مثل ایمیلها، شمارهها، پسوردهای کاربران و…
✔ دور زدن ورود (Login Bypass)
مهاجم میتواند بدون رمز، وارد اکانت ادمین شود.
✔ حذف یا ویرایش اطلاعات
DROP TABLE، UPDATE، DELETE و…
✔ اجرای دستور روی سیستم (در برخی دیتابیسها)
مثلاً اجرای دستورات در MySQL با help of xp_cmdshell در MSSQL.
✔ استخراج مخفیانه اطلاعات
حتی بدون خطا! (روش Blind SQLi)
✔ آسیب مالی و اعتباری شدید برای کسبوکار
هک شدن دیتابیس = جریمه، شکایت، از دست رفتن اعتبار برند.
🧠 انواع حملات SQL Injection
1️⃣ In-band SQL Injection (مستقیم – رایجترین)
نتیجه حمله در همان صفحه نشان داده میشود.
-
Union-based SQLi
استفاده از UNION برای ترکیب نتایج دیتابیس -
Error-based SQLi
استفاده از خطاهای دیتابیس برای استخراج اطلاعات
2️⃣ Blind SQL Injection (کور)
اطلاعات آشکار نمایش داده نمیشود، اما با روشهای غیرمستقیم میتوان داده استخراج کرد.
-
Boolean-based
-
Time-based
3️⃣ Out-of-band SQL Injection (غیرمستقیم)
با ارسال داده به سرور دیگر (DNS/HTTP) اطلاعات استخراج میشود.
در شرایط خاص استفاده میشود و خطرناکترین نوع است.
🛡️ چگونه از SQL Injection جلوگیری کنیم؟
✔ 1. استفاده از Prepared Statement (ایمنترین روش)
مثال PHP – PDO:
مثال Python – SQLite:
مثال Node.js – MySQL2:
✔ 2. استفاده از ORM
فریمورکهایی مانند Laravel، Django، Spring Boot و…
بهصورت پیشفرض جلوی تزریق را میگیرند.
✔ 3. فیلتر و اعتبارسنجی ورودیها
-
حذف کاراکترهای حساس
-
محدود کردن نوع ورودی (اعداد، حروف خاص، Regex)
✔ 4. محدود کردن دسترسی یوزر دیتابیس
دنیا خراب نمیشود اگر MySQL User نتواند DROP TABLE بزند!
✔ 5. استفاده از Web Application Firewall (WAF)
Cloudflare – ModSecurity – F5
بهصورت خودکار بسیاری از تزریقها را مسدود میکنند.
🧪 نمونه حمله UNION-based SQL Injection
مثلاً URL سایت:
مهاجم تست میکند:
اگر صفحه اطلاعات نشان داد، یعنی سایت آسیبپذیر است و مهاجم میتواند:
-
نام جدولها
-
نام ستونها
-
اطلاعات کاربران
را پیدا کند.
🧾 چکلیست جلوگیری از SQL Injection
| مورد | توضیح |
|---|---|
| استفاده از Prepared Statements | مهمترین و بهترین روش |
| فیلتر ورودی | اعداد فقط عدد، متن محدود |
| استفاده از ORM | امنیت داخلی دارد |
| فعال کردن WAF | تشخیص اتوماتیک حملات |
| رمزنگاری پسوردها | بهصورت Hash شده |
| عدم نمایش خطا به کاربر | اطلاعات دیتابیس لو نرود |
| محدودیت سطح دسترسی DB | یوزر مجوز Drop/Delete نداشته باشد |
SQL Injection یکی از مخربترین حملات علیه وبسایتهاست که اگر جدی گرفته نشود، میتواند باعث از بین رفتن کامل دیتابیس، سرقت اطلاعات و دسترسی غیرمجاز مهاجمان شود.
با استفاده از کوئریهای پارامتری، فریمورکهای امن، اعتبارسنجی ورودی و فعالسازی WAF میتوان بهراحتی در برابر این حمله ایمن شد.



