فصل چهارم: پایگاه داده و امنیت

امنیت پایه: SQL Injection و XSS

جلوگیری از حملات رایج در PHP

SQL Injection یکی از خطرناک‌ترین آسیب‌پذیری‌های برنامه‌های وب است که در آن مهاجم با وارد کردن کد SQL در فیلدهای ورودی، کوئری اصلی برنامه را دستکاری می‌کند. هرگز نباید ورودی کاربر را مستقیماً داخل رشته‌ی کوئری قرار داد:

// روش نادرست و خطرناک
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";

راه‌حل درست استفاده از Prepared Statement در PDO است که پارامترها را جدا از متن کوئری ارسال می‌کند:

$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);
$user = $stmt->fetch();

حمله‌ی دوم که باید از آن آگاه باشید XSS یا Cross-Site Scripting است، جایی که مهاجم کد جاوااسکریپت مخرب را در ورودی سایت (مثلاً یک نظر یا کامنت) قرار می‌دهد و اگر آن ورودی بدون پردازش در صفحه نمایش داده شود، در مرورگر سایر کاربران اجرا می‌شود. راه مقابله ساده است: همیشه خروجی‌های متنی مرتبط با ورودی کاربر را با تابع htmlspecialchars() پردازش کنید:

echo htmlspecialchars($_POST['comment'], ENT_QUOTES, 'UTF-8');

این تابع کاراکترهایی مانند <، > و & را به معادل HTML آن‌ها تبدیل می‌کند تا مرورگر آن‌ها را به‌عنوان کد اجرا نکند. رعایت این دو اصل ساده، یعنی استفاده از Prepared Statement برای پایگاه‌داده و escape کردن خروجی‌ها، بخش بزرگی از حملات رایج وب را خنثی می‌کند.

برای ذخیره‌ی پیشرفت و شرکت در آزمون، وارد شوید — رایگان است.