چگونه با htaccess جلوی SQL Injection را بگیریم؟

SQL Injection یکی از روش‌های خطرناک حمله به وب‌سایت‌ها است که به مهاجم اجازه می‌دهد دستورات غیرمجاز را در پایگاه داده اجرا کند. با استفاده از .htaccess می‌توا..

انتشار: , زمان مطالعه: 8 دقیقه
چگونه با htaccess جلوی SQL Injection را بگیریم؟
دسته بندی: امنیت سایبری تعداد بازدید: 105

SQL Injection یکی از روش‌های خطرناک حمله به وب‌سایت‌ها است که به مهاجم اجازه می‌دهد دستورات غیرمجاز را در پایگاه داده اجرا کند. با استفاده از .htaccess می‌توانید بسیاری از این حملات را در سطح سرور شناسایی و مسدود کنید. در این مقاله ابتدا توضیح می‌دهیم که فایل .htaccess چیست، چگونه کار می‌کند و سپس روش‌هایی برای جلوگیری از حملات SQL Injection با استفاده از آن ارائه می‌دهیم.

فایل  htaccess چیست؟

.htaccess (Hypertext Access) یک فایل پیکربندی متنی است که در وب‌سرور Apache استفاده می‌شود. این فایل به شما اجازه می‌دهد رفتار وب‌سرور را بدون نیاز به دسترسی مستقیم به تنظیمات اصلی تغییر دهید.

ویژگی‌های کلیدی فایل  htaccess

  1. مدیریت درخواست‌ها:

    • مسدود کردن یا اجازه دادن به دسترسی به فایل‌ها و پوشه‌ها.
    • بازنویسی آدرس‌ها (URL Rewrite).
    • جلوگیری از دسترسی به محتوای خاص.
  2. امنیت وب‌سایت:

    • محدود کردن الگوهای مشکوک.
    • مسدود کردن آدرس‌های IP مخرب.
    • جلوگیری از حملات تزریق، مانند SQL Injection.
  3. سفارشی‌سازی سرور:

    • تنظیم رفتارهای خاص سرور برای پروژه‌های مختلف.
    • کنترل خطاهای HTTP (مثلاً نمایش صفحات 404 سفارشی).

چگونه .htaccess کار می‌کند؟

وقتی یک کاربر یا مهاجم درخواستی را به وب‌سرور ارسال می‌کند، Apache ابتدا فایل .htaccess را بررسی می‌کند. اگر قوانینی در این فایل تعریف شده باشد، سرور درخواست را بر اساس این قوانین پردازش می‌کند. به همین دلیل، می‌توان با تنظیمات مناسب در فایل .htaccess الگوهای مشکوک را شناسایی و مسدود کرد.

جلوگیری از SQL Injection با استفاده از .htaccess

1. مسدود کردن کلمات کلیدی خطرناک SQL

برای جلوگیری از تزریق SQL، می‌توان کلمات کلیدی خطرناکی مانند SELECT, UNION, DROP, و DELETE را در درخواست‌ها شناسایی و مسدود کرد. به عنوان مثال:

# -------------------------------------------------------------------
# Programmer       : Ebrahim Shafiei (EbraSha)
# Email            : [email protected]
# -------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Block common SQL Injection keywords
    RewriteCond %{QUERY_STRING} (union|select|insert|update|delete|drop|;) [NC]
    RewriteRule ^(.*)$ - [F,L]
</IfModule>

توضیح:

  • RewriteCond: شرایطی را تعریف می‌کند که درخواست باید بررسی شود.
  • %{QUERY_STRING}: پارامترهای ورودی URL را بررسی می‌کند.
  • [NC]: بررسی را بدون حساسیت به حروف بزرگ یا کوچک انجام می‌دهد.
  • [F,L]: درخواست را مسدود کرده و اجرای قوانین دیگر را متوقف می‌کند.

2. جلوگیری از کاراکترهای خطرناک

برخی از حملات از کاراکترهای خاص مثل ', ", --, و # استفاده می‌کنند. برای جلوگیری از این موارد:

# -------------------------------------------------------------------
# Programmer       : Ebrahim Shafiei (EbraSha)
# Email            : [email protected]
# -------------------------------------------------------------------
# Block dangerous characters
<IfModule mod_rewrite.c>
    RewriteCond %{QUERY_STRING} (\%27|'|\%22|") [NC,OR]
    RewriteCond %{QUERY_STRING} (\%3B|;|\%23|#) [NC]
    RewriteRule ^(.*)$ - [F,L]
</IfModule>

توضیح: این قوانین کاراکترهای خطرناک را در درخواست‌ها شناسایی و مسدود می‌کنند.

3. شناسایی الگوهای رمزگذاری شده

الگوهای رمزگذاری شده (مثل CHAR() و UNHEX()) برای دور زدن فیلترها استفاده می‌شوند. برای مسدود کردن آنها:

# -------------------------------------------------------------------
# Programmer       : Ebrahim Shafiei (EbraSha)
# Email            : [email protected]
# -------------------------------------------------------------------
# Block encoded SQL injection patterns
<IfModule mod_rewrite.c>
    RewriteCond %{QUERY_STRING} (char\(|unhex\() [NC]
    RewriteRule ^(.*)$ - [F,L]
</IfModule>

4. جلوگیری از تزریق توابع پیشرفته

تزریق‌هایی که از توابع پیچیده یا الگوهای خاص SQL مثل کامنت‌ها (/* */) یا عملگرهای منطقی (AND, OR) استفاده می‌کنند:

# -------------------------------------------------------------------
# Programmer       : Ebrahim Shafiei (EbraSha)
# Email            : [email protected]
# -------------------------------------------------------------------
# Block advanced SQL patterns
<IfModule mod_rewrite.c>
    RewriteCond %{QUERY_STRING} (/\*|\*/|and|or) [NC]
    RewriteRule ^(.*)$ - [F,L]
</IfModule>

5. ترکیب تمامی قوانین در یک فایل

برای مدیریت بهینه، تمامی قوانین بالا را می‌توان به صورت ترکیبی در یک فایل .htaccess قرار داد:

# -------------------------------------------------------------------
# Programmer       : Ebrahim Shafiei (EbraSha)
# Email            : [email protected]
# -------------------------------------------------------------------
<IfModule mod_rewrite.c>
    RewriteEngine On

    # Block common SQL keywords
    RewriteCond %{QUERY_STRING} (union|select|insert|update|delete|drop|;) [NC,OR]
    
    # Block dangerous characters
    RewriteCond %{QUERY_STRING} (\%27|'|\%22|") [NC,OR]
    RewriteCond %{QUERY_STRING} (\%3B|;|\%23|#) [NC,OR]
    
    # Block encoded patterns
    RewriteCond %{QUERY_STRING} (char\(|unhex\() [NC,OR]
    
    # Block advanced SQL patterns
    RewriteCond %{QUERY_STRING} (/\*|\*/|and|or) [NC]
    
    # Deny access
    RewriteRule ^(.*)$ - [F,L]
</IfModule>

چرا استفاده از این قوانین ضروری است؟

این روش‌ها به شما کمک می‌کنند تا:

  1. الگوهای شناخته‌شده حملات را مسدود کنید.
  2. امنیت پایگاه داده را در برابر تزریقات پیچیده و ساده افزایش دهید.
  3. بدون نیاز به ابزارهای جانبی، امنیتی پایه‌ای برای وب‌سایت فراهم کنید.

نکته مهم در استفاده از htaccess

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

  1. مسدود کردن درخواست‌های مشروع: اگر اپلیکیشن شما از کلمات کلیدی یا کاراکترهایی که در قوانین مسدودکننده مشخص شده‌اند (مانند SELECT، CHAR()، یا کاراکترهای ' و ") به‌صورت مجاز استفاده کند، این درخواست‌ها به اشتباه مسدود خواهند شد.

    مثال:

    • اپلیکیشنی که به کاربران اجازه می‌دهد عبارات SQL مانند SELECT * FROM را برای آموزش وارد کنند.
    • URLهایی که شامل مقادیر قانونی با کاراکترهای خاص هستند.
  2. تأثیر بر کارکرد توابع پیچیده: برخی از توابع یا پارامترهایی که برای اپلیکیشن ضروری هستند، ممکن است با قوانین مسدودکننده تطابق داشته باشند. این می‌تواند منجر به رفتارهای غیرمنتظره یا حتی از کار افتادن بخشی از برنامه شود.

  3. سختی در مدیریت تغییرات: قوانین .htaccess نیازمند بررسی مداوم برای سازگاری با عملکردهای جدید اپلیکیشن هستند. عدم هماهنگی بین توسعه‌دهندگان و تنظیمات .htaccess می‌تواند منجر به مشکلات پیش‌بینی‌نشده شود.

چگونه این مشکل را مدیریت کنیم؟

  1. تست و ارزیابی مداوم: پس از اعمال قوانین، باید تمامی مسیرها و عملکردهای اپلیکیشن را آزمایش کنید تا مطمئن شوید که درخواست‌های مجاز تحت تأثیر قرار نگرفته‌اند.

  2. استفاده از قوانین دقیق‌تر: فیلترهای .htaccess را به گونه‌ای طراحی کنید که تنها موارد خاص و مشکوک را هدف قرار دهند. به عنوان مثال، به جای مسدود کردن کل کلمات کلیدی، تنها ترکیب‌های خطرناک آنها را مسدود کنید.

  3. اضافه کردن استثناها: اگر بخشی از اپلیکیشن به درخواست‌هایی نیاز دارد که توسط فیلترها مسدود می‌شوند، می‌توانید استثناهایی در قوانین تعریف کنید.

  4. نگهداری مستمر: با نظارت و به‌روزرسانی مداوم قوانین .htaccess، می‌توانید از هماهنگی آن با تغییرات برنامه اطمینان حاصل کنید.

نحوه ساخت و تنظیم فایل .htaccess

وارد پوشه اصلی پروژه خود شوید، و فایل .htaccess را ایجاد کنید و سپس کل قوانینی که می خواهید اجرا شود را در آن بنویسید و ذخیره کنید . به همین سادگی کل قوانین روی تمامی زیر مجموعه های آن پوشه اصلی اعمال می شود .

چرا استفاده از .htaccess برای جلوگیری از SQL Injection بهترین روش نیست؟

فایل .htaccess ابزاری قدرتمند برای مدیریت تنظیمات وب‌سرور است و در بسیاری از موارد می‌تواند به عنوان یک لایه امنیتی اضافی عمل کند. با این حال، صرف استفاده از این روش برای جلوگیری از حملات SQL Injection به دلایل زیر نمی‌تواند به تنهایی کافی باشد:

1. .htaccess فقط الگوهای سطح درخواست را بررسی می‌کند

فایل .htaccess تنها قادر به بررسی الگوهای مشخص در URL (مانند پارامترهای GET و کوکی‌ها) است و:

  • نمی‌تواند حملات پیشرفته که از روش‌های رمزگذاری شده یا پیچیده‌تر استفاده می‌کنند، شناسایی کند.
  • تزریقات SQL از طریق روش‌های دیگر (مانند داده‌های POST یا ورودی‌های فرم که رمزنگاری شده‌اند) ممکن است از فیلترها عبور کنند.

2. تمرکز بر الگوهای ثابت

قوانین در فایل .htaccess معمولاً بر اساس الگوهای از پیش تعریف شده نوشته می‌شوند:

  • حملات جدید با الگوهای متفاوت می‌توانند از این قوانین عبور کنند.
  • مهاجمان می‌توانند با استفاده از تغییرات کوچک در ورودی‌ها، قوانین را دور بزنند.

مثال: اگر SELECT در قوانین مسدود شده باشد، مهاجم ممکن است از ورودی‌های رمزگذاری شده مانند S%45LECT استفاده کند که از فیلترها عبور می‌کنند.

3. عدم پردازش سمت سرور یا پایگاه داده

فایل .htaccess تنها در لایه وب‌سرور عمل می‌کند و:

  • نمی‌تواند ورودی‌های کاربر را که به پایگاه داده ارسال می‌شوند بررسی کند.
  • قادر به جلوگیری از تزریقات SQL در مقاطع دیگر (مانند کد برنامه یا درخواست‌های سمت سرور) نیست.

4. احتمال اختلال در عملکرد اپلیکیشن

  • استفاده از قوانین سختگیرانه در .htaccess ممکن است باعث مسدود شدن درخواست‌های مجاز و ایجاد اختلال در عملکرد عادی اپلیکیشن شود.
  • این موضوع به‌ویژه در برنامه‌هایی با ورودی‌های پیچیده یا داده‌های خاص بسیار محتمل است.

5. نیاز به ترکیب با سایر روش‌ها

امنیت واقعی وب‌سایت نیازمند استفاده از روش‌های چندلایه است:

  • Prepared Statements و Parameterized Queries: برای جلوگیری از تزریقات SQL در لایه پایگاه داده.
  • WAF (Web Application Firewall): برای شناسایی و مسدود کردن حملات پیچیده‌تر.
  • اعتبارسنجی ورودی‌ها: برای محدود کردن ورودی‌های ناامن.

در ضمن حملات XSS یا Cross-Site Scripting یکی دیگر از تهدیدات امنیتی مهم برای وب‌سایت‌ها است. اگر می‌خواهید یاد بگیرید که چگونه می‌توان با تنظیمات .htaccess از این نوع حملات جلوگیری کرد و امنیت وب‌سایت خود را در برابر کدهای مخرب جاوااسکریپت افزایش دهید، مقاله جلوگیری از حملات XSS با تنظیمات htaccess را مطالعه کنید.

قبل از استفاده از این مقاله حتماً مقاله "استثناء گذاری در قوانین htaccess بدون افت امنیت وب‌ سایت" را مطالعه کنید.


دیدگاه های مربوط به این مقاله (برای ارسال دیدگاه در سایت حتما باید عضو باشید و پروفایل کاربری شما تکمیل شده باشد)