SQL Injection چیست؟
حملهای که با تزریق کد SQL از طریق ورودی کاربر، مهاجم را قادر میکند Queryهای دلخواه روی دیتابیس اجرا کند — از خواندن داده محرمانه تا حذف کامل جدول.
چرا مهم است؟
SQL Injection سالهاست جزو معروفترین و مخربترین آسیبپذیریهای وب است؛ خوشبختانه با یک عادت ساده (Parameterized Query) تقریباً همیشه کاملاً قابل پیشگیری است.
تعریف
SQL Injection وقتی رخ میدهد که ورودی کاربر مستقیم داخل متن یک Query SQL الحاق (Concatenate) شود، بهجای اینکه بهعنوان پارامتر جدا از دستور فرستاده شود.
مثال آسیبپذیر
// ناامن — الحاق مستقیم رشته
var sql = $"SELECT * FROM Users WHERE Email = '{email}'";
اگر ورودی email برابر باشد با: x' OR '1'='1، Query نهایی همه کاربران را برمیگرداند، نه فقط یک نفر.
راهحل: Parameterized Query
var sql = "SELECT * FROM Users WHERE Email = @Email";
var users = await connection.QueryAsync<User>(sql, new { Email = email }); // Dapper
یا با EF Core (که بهصورت پیشفرض Parameterized است):
var user = await _context.Users.FirstOrDefaultAsync(u => u.Email == email);
اشتباه رایج
❌ فکر کردن که Escape کردن دستی کاراکترهای خاص (' → '') کافی است — این روش شکننده و ناقص است؛ همیشه از Parameterized Query یا ORM استفاده کنید، نه Escape دستی.
منبع و مطالعه بیشتر
خلاصه
SQL Injection از الحاق مستقیم ورودی کاربر در متن Query ناشی میشود و با Parameterized Query یا استفاده از ORM (EF Core/Dapper) تقریباً همیشه کاملاً قابل پیشگیری است. هرگز به Escape دستی کاراکتر تکیه نکنید. مرجع کامل: OWASP SQL Injection Prevention Cheat Sheet.
