تابع esc_html در وردپرس
تابع esc_html() یکی از توابع مهم برای خروجی امن در وردپرس است. این تابع متن را طوری تبدیل میکند که هر کاراکتر خاص HTML به موجودیتهای امن معادل تبدیل شوند (مثل تبدیل به >). نتیجه این تبدیل این است که محتوای خروجی بهعنوان متن ساده در مرورگر نمایش داده میشود و امکان اجرای کدهای مخرب (XSS) از بین میرود.
چرا استفاده از esc_html() ضروری است؟
- حفظ امنیت: جلوگیری از حملات XSS که از طریق درج کد جاوااسکریپت در فیلدها انجام میشود.
- قابلیت اعتماد: خروجیهای تولید شده توسط کاربر یا منابع خارجی را به صورت امن نشان میدهد.
- سازگاری با قالبها: مخصوصاً در فایلهای تمپلیت که دادهها مستقیماً داخل HTML رندر میشوند.
چه زمانی باید از esc_html() استفاده کنیم؟
- وقتی دادهها را در داخل محتویات عناصر HTML (node text) نمایش میدهید، مانند داخل <p>، <div> یا لیستها.
- برای متونی که ممکن است شامل کاراکترهای خاص HTML باشد و نباید تگ یا اسکریپت اجرا شود.
- در خروجی دادههای فرم، فرمتهای ذخیرهشده در متاهای پست، یا فیلدهای وارد شده توسط کاربر.
تابع esc_html() در برابر توابع دیگر
| تابع | کاربرد اصلی |
|---|---|
| esc_html() | فرمت متن برای نمایش امن داخل متن HTML (متن نِیَدو) |
| esc_attr() | برای امنیت مقادیر داخل attributes مثل value، title، alt |
| esc_url() | برای ایمنسازی آدرسهای URL قبل از قرارگیری در href، src |
| wp_kses() | در صورتی که میخواهید چند تگ HTML مجاز را نگه دارید و بقیه را حذف کنید |
نمونههای کاربردی و بهترین روشها
قواعد مهم:
- Escaping هنگام خروجی: دادهها را هنگام نمایش فرار دهید، نه هنگام ذخیره.
- از double escaping پرهیز کنید: اگر داده قبلاً escape شده، دوباره escape نکنید چون به نمایش اشتباه منجر میشود.
- برای HTML مجاز از wp_kses استفاده کنید: اگر نیاز دارید تا بعضی تگها مانند <a> یا <strong> حفظ شوند.
مثال پایه
<?php
$name = get_post_meta( $post->ID, 'author_name', true );
echo '<p>' . esc_html( $name ) . '</p>';
?>
این کد مقدار متای پست را گرفته و با esc_html آن را قبل از چاپ درون پاراگراف امن میکند. اگر نام شامل <script> باشد، تگها به entity تبدیل شده و اجرا نمیشود.
مثال اشتباه: استفاده از esc_html برای attributes
<img src="image.jpg" alt="<?php echo esc_html( $alt_text ); ?>">
اگرچه esc_html متن را امن میکند، اما برای مقادیر attribute بهتر است از esc_attr() استفاده شود، زیرا esc_attr مخصوص مقدار attribute طراحی شده و رفتار بهینهتری دارد.
استفاده صحیح با esc_attr
<img src="image.jpg" alt="<?php echo esc_attr( $alt_text ); ?>">
این نسخه از alt_text برای قرارگیری داخل attribute امن شده است و از مشکلات احتمالی جلوگیری میکند.
ترجمه و esc_html — نکات ظریف
وقتی از توابع i18n استفاده میکنید، ترتیب ترجمه و escape مهم است. معمولاً باید رشته را ترجمه کنید و سپس مقادیری که از خارج میآیند را escape کنید. مثال:
<?php
printf(
esc_html__( 'Welcome, %s!', 'textdomain' ),
esc_html( $user_name )
);
?>
در این مثال ابتدا رشته ترجمه میشود (esc_html__ به ترجمهشده امن تبدیل میکند) و سپس مقدار نام کاربر با esc_html ایمن شده و درون placeholder قرار میگیرد. این رویکرد از وارد شدن کاراکترهای مخرب به خروجی نهایی جلوگیری میکند.
وقتی میخواهید بعضی HTMLها را نگه دارید
گاهی شما به چند تگ HTML نیاز دارید (مثلاً <br> یا <strong>) و esc_html همه چیز را پاک میکند. در این حالت از wp_kses() یا wp_kses_post() استفاده کنید:
<?php
$allowed = array(
'br' => array(),
'strong' => array(),
'em' => array(),
'a' => array( 'href' => true, 'title' => true )
);
echo wp_kses( $user_content, $allowed );
?>
در این مثال تنها تگهای مشخص شده و attributes معین اجازه نمایش دارند و بقیه محتوای HTML غیراصولی حذف میشود.
اشتباهات رایج و رفع آنها
- استفاده از esc_html() داخل attribute بهجای esc_attr() — باعث مشکلات قالببندی میشود.
- escape کردن پیش از ترجمه — ممکن است رشته ترجمهشده را خراب کند.
- استفادهٔ همزمان از esc_html و wp_kses بدون دلیل — باعث پیچیدگی غیرضروری میشود.
نتیجهگیری و توصیههای حرفهای
تابع esc_html() یک ابزار ساده و قدرتمند برای جلوگیری از XSS و نمایش امن متن در قالبهای وردپرس است. همیشه دادهها را هنگام خروجی فرار دهید، از توابع مخصوص هر موقعیت (esc_attr برای attributes، esc_url برای URLها) استفاده کنید، و اگر نیاز به نگهداری HTML دارید از wp_kses استفاده نمایید. حفظ این الگوها به عملکرد، امنیت و نگهداری بهتر سایت شما کمک شایانی خواهد کرد.
آیا این مطلب برای شما مفید بود ؟




