تابع htmlspecialchars() در 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');
?>این کد کاراکترهای و ” و & را به شکل امن تبدیل میکند؛ خروجی چیزی شبیه <script>alert(“XSS”)</script> خواهد بود و اسکریپت اجرا نمیشود.
نمونه: انتخاب درست 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 = '<strong>Bold</strong>';
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 کمک بگیرید.
آیا این مطلب برای شما مفید بود ؟



