آموزش رایگان PHP

راهنمای جامع جلوگیری از SQL Injection در PHP (طبق استانداردهای گوگل)

1405/05/13 21:19 محراب حسن زاده
راهنمای جامع جلوگیری از SQL Injection در PHP (طبق استانداردهای گوگل)

حمله SQL Injection چیست و چرا رخ می‌دهد؟

حمله تزریق کد اس‌کیوال یا SQL Injection (SQLi) یکی از قدیمی‌ترین و در عین حال خطرناک‌ترین آسیب‌پذیری‌های وب است. این آسیب‌پذیری زمانی رخ می‌دهد که داده‌های وارد شده توسط کاربر، بدون اعتبارسنجی یا فیلترسازی مناسب، مستقیماً با دستورات SQL ترکیب شده و توسط پایگاه داده اجرا شوند. در این حالت، مهاجم می‌تواند دستورات دلخواه خود را به پایگاه داده تزریق کرده و به اطلاعات حساس دسترسی پیدا کند، آن‌ها را تغییر دهد یا حتی کل دیتابیس را حذف کند.

کد ناامن: ریشه اصلی مشکل

بسیاری از برنامه‌نویسان تازه‌کار (و حتی گاهی باسابقه) اقدام به الحاق مستقیم متغیرها به رشته‌های SQL می‌کنند. کد زیر نمونه بارز یک فاجعه امنیتی است:

// یک مثال کاملاً ناامن و آسیب‌پذیر
$username = $_POST["username"];
$password = $_POST["password"];

$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);

اگر نفوذگر در فیلد نام کاربری عبارت admin' OR '1'='1 را وارد کند، کوئری نهایی به شکل زیر در می‌آید که همواره صحیح بوده و بدون نیاز به رمز عبور، دسترسی ادمین را به هکر می‌دهد!

راهکار استاندارد گوگل: استفاده از Prepared Statements

گوگل در راهنماهای امنیتی خود تاکید می‌کند که هرگز نباید داده‌های کاربر را به طور مستقیم با دستورات SQL ادغام کرد. بهترین، استانداردترین و امن‌ترین راهکار برای جلوگیری از SQL Injection در PHP، استفاده از Prepared Statements (دستورات آماده) از طریق کتابخانه PDO یا MySQLi است.

چرا Prepared Statements امن است؟

در این روش، ساختار کوئری ابتدا به پایگاه داده فرستاده و کامپایل می‌شود. سپس داده‌های کاربر به صورت جداگانه (پارامترهای بایند شده) ارسال می‌گردند. دیتابیس متغیرهای ورودی را صرفاً به عنوان دیتای خام پردازش می‌کند، نه بخشی از دستور پایگاه داده؛ بنابراین امکان اجرای کدهای مخرب کاملاً از بین می‌رود.

پیاده‌سازی امن با PDO (توصیه شده)

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

// اتصال امن با PDO و تنظیم حالت خطا
try {
    $pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8mb4", "user", "pass");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    // تعریف کوئری با Placeholder
    $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = :username");
    
    // بایند کردن و اجرا
    $stmt->execute([
        'username' => $_POST['username']
    ]);
    
    $user = $stmt->fetch();
} catch (PDOException $e) {
    // نمایش ندادن خطای واقعی به کاربر جهت حفظ امنیت
    error_log($e->getMessage());
    die("خطایی در سیستم رخ داده است.");
}

چند نکته طلایی از استانداردهای امنیتی گوگل

  • غیرفعال کردن Emulate Prepares: در تنظیمات PDO، شبیه‌ساز Prepared Statements را غیرفعال کنید (PDO::ATTR_EMULATE_PREPARES => false) تا مطمئن شوید پایگاه داده به صورت واقعی کوئری‌ها را تفکیک می‌کند.
  • اصل حداقل دسترسی (Least Privilege): کاربری که اپلیکیشن شما با آن به دیتابیس وصل می‌شود، باید فقط دسترسی‌های مورد نیاز خود (مانند SELECT و INSERT) را داشته باشد، نه دسترسی‌های مدیریتی نظیر DROP TABLE.
  • اعتبارسنجی و فیلترینگ ورودی‌ها: علاوه بر لایه پایگاه داده، همیشه ورودی‌های کاربر را با توابعی نظیر filter_var() در PHP اعتبارسنجی کنید.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش جامع Session در PHP به زبان ساده + پروژه عملی شبیه‌ساز
1405/05/01 20:07

آموزش جامع Session در PHP به زبان ساده + پروژه عملی شبیه‌ساز

مطالعه بیشتر
آموزش تگ‌های پیوندی و اتصالی در HTML: ایجاد لینک‌های داخلی و خارجی
1402/05/29 21:03

آموزش تگ‌های پیوندی و اتصالی در HTML: ایجاد لینک‌های داخلی و خارجی

مطالعه بیشتر
درک Props و انتقال داده‌ها بین کامپوننت‌ها در Vue.js | آموزش کاربردی
1404/09/24 20:16

درک Props و انتقال داده‌ها بین کامپوننت‌ها در Vue.js | آموزش کاربردی

مطالعه بیشتر
آموزش جامع و اصولی جستجو در دیتابیس با PHP و MySQL (مطابق استانداردهای گوگل)
1405/05/13 21:26

آموزش جامع و اصولی جستجو در دیتابیس با PHP و MySQL (مطابق استانداردهای گوگل)

مطالعه بیشتر
آموزش جامع کار با فرم‌ها در PHP (امنیت و اعتبارسنجی طبق استاندارد گوگل)
1405/04/27 22:01

آموزش جامع کار با فرم‌ها در PHP (امنیت و اعتبارسنجی طبق استاندارد گوگل)

مطالعه بیشتر
آموزش کامل دریافت اطلاعات فرم با متدهای GET و POST در PHP (با رعایت اصول امنیتی)
1405/04/27 22:06

آموزش کامل دریافت اطلاعات فرم با متدهای GET و POST در PHP (با رعایت اصول امنیتی)

مطالعه بیشتر
آموزش گام به گام طراحی مگا منو (Mega Menu) مدرن با CSS و HTML
1405/03/13 23:44

آموزش گام به گام طراحی مگا منو (Mega Menu) مدرن با CSS و HTML

مطالعه بیشتر
آموزش کامل عملگرهای منطقی در PHP (همراه با تفاوت‌های کلیدی)
1405/04/03 23:56

آموزش کامل عملگرهای منطقی در PHP (همراه با تفاوت‌های کلیدی)

مطالعه بیشتر
آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی
1405/05/01 20:28

آموزش کامل include و require در PHP + تفاوت‌های کلیدی و کاربردی

مطالعه بیشتر
مفاهیم Promise و چگونگی استفاده از آن در جاوا اسکریپت: راهنمای کامل همراه با مثال‌ها
1403/07/30 20:38

مفاهیم Promise و چگونگی استفاده از آن در جاوا اسکریپت: راهنمای کامل همراه با مثال‌ها

مطالعه بیشتر
آموزش CSS Transform و Transition: تبدیل‌ها و ایجاد تغییرات ظاهری پویا
1402/06/10 18:32

آموزش CSS Transform و Transition: تبدیل‌ها و ایجاد تغییرات ظاهری پویا

مطالعه بیشتر
آموزش کامل ساخت فرم در HTML: از المان‌ها تا نکات سئو
1402/05/21 23:48

آموزش کامل ساخت فرم در HTML: از المان‌ها تا نکات سئو

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد