نویسنده: الناز محبی
تاریخ انتشار: 31 می 2021 - بروز رسانی در تاریخ: 12 جولای 2026
0 935
حمله SQL Injection چیست و چطور جلوگیری کنیم؟

حمله SQL Injection چیست و چطور از آن جلوگیری کنیم؟

2 امتیاز

حمله SQL Injection یکی از قدیمی ترین و در عین حال رایج ترین و خطرناک ترین حملات وب است که سال هاست در صدر فهرست آسیب پذیری های بحرانی قرار دارد. در این حمله، مهاجم از یک نقطه ضعف ساده سواستفاده میکند: جایی که ورودی کاربر بدون بررسی، مستقیم وارد یک کوئری پایگاه داده میشود.

نتیجهٔ یک حملهٔ موفق میتواند فاجعه بار باشد؛ از سرقت اطلاعات کاربران و دور زدن صفحهٔ ورود، تا تغییر و حذف کل داده ها و حتی به دست گرفتن کنترل سرور. خبر خوب این است که با شناخت درست این حمله و رعایت چند اصل، جلوگیری از آن کاملا شدنی است.

در این راهنمای جامع، ابتدا می بینیم SQL Injection چیست و چطور کار میکند، سپس انواع آن را بررسی میکنیم، و در نهایت به مهم ترین بخش یعنی راهکارهای عملی جلوگیری میپردازیم. تمرکز این مقاله بر دفاع و ایمن سازی است، نه آموزش حمله.

این مقاله در یک نگاه
  • SQL Injection یعنی تزریق کد مخرب از طریق ورودی سایت به پایگاه داده ریشه اصلی حمله، اعتبارسنجی نشدن ورودی کاربر است مهم ترین دفاع: کوئری پارامتری، اعتبارسنجی ورودی و فایروال وب

حمله SQL Injection چیست و چطور کار میکند؟

پایگاه داده قلب بیشتر سایت ها و برنامه های تحت وب است و برای ارتباط با آن از زبانی به نام SQL استفاده میشود. وقتی کاربر مثلا نام کاربری و رمز خود را وارد میکند، برنامه یک کوئری SQL میسازد و آن را برای پایگاه داده میفرستد. مشکل زمانی شروع میشود که برنامه ورودی کاربر را بدون بررسی، مستقیم داخل این کوئری قرار دهد.

در این حالت، مهاجم به جای یک مقدار عادی، یک قطعه کد SQL وارد میکند که ساختار کوئری اصلی را تغییر میدهد. پایگاه داده نمیتواند بین کد برنامه و ورودی مخرب تمایز قائل شود و هر دو را اجرا میکند. نتیجه این است که مهاجم میتواند احراز هویت را دور بزند، داده های حساس را بخواند یا حتی رکوردها را تغییر دهد و حذف کند.

برای مقابلهٔ درست با این تهدید، این سه گام کلی را دنبال میکنید؛ در ادامه هر کدام را با جزئیات باز میکنیم.

1

حمله را بشناس

بفهم SQL Injection چطور از ورودی اعتبارسنجی نشده سواستفاده میکند و چه انواعی دارد.

2

نقاط ضعف را پیدا کن

همه ورودی های سایت مثل فرم ها، پارامترهای URL و کوکی ها را به عنوان نقطه ورود احتمالی بررسی کن.

3

لایه های دفاعی را برقرار کن

کوئری پارامتری، اعتبارسنجی ورودی، فایروال وب و حداقل سطح دسترسی را با هم به کار ببر.

حمله SQL Injection چیست و چطور از طریق فیلد ورودی روی پایگاه داده اجرا میشود

مسیر حمله SQL Injection: از ورودی مخرب مهاجم تا اجرای کوئری دستکاری شده روی پایگاه داده

یک مثال ساده و مفهومی

برای درک بهتر، یک صفحهٔ ورود ساده را تصور کنید. اگر برنامه ورودی کاربر را مستقیم به کوئری بچسباند، مهاجم میتواند به جای نام کاربری، عبارتی وارد کند که شرط کوئری را همیشه درست کند. در این حالت، شرط بررسی رمز عبور عملا بی اثر میشود و مهاجم بدون دانستن رمز وارد میشود.

نکتهٔ کلیدی این است که ریشهٔ مشکل، «اعتماد به ورودی کاربر» است. سایت فرض کرده کاربر یک نام کاربری معمولی وارد میکند، اما مهاجم به جای آن یک دستور تزریق کرده است. تمام راهکارهای دفاعی هم دقیقا حول همین محور میچرخند: هیچ وقت به ورودی کاربر اعتماد نکن و آن را به عنوان داده در نظر بگیر، نه بخشی از دستور.

انواع حملات SQL Injection

حملات تزریق SQL بسته به نحوهٔ دریافت نتیجه توسط مهاجم، به چند دستهٔ اصلی تقسیم میشوند. شناخت این دسته ها کمک میکند بدانید سایت شما در برابر چه چیزی باید محافظت شود.

سه دستهٔ اصلی حملات SQL Injection و زیرشاخه های رایج هر کدام

سه دستهٔ اصلی حملات SQL Injection و زیرشاخه های رایج هر کدام

تزریق درون باند (In-band)

این رایج ترین و ساده ترین نوع است که در آن مهاجم از همان کانالی که حمله را انجام میدهد، نتیجه را هم دریافت میکند. دو زیرشاخهٔ معروف دارد: نوع مبتنی بر خطا (Error-based) که در آن مهاجم از پیام های خطای پایگاه داده برای کشف ساختار آن استفاده میکند، و نوع مبتنی بر Union که با ترکیب نتایج، داده های جدول های دیگر را بیرون میکشد.

تزریق کور (Blind)

در این نوع، پایگاه داده نتیجه یا خطا را مستقیم به مهاجم نشان نمیدهد، اما مهاجم از رفتار سایت اطلاعات را استنتاج میکند. در نوع مبتنی بر شرط (Boolean)، مهاجم با مشاهدهٔ تغییر پاسخ سایت به شرط های درست و نادرست، اطلاعات را حدس میزند. در نوع مبتنی بر تاخیر (Time-based) هم با دستور دادن به پایگاه داده برای مکث، از زمان پاسخ نتیجه گیری میکند. این نوع کندتر اما همچنان خطرناک است.

تزریق برون باند (Out-of-band)

این نوع کمتر رایج است و زمانی استفاده میشود که روش های دیگر ممکن نباشند. در این حالت مهاجم داده ها را از طریق یک کانال جداگانه (مثلا یک درخواست شبکه به سرور خودش) دریافت میکند و به قابلیت های خاصی روی سرور پایگاه داده وابسته است.

خطرات و پیامدهای حمله SQL Injection

درک جدی بودن این حمله کمک میکند آن را در اولویت امنیتی قرار دهید. یک تزریق SQL موفق میتواند به چند شکل به کسب و کار شما آسیب بزند.

مهم ترین پیامد، سرقت داده های حساس است؛ اطلاعاتی مثل نام کاربری و رمز عبور، ایمیل، شماره کارت و داده های شخصی کاربران که هم به کاربران آسیب میزند و هم اعتبار شما را نابود میکند. پیامد دوم، دستکاری یا حذف داده هاست که میتواند کل پایگاه دادهٔ شما را تخریب کند. سوم، دور زدن احراز هویت و دسترسی مدیریتی است که به مهاجم کنترل بخش مدیریت سایت را میدهد. و در موارد شدید، مهاجم میتواند یک در پشتی (Backdoor) بسازد یا از سرور شما برای حملات گسترده تر استفاده کند.

به همین دلیل، جلوگیری از SQL Injection نباید یک کار فرعی در نظر گرفته شود؛ این یکی از پایه ای ترین اقدامات امنیتی برای هر سایتی است که با پایگاه داده کار میکند.

راهکارهای جلوگیری از SQL Injection

حالا به مهم ترین بخش میرسیم: چطور از سایت خود در برابر این حمله محافظت کنیم. دفاع موثر یک لایه ای نیست و از ترکیب چند اقدام به دست می آید. جدول و چک لیست زیر مهم ترین راهکارها را جمع بندی میکند.

شش اقدام کلیدی برای جلوگیری از حملات SQL Injection

شش اقدام کلیدی برای جلوگیری از حملات SQL Injection

کوئری پارامتری (Prepared Statements)

موثرترین و مهم ترین راهکار، استفاده از کوئری پارامتری یا همان Prepared Statements است. در این روش، به جای چسباندن مستقیم ورودی کاربر به متن کوئری، ساختار کوئری از داده جدا میشود و ورودی کاربر فقط به عنوان یک مقدار (پارامتر) به آن داده میشود. با این کار، پایگاه داده ورودی را همیشه به عنوان داده در نظر میگیرد، نه بخشی از دستور، و حتی اگر مهاجم کد تزریق کند، آن کد هرگز اجرا نمیشود.

تقریبا همهٔ زبان ها و فریمورک های مدرن از کوئری پارامتری پشتیبانی میکنند. اگر فقط یک اقدام قرار است انجام دهید، همین است؛ این روش به تنهایی جلوی اکثریت قاطع حملات تزریق را میگیرد.

تفاوت کوئری ناامن و کوئری پارامتری؛ جدا شدن دستور از داده جلوی تزریق را میگیرد

تفاوت کوئری ناامن و کوئری پارامتری؛ جدا شدن دستور از داده جلوی تزریق را میگیرد

اعتبارسنجی و پاکسازی ورودی

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

فایروال وب (WAF)

یک فایروال برنامهٔ وب مثل ModSecurity یا راهکارهای مشابه، درخواست ها را پیش از رسیدن به برنامهٔ شما بررسی میکند و الگوهای شناخته شدهٔ تزریق SQL را مسدود میکند. WAF یک لایهٔ دفاعی مهم است، مخصوصا برای سایت هایی که روی CMS آماده مثل وردپرس اجرا میشوند و نمیتوان تمام کد آن ها را بازنویسی کرد. البته WAF هم به تنهایی کافی نیست و باید در کنار روش های دیگر باشد. برای ایمن سازی کلی سرور هم میتوانید چک لیست امن سازی اولیهٔ سرور را دنبال کنید.

حداقل سطح دسترسی و به روزرسانی

کاربری که برنامهٔ شما با آن به پایگاه داده وصل میشود، باید فقط حداقل مجوزهای لازم را داشته باشد. اگر برنامه فقط به خواندن نیاز دارد، به آن مجوز حذف و تغییر ساختار ندهید؛ این کار دامنهٔ خسارت یک حملهٔ احتمالی را محدود میکند. علاوه بر این، به روز نگه داشتن سیستم مدیریت محتوا، افزونه ها و کتابخانه ها بسیار مهم است، چون بسیاری از آسیب پذیری های تزریق در نسخه های قدیمی نرم افزارها کشف و در نسخه های جدید وصله میشوند. اگر با وردپرس کار میکنید، مطلب جلوگیری از ترافیک ناخواسته هم به کاهش سطح حمله کمک میکند.

پایش، لاگ و مدیریت خطا

در نهایت، بررسی منظم لاگ ها کمک میکند تلاش های تزریق را زود تشخیص دهید و پیش از موفق شدن حمله واکنش نشان دهید. یک نکتهٔ مهم دیگر، مدیریت درست پیام های خطاست؛ پیام های خطای پایگاه داده را هرگز به کاربر نمایش ندهید، چون مهاجم از همین پیام ها برای کشف ساختار پایگاه داده استفاده میکند. به جای آن یک پیام خطای عمومی نشان دهید و جزئیات را فقط در لاگ سرور ثبت کنید.

جمع بندی راهکارها در یک نگاه

این جدول کمک میکند وضعیت سایت خود را سریع بسنجید و مطمئن شوید هیچ لایه ای را جا نینداخته اید.

راهکار نقش در دفاع
کوئری پارامتری مهم ترین لایه؛ جدا کردن دستور از داده
اعتبارسنجی ورودی بررسی نوع و قالب ورودی در سمت سرور
فایروال وب (WAF) مسدودسازی الگوهای تزریق پیش از برنامه
حداقل سطح دسترسی محدود کردن خسارت حملهٔ احتمالی
به روزرسانی مداوم بستن آسیب پذیری های شناخته شده
پایش و مدیریت خطا تشخیص زودهنگام و جلوگیری از افشای ساختار

جمع بندی: حمله SQL Injection از یک ضعف ساده یعنی اعتماد به ورودی اعتبارسنجی نشدهٔ کاربر سرچشمه میگیرد، اما پیامدهایش میتواند تا سرقت کامل داده ها و کنترل سرور پیش برود. مهم ترین دفاع، استفاده از کوئری پارامتری است که دستور را از داده جدا میکند و به تنهایی جلوی اکثر حملات را میگیرد.

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

اشتراک گذاری
+

حمله SQL Injection دقیقا چیست؟

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

+

مهم ترین راه جلوگیری از SQL Injection چیست؟

استفاده از کوئری پارامتری یا Prepared Statements. این روش ساختار کوئری را از داده جدا میکند، ورودی کاربر را همیشه به عنوان داده در نظر میگیرد و به تنهایی جلوی اکثریت قاطع حملات تزریق را میگیرد.

+

آیا فایروال وب به تنهایی برای جلوگیری کافی است؟

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

+

چرا نباید پیام خطای پایگاه داده را به کاربر نشان داد؟

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

+

آیا سایت های وردپرسی هم در معرض SQL Injection هستند؟

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

مقالات مرتبط این مطلب پیشنهاد می شود