SQL Injection یا تزریق SQL زمانی رخ میدهد که داده ورودی کاربر به جای پارامتر، به صورت بخشی از متن کوئری ساخته شود. این خطر فقط مختص PHP نیست و در هر زبانی که SQL را با اتصال رشتهها بسازند امکانپذیر است.
کد ناامن و دلیل خطر
# Unsafe: user-controlled data becomes SQL syntax
query = "SELECT id FROM users WHERE email = '" + email + "'"
cursor.execute(query)
روش امن در پایتون
cursor.execute('SELECT id FROM users WHERE email = ?', (email,))
روش امن در PHP با PDO
$stmt = $pdo->prepare('SELECT id FROM users WHERE email = :email');
$stmt->execute(['email' => $email]);
$user = $stmt->fetch();
روش امن در Go
row := db.QueryRowContext(ctx, "SELECT id FROM users WHERE email = ?", email)
var id int64
err := row.Scan(&id)
روش امن در ASP.NET Core
var user = await db.Users.SingleOrDefaultAsync(u => u.Email == email);
نکته فنی
کوئری پارامتری از تزریق مقدار جلوگیری میکند، اما نام ستون و ORDER BY معمولاً پارامتری نمیشوند. برای بخشهای ساختاری از فهرست مجاز و ثابت استفاده کنید.
اصطلاحات مرتبط: کوئری، دیتابیس، اوآرام، تست امنیت ایستای نرمافزار، تست امنیت نرمافزار.