آموزش رایگان 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 اعتبارسنجی کنید.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش Pseudo-classes در CSS: تغییر استایل عناصر با hover، focus و nth-child
1402/06/10 18:22

آموزش Pseudo-classes در CSS: تغییر استایل عناصر با hover، focus و nth-child

مطالعه بیشتر
آموزش ساختار استاندارد و بهینه پروژه PHP به سبک گوگل
1405/05/04 23:25

آموزش ساختار استاندارد و بهینه پروژه PHP به سبک گوگل

مطالعه بیشتر
ایجاد Layout‌های واکنش‌گرا با flex-direction و justify-content در CSS Flexbox: راهنمای جامع
1403/08/11 20:59

ایجاد Layout‌های واکنش‌گرا با flex-direction و justify-content در CSS Flexbox: راهنمای جامع

مطالعه بیشتر
مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی
1403/07/30 20:59

مدیریت خطاها در Async/Await و Promises در جاوا اسکریپت: راهنمای کامل با مثال‌های عملی

مطالعه بیشتر
آموزش استایل‌دهی لیست‌ها در CSS: طراحی و استایل‌دهی ul و ol
1403/08/10 21:33

آموزش استایل‌دهی لیست‌ها در CSS: طراحی و استایل‌دهی ul و ol

مطالعه بیشتر
استفاده از setTimeout و setInterval در جاوا اسکریپت: آموزش کامل و مثال‌ها
1403/07/29 20:46

استفاده از setTimeout و setInterval در جاوا اسکریپت: آموزش کامل و مثال‌ها

مطالعه بیشتر
استفاده از visibility و opacity در CSS برای مخفی‌سازی عناصر: راهنمای کامل و کاربردی
1403/08/11 20:31

استفاده از visibility و opacity در CSS برای مخفی‌سازی عناصر: راهنمای کامل و کاربردی

مطالعه بیشتر
آموزش mix-blend-mode و background-blend-mode در CSS: ترکیب رنگ‌ها و ایجاد افکت‌های جذاب
1403/08/12 20:18

آموزش mix-blend-mode و background-blend-mode در CSS: ترکیب رنگ‌ها و ایجاد افکت‌های جذاب

مطالعه بیشتر
مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی
1403/08/11 21:28

مدیریت ترتیب نمایش با z-index در CSS: آموزش کامل و کاربردی

مطالعه بیشتر
روش‌های کار با Conditional و Loop در Vue.js | آموزش v-if، v-show و v-for
1404/09/28 21:24

روش‌های کار با Conditional و Loop در Vue.js | آموزش v-if، v-show و v-for

مطالعه بیشتر
Async/Await: نوشتن کدهای خواناتر و ناهم‌زمان در جاوا اسکریپت - آموزش کامل با مثال‌ها
1403/07/30 20:50

Async/Await: نوشتن کدهای خواناتر و ناهم‌زمان در جاوا اسکریپت - آموزش کامل با مثال‌ها

مطالعه بیشتر
آموزش کامل کار با آرایه‌ها و اشیاء در جاوا اسکریپت: ایجاد، دستکاری و پیمایش
1403/06/02 21:08

آموزش کامل کار با آرایه‌ها و اشیاء در جاوا اسکریپت: ایجاد، دستکاری و پیمایش

مطالعه بیشتر

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