امنیت ورودیها همیشه نقطهضعف اپلیکیشنهاست. استفاده از prepared statements در PDO یک راهکار ساده و مؤثر برای جلوگیری از SQL Injection است.
ایدهٔ اصلی (مختصر)
با آمادهسازی کوئری و جدا کردن دادهها از ساختار SQL، هر ورودی بهعنوان داده تفسیر میشود نه دستور SQL. در نتیجه حتی ورودیهای مخرب اجرا نخواهند شد.
مثال شفاف
در این مثال یک اتصال PDO امن و نمونهٔ استفاده از پارامترهای نامدار را میبینید. دقت کنید که
نکات عملی و خطاهای رایج
- هرگز ورودیها را با string concatenation داخل کوئری قرار ندهید.
- از bindValue یا آرایهٔ execute برای ارسال پارامترها استفاده کنید.
- نوع داده را در صورت نیاز explicit کنید (مثلاً PDO::PARAM_INT).
- اتصال با
اگر تجربهای در مهاجرت از mysql_* یا mysqli به PDO دارید یا سوالی هست، خوشحال میشم بشنوم و بحث کنیم.
منبع: مستندات رسمی PHP — PDO Prepared Statements
🔖 #PHP #پی_اچ_پی #php #pdo #security #sql_injection #prepared_statements
👤 Developix
💎 Channel: @DevelopixPHP
ایدهٔ اصلی (مختصر)
با آمادهسازی کوئری و جدا کردن دادهها از ساختار SQL، هر ورودی بهعنوان داده تفسیر میشود نه دستور SQL. در نتیجه حتی ورودیهای مخرب اجرا نخواهند شد.
مثال شفاف
در این مثال یک اتصال PDO امن و نمونهٔ استفاده از پارامترهای نامدار را میبینید. دقت کنید که
PDO::ERRMODE_EXCEPTION روشن است تا خطاها واضح باشند.<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// INSERT امن با پارامتر نامدار
$stmt = $pdo->prepare('INSERT INTO users (email, name) VALUES (:email, :name)');
$stmt->execute([':email' => $email, ':name' => $name]);
// استفادهٔ مجدد برای SELECT
$select = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$select->execute([':email' => $email]);
$user = $select->fetch(PDO::FETCH_ASSOC);
?>
نکات عملی و خطاهای رایج
- هرگز ورودیها را با string concatenation داخل کوئری قرار ندهید.
- از bindValue یا آرایهٔ execute برای ارسال پارامترها استفاده کنید.
- نوع داده را در صورت نیاز explicit کنید (مثلاً PDO::PARAM_INT).
- اتصال با
charset=utf8mb4 و ERRMODE_EXCEPTION را فراموش نکنید.اگر تجربهای در مهاجرت از mysql_* یا mysqli به PDO دارید یا سوالی هست، خوشحال میشم بشنوم و بحث کنیم.
منبع: مستندات رسمی PHP — PDO Prepared Statements
🔖 #PHP #پی_اچ_پی #php #pdo #security #sql_injection #prepared_statements
👤 Developix
💎 Channel: @DevelopixPHP
👍1
یکی از سادهترین و مهمترین کارها برای امنکردن اپهای PHP اینه که مستقیم متغیرها رو نچسبونیم به Query و بهجاش از Prepared Statement با PDO استفاده کنیم. با این کار جلوی خیلی از SQL Injectionها گرفته میشه 🚫💉
فرض کنیم یه فرم لاگین ساده داریم. این روش 👇 ناامن و مستعد SQL Injection هست:
راه درست، استفاده از placeholder و bind کردن مقادیر هست. اینطوری PDO خودش مقادیر رو escape میکنه و بهعنوان دیتا با دیتابیس حرف میزنه، نه کد 👇
نکات مهم 🤝
• همیشه ERRMODE_EXCEPTION رو فعال کن تا خطاها رو از دست ندی.
• از named placeholder (مثل
• حتی برای مقدارهای عددی هم از 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
فرض کنیم یه فرم لاگین ساده داریم. این روش 👇 ناامن و مستعد 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
🔥3