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 معمولاً پارامتری نمی‌شوند. برای بخش‌های ساختاری از فهرست مجاز و ثابت استفاده کنید.

اصطلاحات مرتبط: کوئری، دیتابیس، او‌آر‌ام، تست امنیت ایستای نرم‌افزار، تست امنیت نرم‌افزار.