تزریق SQL (SQL Injection)
«تزریق SQL» حمله واردکردن کد مخرب داخل کوئری است. مهاجم ورودی فرم را دستکاری می کند. سپس کوئری عوض می شود و داده ها لو می روند. پس باید ورودی ها را همیشه امن کنیم.
تزریق SQL چیست؟
تزریق SQL یعنی گذاشتن عبارت های مخرب داخل کوئری. کوئری همان دستور گفتگو با دیتابیس است. اگر ورودی خام باشد، مهاجم شرط های همیشه-درست می گذارد و همه ردیف ها برمی گردند.
ترفند OR 1=1 همیشه درست
کاربر به جای شناسه، می نویسد 105 OR 1=1. آنگاه کل جدول برمی گردد.
SELECT *
FROM Users
WHERE UserId = 105 OR 1 = 1;
SELECT UserId, Name, Password
FROM Users
WHERE UserId = 105 OR 1 = 1;
ترفند ""="" همیشه درست
مهاجم داخل نام کاربری یا رمز می نویسد " OR ""="". شرط ها همیشه درست می شوند.
SELECT *
FROM Users
WHERE Name = "" OR "" = ""
AND Pass = "" OR "" = "";
تزریق با چند دستور پشت سرهم
بعضی پایگاه ها چند دستور را با سمی کالن می پذیرند. مهاجم می تواند بعد از SELECT دستور مخرب بگذارد.
SELECT *
FROM Users;
DROP TABLE Suppliers;
SELECT *
FROM Users
WHERE UserId = 105;
DROP TABLE Suppliers;
چطور جلوی تزریق SQL را بگیریم؟
پارامترسازی را استفاده کن. پارامتر یعنی مقدار ورودی جدا از متن کوئری. موتور SQL پارامتر را literal می بیند، نه کد. همچنین اعتبارسنجی نوع و طول انجام بده. در نهایت کمینه دسترسی ها را رعایت کن.
هشدار: هیچ وقت ورودی خام را در رشته کوئری نچسبان. برای مطالعه نماها و گزارش سازی امن، نما در SQL را ببین. برای بهبود سرعت و ایمنی کوئری ها، ایندکس هم مهم است. همچنین کار با تاریخ ها را در تاریخ ها تمرین کن.
تمرین سه گام
- یک فرم ساختگی بساز و ورودی را لاگ کن.
- ورودی خطرناک مثل
OR 1=1را امتحان کن. - پارامترسازی را فعال کن و نتیجه را مقایسه کن.
جمع بندی سریع
- تزریق SQL یعنی ورودی، کوئری را می شکند.
- OR 1=1 همه چیز را برمی گرداند.
- چنددستوری بودن، خطر حذف جدول دارد.
- پارامترسازی، راه حل اصلی و امن است.