ویژگی تصویر

تابع htmlspecialchars() در PHP

  /  PHP   /  تابع htmlspecialchars() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع htmlspecialchars() یکی از ابزارهای پایه‌ای برای جلوگیری از حملات XSS (Cross-Site Scripting) در برنامه‌های وب نوشته‌شده با PHP است. این تابع کاراکترهای حساس HTML مثل ، ” و & را به موجودیت‌های HTML امن تبدیل می‌کند تا محتوای ورودی کاربر در خروجی HTML به صورت متن نمایش داده شود و اجرا نشود.

چرا به htmlspecialchars نیاز داریم؟

  • حفاظت در برابر XSS: جلوگیری از اجرای کدهای جاوااسکریپت که توسط کاربر وارد شده‌اند.
  • نمایش امن محتوا: وقتی می‌خواهید متن حاوی علامت‌های HTML را به‌عنوان متن خالص نمایش دهید.
  • سادگی و کارایی: سبک و سریع، و مناسب برای اکثر موارد خروجی‌گیری در HTML.

نحو (signature) و پارامترها

string htmlspecialchars(
    string $string,
    int $flags = ENT_COMPAT | ENT_HTML401,
    ?string $encoding = null,
    bool $double_encode = true
)

پارامترها:

  • $string: رشته‌ای که باید تبدیل شود.
  • $flags: رفتار تبدیل کاراکترها (مثل ENT_QUOTES، ENT_COMPAT).
  • $encoding: مجموعه کاراکتری؛ توصیه می‌شود ‘UTF-8’ مشخص شود.
  • $double_encode: اگر false باشد، موجودیت‌های HTML موجود دوباره تبدیل نمی‌شوند.

مثال پایه‌ای

<?php
$user_input = '<script>alert("XSS")</script>';
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>

این کد کاراکترهای و ” و & را به شکل امن تبدیل می‌کند؛ خروجی چیزی شبیه &lt;script&gt;alert(“XSS”)&lt;/script&gt; خواهد بود و اسکریپت اجرا نمی‌شود.

نمونه: انتخاب درست FLAG (ENT_QUOTES vs ENT_COMPAT)

<?php
// درون صفت‌های HTML بهتر است تمام نقل‌قول‌ها تبدیل شوند:
$value = 'He said "Hello"';
echo '<input value="' . htmlspecialchars($value, ENT_QUOTES, 'UTF-8') . '">';
?>

استفاده از ENT_QUOTES باعث تبدیل هم ” و هم ‘ می‌شود؛ این برای قرار دادن مقادیر در صفت‌های HTML ضروری است تا جلوی شکستن صفت و تزریق کد گرفته شود.

اجتناب از double-encoding

<?php
$already = '&lt;strong&gt;Bold&lt;/strong&gt;';
echo htmlspecialchars($already, ENT_QUOTES, 'UTF-8', false);
?>

با تنظیم $double_encode روی false، اگر ورودی قبلاً تبدیل شده باشد دوباره تبدیل نمی‌شود و خروجی به همان صورت حفظ می‌شود. این حالت زمانی مفید است که داده‌ها ممکن است قبلاً در سطح دیگری پاک‌سازی یا ذخیره شده باشند.

مثال مقایسه‌ای: با/بدون htmlspecialchars

<?php
$unsafe = '<img src=x onerror=alert(1)>';
echo 'بدون فرار: ' . $unsafe;
echo '<br>با htmlspecialchars: ' . htmlspecialchars($unsafe, ENT_QUOTES, 'UTF-8');
?>

این مثال نشان می‌دهد که بدون فرار، تگ img می‌تواند اجرا شود؛ اما با htmlspecialchars خروجی به‌صورت متن نمایش داده می‌شود و اسکریپت اجرا نمی‌شود.

جدول خلاصهٔ پرچم‌ها (flags)

ثابت (constant)معنی
ENT_COMPATفقط ” را تبدیل می‌کند (پیش‌فرض سنتی)
ENT_QUOTESهم ” و هم ‘ را تبدیل می‌کند (مناسب برای صفت‌ها)
ENT_NOQUOTESهیچ‌کدام از نقل‌قول‌ها را تبدیل نمی‌کند
ENT_HTML401, ENT_HTML5, ENT_XML1, ENT_XHTMLفرمت خروجی مطابق با نسخهٔ استاندارد HTML/XML

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

  • همیشه هنگام نمایش داده‌های کاربر در HTML از escape استفاده کنید، یعنی خروجی‌گیری امن: htmlspecialchars()
  • از UTF-8 به عنوان encoding استفاده کنید تا مشکلات کاراکتر و محرف‌زدایی پیش نیاید.
  • برای مقادیر داخل صفت‌های HTML از ENT_QUOTES استفاده کنید.
  • فراموش نکنید که escaping باید در زمان خروجی انجام شود، نه هنگام ورود (validate هنگام ورود، escape هنگام خروجی).
  • برای محتواهای فرمت‌شده‌تر (مثلاً نمایش مرورگرهای قدیمی یا کار با کاراکترهای ویژه) گاهی htmlentities() مفید است، اما معمولاً htmlspecialchars کافی و سریع‌تر است.
  • برای ورودی‌های مربوط به URL از توابع مخصوص مثل rawurlencode() یا urlencode() استفاده کنید، نه htmlspecialchars.
  • قوانین امنیتی جامع‌تر مثل CSP (Content Security Policy) و استفاده از فریم‌ورک‌ها/تمپلیت‌هایی با escape اتوماتیک را فراموش نکنید.

مقایسه با توابع دیگر

  • htmlentities(): تعداد بیشتری از کاراکترها را به موجودیت HTML تبدیل می‌کند؛ مناسب زمانی که نیاز به تبدیل همهٔ کاراکترهای غیراستاندارد دارید.
  • strip_tags(): تگ‌های HTML را حذف می‌کند؛ اما برای امنیت کامل مناسب نیست چون ممکن است داده مورد نیاز را از بین ببرد و نمی‌تواند جایگزین escaping شود.
  • filter_var() با FILTER_SANITIZE_SPECIAL_CHARS: مشابه htmlspecialchars اما کنترل کمتری روی پارامترها دارد.

مثال تکمیلی: بازگرداندن متن با htmlspecialchars_decode

<?php
$escaped = htmlspecialchars('<b>Hi</b>', ENT_QUOTES, 'UTF-8');
// بازگردانی:
$decoded = htmlspecialchars_decode($escaped, ENT_QUOTES);
?>

گاهی لازم است محتوای قبلاً فرار شده را برگردانید؛ تابع htmlspecialchars_decode() این کار را انجام می‌دهد اما در کاربردهای امنیتی باید با احتیاط استفاده شود.

جمع‌بندی

تابع htmlspecialchars() ابزار ساده، قابل‌اطمینان و پرکاربردی برای محافظت از خروجی HTML در PHP است. با انتخاب درست پارامترها (به‌خصوص ENT_QUOTES و UTF-8) و رعایت اصل «escape on output»، می‌توانید بخش زیادی از حملات XSS را دفع کنید. برای موارد خاص از توابع تکمیلی مانند htmlentities، rawurlencode یا ساختارهای امنیتی سمت سرور و هدرهای CSP کمک بگیرید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: