تزریق SQL نوعی از حملات تزریق کد به وب سایت است و تکنیکی است برای سوء استفاده از آسیب پذیری های ورودی های اعتبار سازی نشده، تا دستورات SQL را از میان یک web application برای اجرا توسط یک پایگاه داده گذر دهد. این حمله همچنین کاربردهای تحت وب را تهدید کرده و موجب دسترسی غیرمجاز به اطلاعات موجود در پایگاه داده می شود.
نوعی از حملات وب است و به این صورت است که هکر با اجرای یک سری دستورات مخرب، عملیاتی را روی پایگاه داده آسیب پذیر انجام می دهد. در این نوع حمله، نفوذگر از نقص های برنامه نویسی و امنیتی ای که در سایت یا نرم افزار وجود دارد، سوء استفاده کرده و در واقع این نوع سایت ها و نرم افزارها هدف بسیاری از حمله کننده ها برای دستیابی به اطلاعات یک پایگاه داده خواهند بود. پرس و جوهای معمول دارای بخش های مختلفی هستند که حملات تزریق SQL فقط در بخش شرطی Where اتفاق می افتد.
حمله تزریق SQL به راحتی داده های مهم موجود در پایگاه داده را افشاء کرده و هم چنین می تواند موارد دلخواه خود را به پایگاه داده اضافه کند و یا از آن حذف کند.
این حمله زمانی اتفاق می افتد که اپلیکیشن، داده هایی که توسط هکر دریافت می کند را بدون اعتبارسنجی و پاک سازی، پردازش می کند. در بدترین حالت هکر می تواند کنترل سروری که پایگاه داده را میزبانی می کند به دست بگیرد. اثر این حمله به عواملی مانند اینکه آسیب پذیری در کجای کد رخ داده، آسیب پذیری چقدر کار هکر را آسان کرده و اینکه تا چه سطحی دسترسی به پایگاه داده را به دست گرفته، بستگی دارد. هدف اصلی این حملات، داده های ساکن در یک پایگاه داده است که از طریق Firewall محافظت می شوند.
روش های مقابله با این حمله
برای جلوگیری از این حمله، برنامه نویس تحت وب بایستی نسبت به نحوه عملکرد آن آگاه باشد، در این صورت به راحتی می تواند از آن جلوگیری کند. روش های جلوگیری از این حمله عبارتند از:
1. Parameterization queries (پارامتری کردن پرس و جوها): برای جلوگیری از به وجود آمدن باگ، برنامه نویس می بایست از Queryهای پارامتر شده استفاده کند. این بدین معناست که در آن Queryها یکبار بدون داشتن متغیر به سرور پایگاه داده ارسال شوند و در مرحله بعد متغیرها به صورت جداگانه و یکی یکی ارسال شوند، که این موجب افزایش امنیت و سرعت کار با پایگاه داده می شود، زیرا متغیرهای ما طبق معمول به صورت مستقیم در دستور SQL که می فرستیم قرار نگرفته و به صورت جداگانه ارسال می شوند، بنابراین هکر نمی تواند به Query ما دستوری اضافه کند.
2. Stored Procedure: تا حد امکان از روش های ذخیره شده استفاده کنیم. یک قسمتی از بانک اطلاعاتی SQL Server است که می توان در آنها از دستورات Select، Insert، Delete و ... استفاده کرد و با استفاده از پارامترهای ورودی یا خروجی می توان اطلاعاتی از آنها دریافت کرد و یا به آنها داد.
3. Escaping User Input: تمام اطلاعاتی که توسط کاربر وارد می شود را Scape کنیم، یعنی به طور مثال اگر کاربر <script> را وارد کرد، این کلمه تبدیل به ⁢script> شود که کاملا به صورت string باشد.
4. Least privilege: به معنی کاهش اثر تزریق کد از طریق اعطای امتیاز کمتر به کاربران پایگاه داده است. به عنوان مثال به کاربران حق دسترسی read، view و ... بدهیم.
5. White List Input Validation: به معنای تعریف دقیق ورودی های معتبر، اعتبارسنجی آنها قبل از فرستادن به Query، ایجاد ساختار اعتبارسنجی برای ورودی هایی که فرمت خاصی دارند، مانند ایمیل و تاریخ، استفاده از توابع اعتبارسنجی ابزار ESAPI مانند getValidData()، getValidInput، getValidFileName و...
هنگام طراحی سایت بهتر است اطلاعات حیاتی مانند رمز عبور، شماره کارت اعتباری و... به صورت متن ساده یا Plain Text ذخیره نشوند و به صورت هش شده و رمزنگاری در پایگاه داده ذخیره شوند که اگر به هر طریقی وب سایت مورد حمله قرار گرفت، هکر قادر به دستیابی به آن ها نباشد. برای این منظور بهتر است از پسوردهای قوی استفاده شود، مرتبا آسیب پذیری ها چک شود، وب سایت ها با کدها و Applicationهای جدید بروز رسانی شود.