SQL Injection چیست؟

نویسنده:

دسته:

تاریخ انتشار:


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

در این مقاله سعی می‌کنیم تا به‌صورت کامل به بررسی این نوع حملات وب بپردازیم و با اشاره به چند مثال رایج و مرسوم، نحوه انجام آن را  بیان کنیم. تا انتهای مقاله همراه ما باشید تا علاوه بر موضوعات ذکر شده نحوه مقابله با تزریق SQL را نیز بیاموزید.

معرفی SQL injection یا تزریق کد sql

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

یعنی هکر مانند یک کاربر معمولی وارد سایت شما شده و با ورود به بخش مثلا ثبت‌نام به‌جای نام، نام کاربری، رمز عبور و... کد‌های مخربی را وارد می‌کند. بر اساس برنامه‌ریزی و کد‌نویسی سایت، تمامی این ورودی‌های با فرض بر این که مقادیر صحیحی هستند در درون data base شما قرار گرفته و درنهایت باعث ایجاد اختلال در عملکرد و وقوع فاجعه می‌شود.

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

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

حملات SQL injection چطور اجرا می‌شوند؟

قبل از آنکه به چگونگی حملات تزریق SQL بپردازیم، باید بدانیم کوئری (QUERY) چیست و چه مفهومی دارد. کوئری SQL درخواست انجام عملی در پایگاه داده برنامه است. مدیر دیتابیس برای اجرای دستورات سیستم‌عامل از کوئری‌ها استفاده می‌کند. پارامترهای هر کوئری رکوردهای موردنظر کاربر را برمی‌گردانند. اما در حملات تزریق SQL، مهاجم با تزریق کد مخرب به فرم ورودی کوئری، از این دستورات به نفع خود سوء استفاده می‌کند.

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

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

انواع حملات SQL injection کدام‌اند؟

انواع حملات SQL injection را می‌توان به ۳ دسته تقسیم کرد:

  • SQLi در باند (کلاسیک)
  • SQLi استنتاجی (کور)
  • SQLi خارج از باند

می‌توانیم اینها را بر حسب روش‌هایی که برای دسترسی به داده‌های بک‌اند استفاده می‌کنند و پتانسیل آسیب‌رسانی آنها طبقه‌بندی کرد.

۱. SQLi در باند (کلاسیک)

در این حملات مهاجم از یک کانال ارتباطی برای اجرای حمله و جمع‌آوری نتایج استفاده می‌کند. این حمله دو نوع دارد؛

  • Error-based SQLi: در این حالت پایگاه داده پیغام خطا تولید می‌کند و این پیغام‌ها اطلاعات مورد نیاز درمورد ساختار پایگاه داده را جمع‌آوری می‌کند.
  • Union-based SQLi: در این تکنیک با استفاده از اپراتور UNION SQL چندین دستور انتخابی که پایگاه داده تولید کرده ترکیب می‌شوند تا یک پاسخ HTTP به‌دست آید. این پاسخ احتمالا حاوی داده‌های موردنظر مهاجم است.

۲. SQLi استنتاجی (کور)

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

  • حملات Boolean: در این نوع حملات مهاجم یک کوئری SQL به پایگاه داده می‌فرستد و از برنامه می‌خواهد نتیجه را برگرداند. بسته به درست یا نادرست بودن کوئری، نتیجه متفاوت است و بر اساس نتیجه، اطلاعات پاسخ HTTP تغییر می‌کند یا بی‌تغییر باقی می‌ماند. سپس مهاجم می‌تواند ببیند که آیا پیام ارسالی نتیجه درست یا نادرستی ایجاد کرده است.
  • حملات مبتنی بر زمان (Time-based): در این حملات مهاجم یک کوئری به دیتابیس می‌فرستد تا آن را برای چند ثانیه در حالت انتظار نگه دارد. سپس با توجه به زمان پاسخ دیتابیس، درست یا نادرست بودن کوئری را نتیجه می‌گیرد.

۳. SQLi خارج از باند

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

در صورت موفقیت‌آمیز بودن SQL injection چه اتفاقی خواهد افتاد؟

عواقب حملات sql injection چیست؟

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

در مواردی ممکن است تا با حملات شدید‌تر، منابع و زیرساخت‌های شرکت مانند سرور‌های آن تهدید شود و درنهایت یک حمله denial-of-service پایه‌ریزی گردد. دسترسی غیرمجاز به داده‌های حساس و امکان دست‌کاری یا حذف آن‌ها ابتدایی‌ترین کاری است که هکر می‌تواند انجام دهد، تا جایی که بسیاری از شرکت‌ها صدمات مالی و اعتباری زیادی از همین تزریق کدهای مخرب SQL در سال‌های اخیر متحمل شده‌اند.

اما بازهم کارهایی که هکر بعد از انجام موفقیت‌آمیز SQL injection می‌تواند انجام دهد به موارد بالا ختم نمی‌شود! گزارش‌هایی از حملات تزریق SQL وجود دارد که نشان می‌دهد خرابکاران در مواردی با ایجاد یک backdoor یا در پشتی می‌توانند تا مدت طولانی بدون جلب‌توجه به منابع مهم دسترسی داشته باشد و آن‌ها را زیر نظر بگیرد.

مثال‌هایی از تزریق کد‌های مخرب SQL

با بیان اینکه بر اساس شرایط مختلف مثال‌های متعددی از SQL injection وجود دارد و هکرها بر اساس دانش و خلاقیتی که به خرج می‌دهند می‌توانند حملات متنوعی را پایه‌ریزی کنند، در ادامه به معرفی 5 مورد از رایج‌ترین مثال‌های تزریق کد SQL می‌پردازیم.

  1. بازیابی داده‌های مخفی، جایی که می‌توان پرس‌وجوهای SQL را برای بازیابی داده‌های پنهان تغییر داد.
  2. از کار انداختن منطق برنامه، زمانی که می‌توان با تغییر کد‌ها در منطق اپلیکیشن مداخله کرد.
  3. حملات union، منجر به بازیابی داده‌ها از پایگاه‌داده‌های مختلف می‌شود.
  4. استخراج اطلاعات دیتابیس، موجب استخراج اطلاعات پایگاه‌داده مانند ورژن و ساختار آن خواهد شد.
  5. تزریق کور SQL، نتایج queryهایی که مدیریت می‌شوند ازطریق اپلیکیشن پاسخ داده نمی‌شوند.

برای مطالعه بیشتر مقاله امنیت شبکه چیست؟ را پیشنهاد می کنیم.

بازیابی داده‌های مخفی یا Retrieving hidden data

برای مثال یک برنامه فروشگاهی را در نظر بگیرید که محصولات مختلفی را در دسته‌بندی‌های متنوع در اختیار کاربران قرار می‌دهد. زمانی که یک کاربر روی دسته‌بندی هدایا کلیک می‌کند، URL زیر به دیتابیس ارسال خواهد شد.

https://insecure-website.com/products?category=Gifts

این URL باعث تولید یک پرس‌وجو SQL از پایگاه‌داده برای نمایش اطلاعات مربوط به محصولات موردنظر می‌شود که SQL query آن به‌صورت زیر است.

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

اگر بخواهیم این کوری را تفسیر کنیم نتیجه چیزی شبیه به “ تمامی داده‌ها را از جدول محصولات قسمت هدایا که مقدار released آن برابر یک است (منتشر شده است) را برگردان “ خواهد بود. اگر دقت کنید قطعه کد released = 1 برای نمایش ندادن محصولات یا بهتر است بگوییم هدایایی که منتشر نشده است، استفاده می‌شود.

از‌این‌رو اگر هیچ خط دفاعی در برابر SQL injection وجود نداشته باشد، هکر می‌تواند با استفاده از درخواست

--'https://insecure-website.com/products?category=Gifts

که نتیجه

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

را برخواهد گرداند، می‌تواند تمامی محصولات ازجمله آن‌هایی که حتی منتشر نشده‌اند را نیز ببیند. نکته کلیدی در این جا '--' یا double-dash است که یک نشانگر SQL بوده و به این معنی است که بقیه پرس‌وجو به‌عنوان یک comment تفسیر خواهد شد. پس به‌صورت مؤثر بقیه کوری حذف شده (released = 1) و درنهایت تمامی هدایا ازجمله محصولات منتشر نشده نیز نمایش داده می‌شود.

همچنین با قطعه کدی مانند:

--https://insecure-website.com/products?category=Gifts'+OR+1=1

hacker باعث می‌شود تا تمامی دسته‌بندی محصولات توسط برنامه به تصویر کشیده شود. پرس‌وجو حاصل از URL بالا قطعه کد زیر است.

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

تفسیر این SQL، برگرداندن محصولات دسته‌بندی هدایا و تمامی محصولاتی که یک برابر یک است بوده و چون همواره 1 = 1 است، باید انتظار نمایش دادن همه محصولات توسط برنامه فروشگاهی را داشته باشیم.

برای آشنایی بیشتر مقاله حملات مهندسی اجتماعی چیست؟ را ازدست ندهید.

ازکارانداختن منطق برنامه یا Subverting application logic

در برنامه‌هایی که کاربران می‌توانند با استفاده از نام کاربری و رمز عبور وارد داشبورد خود شوند، اگر username مانند “ سهند “ و پسوردی مانند “ 123456 “ را وارد کنیم درخواست زیر ارسال خواهد شد.

' AND password = '123456 'سهند' = SELECT * FROM users WHERE username

اگر این پرس‌وجوی SQL پاسخی را برگرداند، درنتیجه عملیات لاگین شدن موفقیت‌آمیز بوده و در غیر این صورت درخواست ورود رد می‌شود. اما اگر خرابکار مانند مثال قبل باز از '--' یا double-dash استفاده کند، به‌راحتی و بدون هیچ رمز عبوری می‌تواند با هر نام کاربری وارد شود. برای مثال در فیلد username با واردکردن مقدار '--administrator و خالی قراردادن فیلد password درخواست

' ' =SELECT * FROM users WHERE username = 'administrator '--' AND password

را به دیتابیس ارسال می‌کند. '--' باعث تفسیر نشدن قسمت پسورد و درنهایت واردشدن به‌حساب کاربری مذکور بدون واردکردن رمز عبور می‌شود.

حملات union یا UNION attacks

این مثال از SQL injection در مواردی رخ می‌دهد که نتایج حاصل از پرس‌وجوهای SQL در داخل پاسخ‌های برنامه برگردانده می‌شود. به‌موجب آن، حمله‌کننده می‌تواند به جداول دیگر در داخل پایگاه‌داده دسترسی پیدا کند. این کار با استفاده از کلمه UNION انجام می‌گیرد که با قراردادن آن در ابتدای درخواست باعث اجرا شدن یک کوری Select اضافی و درنهایت اضافه‌شدن نتایج به پرس‌وجوی اصلی می‌شود.

برای مثال اگر کد SQL

'SELECT name, description FROM products WHERE category = 'Gifts

توسط اپلیکیشن به‌منظور پاسخ به درخواست کاربر اجرا شود، پس هکر می‌تواند با قراردادن SQL query

--UNION SELECT username, password FROM users'

باعث ارسال شدن تمامی usernames و پسورد‌ها در ادامه داده‌های مربوط به محصولات توسط خود برنامه شود.

استخراج اطلاعات دیتابیس یا Examining the database

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

SELECT * FROM v$version

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

SELECT * FROM information_schema.tables

تزریق کور یا Blind SQL injection

بسیاری از نمونه‌های SQL injection آسیب‌پذیری‌های blind یا کور هستند. یعنی اپلیکیشن نتایج پرس‌وجوهای SQL  یا هر داده مربوط به خطای پایگاه‌داده را در داخل پاسخ‌ها برنمی‌گرداند. آسیب‌پذیری‌های کور همچنین می‌تواند باعث سوءاستفاده از اطلاعات غیرمجاز شود اما برای پیاده‌سازی آن نیاز به اجرای تکنیک‌های پیچیده و دشواری است.

چگونه نقاط ضعف SQL injection را می‌توان شناسایی کرد؟

با استفاده از نرم‌افزار‌های web vulnerability scanner می‌توان اکثریت آسیب‌پذیری‌ها و نقاط ضعف تزریق SQL را شناسایی کرد. همچنین به‌صورت دستی و با استفاده از واردکردن مجموعه‌ای سیستماتیک از تست‌ها در برابر هر نقطه ورود از برنامه نیز این کار انجام خواهد شد. این مجموعه سیستماتیک (systematic یا بر اساس قاعده‌ و نظمی خاص) از تست‌ها شامل:

  • ارسال کاراکتر نقل‌قول واحد ' و گوش‌دادن به خطاها و دیگر ناهنجاری‌ها
  • واردکردن برخی سینتکس خاص از SQL که مقادیر پایه و اصلی نقطه ورود را در کنار مقادیر مختلف ارزیابی می‌کند و سپس گوش‌دادن به تفاوت بین نتایج حاصل از پاسخ‌های برنامه
  • ارسال کاندیشن‌های بولی مانند OR 1=1 و OR 1=2 و درنهایت نظارت بر پاسخ‌های ارسالی توسط اپلیکیشن
  • واردکردن playloadهای خاصی که برای ایجاد تاخیر زمانی موقع اجرا در داخل پرس‌وجوهای SQL طراحی شده‌اند و نظارت بر تایمی که طول می‌کشد تا پاسخ داده شود.
  • واردکردن playloadهای OAST که به‌منظور ایجاد تعامل با شبکه، در پهنای باند خارج از network، موقع اجرا در داخل SQL query طراحی شده‌اند و نظارت بر تمامی اتفاقاتی که رخ خواهد داد.

بررسی مرتبه دوم تزریق SQL

حال که با SQL injection آشنا شدیم، می‌توان گفت که به‌سادگی هر توسعه‌دهنده سایتی با آگاه بودن از آسیب‌پذیری‌های تزریق SQL می‌تواند ورودی‌های اولیه را با خیال راحت مدیریت کند تا مشکلی رخ ندهد. در این موقع است که از تزریق کد‌های مخرب SQL مرتبه دوم (با نام stored SQL injection نیز شناخته می‌شود) برای رخنه به پایگاه‌ داده توسط هکر‌ها استفاده می‌شود. یعنی درست در زمانی که خرابکار می‌داند دولوپر از آسیب‌پذیری‌ها آگاه است.

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

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

HSTS چیست؟ برای اطلاعات کامل تر می توانید مقاله مورد نظر را مطالعه نمایید.

بهترین استراتژی‌های جلوگیری از حملات SQL Injection

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

۱. اعتبارسنجی ورودی‌های کاربران

ایده اصلی این روش در مرحله اول تعیین حیاتی‌ترین عبارات SQL و ایجاد یک لیست مجاز برای تمام عبارات قابل قبول است. به همین راحتی می‌توان حساب‌های تاییدنشده را کنار گذاشت. اگرچه این استراتژی به‌خودی‌خود جلوی نفوذ هکرهای تزریق SQL را نمی‌گیرد، یک لایه حفاظتی برای جمع‌آوری داده در حملات تزریق فراهم می‌کند.

۲. محدودیت استفاده از برخی کاراکترهای خاص

مجرمان تزریق SQL قادرند از یک‌سری الگوهای کاراکتری منحصر‌به‌فرد برای حمله به پایگاه داده استفاده کنند. از این‌رو یکی از بهترین راه‌ها برای جلوگیری از این حملات، پاک‌کردن داده‌ها و جلوگیری از ترکیب رشته‌هاست.

۳. عدم استفاده از SQL پویا

ورودی‌های کاربر را مستقیما در دستورات SQL قرار ندهید. در عوض از عبارات آماده و کوئری‌های پارامتری استفاده کنید که به مراتب امن‌ترند. رویه‌های ذخیره‌شده در دیتابیس معمولا نسبت به SQL پویا از امنیت بیشتری برخوردارند.

۴. قرار ندادن داده‌های حساس در متون ساده

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

۵. محدود کردن مجوزها و امتیازات پایگاه داده

به‌عنوان مدیر پایگاه داده، قابلیت‌های در دسترس کاربران را روی حداقل اقدامات لازم تنظیم کنید تا دسترسی مهاجم در صورت وقوع حمله محدودتر باشد.

۶. عدم نمایش مستقیم خطاهای پایگاه داده به کاربر

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

۷. استفاده از یک راه حل تست امنیت اپلیکیشن

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

۸. به‌روزرسانی پایگاه داده

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

چگونه می‌توان از SQL injection جلوگیری کرد؟

بسیاری از حملات مربوط به تزریق کدهای مخرب SQL را می‌توان با استفاده از پرس‌وجوهای پارامتر شده یا parameterized queries به‌جای رشته‌های اولیه، دفع کرد. برای مثال قطعه کد زیر در برابر sql injection آسیب‌پذیر است زیرا که ورودی کاربر مستقیما به پرس‌وجو متصل می‌شود.

; "'" + String query = "SELECT * FROM products WHERE category = '"+ input

;()Statement statement = connection.createStatement

;ResultSet resultSet = statement.executeQuery(query)

اما به‌سادگی می‌توان با استفاده از رشته کد زیر ارتباط مستقیم میان ورودی کاربر و ساختار query را از بین برد.

;PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?")

;statement.setString(1, input)

;()ResultSet resultSet = statement.executeQuery

کوری‌های Parameterized را می‌توان در هر وضعیتی که ممکن است ورودی غیرقابل‌اعتماد به‌عنوان داده ظاهر و از آن در داخل پرس‌وجوهای استفاده شود، به کار برد. اما باید اشاره کرد که نمی‌توان از آن‌ها برای رسیدگی به ورودی‌های نامعتبر در بخش‌های دیگر query مانند جداول و نام ستون‌ها بهره برد.

اپلیکیشنی که با گذاشتن داده‌های نامعتبر در بخش‌هایی از کوری یا پرس‌وجوهای عمل می‌کند، نیاز به یک رویکرد متفاوت (مانند استفاده از منطقی جدید در هنگام مواجه با داده‌ها یا استفاده از یک لیست برای مقادیر ورودی مجاز) دارد. به این نکته نیز دقت کنید که برای موثر بودن پرس‌وجو‌های پارامتر شده باید از رشته‌های hard-coded ثابت استفاده کرد و هرگز نباید شامل داده‌های متغیر از مبدأهای مختلف باشد.

مقاله بد افزار چیست را مطالعه کنید.

جمع‌بندی

SQL injection یکی از رایج‌ترین تکنیک‌ها برای بازیابی داده‌های حساس و دسترسی به مکان‌های غیرمجاز است که همواره سایت‌ها و برنامه‌های تحت وب را تهدید می‌کند. در این نوع روش اشاره شد که خرابکار با سوءاستفاده از برخی دستورهای مربوط به SQL باعث می‌شود تا روند معمولی پردازش پایگاه‌داده را مختل کند و در نتیجه از اختلال به وجود آمده برای استخراج و بازیابی dataهایی مانند شماره کارت، رمز عبور، اطلاعات حساب و... بهره ببرد.

در این مقاله سعی کردیم تا حالات مختلفی از تزریق کدهای مخرب Sql را بررسی کنیم و اشاره‌ای به راهکارهای مقابله با آن داشته باشیم. امید است تا مطالعه این محتوا برای شما عزیزان مفید بوده باشد.

سوالات متداول

SQL Injection چیست؟

SQL Injection یک حمله است که به هکر این امکان را می‌دهد که دستورات SQL را به طور غیرمجاز به پایگاه داده وارد کند و داده‌ها را تغییر دهد، حذف کند یا به اطلاعات حساس دسترسی پیدا کند.

چطور می‌توان از SQL Injection جلوگیری کرد؟

استفاده از Prepared Statements یا Stored Procedures
فیلتر کردن ورودی‌ها (Sanitization)
استفاده از اصول کمترین دسترسی (Least Privilege) در پایگاه داده
اجتناب از استفاده مستقیم از ورودی‌های کاربر در دستورات SQL
استفاده از ORM (Object-Relational Mapping)

آیا SQL Injection فقط بر روی دیتابیس‌های رابطه‌ای تأثیر می‌گذارد؟

خیر، هر پایگاه داده‌ای که از SQL برای تعامل با داده‌ها استفاده می‌کند (مانند MySQL، PostgreSQL، Oracle و MSSQL) می‌تواند مستعد حملات SQL Injection باشد.

آیا فقط هکرها از SQL Injection استفاده می‌کنند؟

نه، گاهی اوقات مهاجمین اخلاقی (که به عنوان تست‌کننده‌های امنیتی شناخته می‌شوند) ممکن است از تکنیک SQL Injection برای شناسایی آسیب‌پذیری‌ها و کمک به رفع آنها استفاده کنند.

Comment (1)

  • Maryam Tahouri Reply

    perfekt

    22 خرداد 1403 at 10:55 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


مقالات مرتبط

لاگ چیست؟ آشنایی با انواع و مدیریت لاگ

لاگ چیست؟ معرفی انواع لاگ

عیب یابی سیستم‌های کامپیوتری وقتی می‌تواند به خوبی و سادگی انجام شود که بدانید دقیقا چه اتفاقاتی در سیستم رخ...

پروتکل Server Message Block

SMB چیست؟ آشنایی با پروتکل Server Message Block

ساخت یک شبکه کوچک خانگی یا شبکه‌های بزرگ سازمانی و بیزینسی، امروزه بدون نیاز به اینترنت و به کمک شبکه‌های...

عکس نوشته: وصله امنیتی چیست؟

وصله امنیتی چیست؟ (Patch امنیتی)

سیستم‌های کامپیوتری، موبایلی و... از ابزارهای مختلفی برای ارائه امنیت و حفظ آن استفاده می‌کنند. یکی از این موارد، وصله‌های...