فرض کنیم یه فرم لاگین ساده داریم. این روش 👇 ناامن و مستعد SQL Injection هست:
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$username = $_POST['username'];
$password = $_POST['password'];
// ❌ ناامن
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$stmt = $pdo->query($sql);
$user = $stmt->fetch();
راه درست، استفاده از placeholder و bind کردن مقادیر هست. اینطوری PDO خودش مقادیر رو escape میکنه و بهعنوان دیتا با دیتابیس حرف میزنه، نه کد 👇
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$username = $_POST['username'];
$password = $_POST['password'];
// ✅ امن با prepared statement
$sql = "SELECT * FROM users WHERE username = :username AND password = :password";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':username' => $username,
':password' => $password,
]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
نکات مهم 🤝
• همیشه ERRMODE_EXCEPTION رو فعال کن تا خطاها رو از دست ندی.
• از named placeholder (مثل
:username) استفاده کن تا کدت خواناتر بشه.• حتی برای مقدارهای عددی هم از prepared statement استفاده کن؛ به شرط «عددی بودن» دیتا برای Logic خودت اعتماد نکن.
این الگو رو توی همه Queryهایی که ورودی کاربر توشون استفاده میشه پیاده کن؛ لاگین، سرچ، فیلتر، پنل ادمین و… ✅
مستندات رسمی PDO و prepared statement:
https://www.php.net/manual/en/book.pdo.php
امروز توی یکی از بخشهای پروژهات این الگو رو جایگزین روش قدیمی کن و تفاوت تمیزی و امنیت کد رو ببین 😎
🔖 #PHP #پی_اچ_پی #PHP #PDO #Security #SQL_Injection #Best_Practices
👤 Developix
💎 Channel: @DevelopixPHP