ویژگی تصویر

آموزش تابع esc_url() در وردپرس و کاربرد آن

  /  وردپرس   /  تابع esc_url در وردپرس
بنر تبلیغاتی الف
wp - wordpress - وردپرس

در توسعه قالب و افزونه وردپرس، جلوگیری از ورود و نمایش آدرس‌های مخرب (مثلاً حاوی جاوااسکریپت یا پروتکل‌های ناسازگار) اهمیت بسیار زیادی دارد. تابع esc_url() یکی از ابزارهای استاندارد وردپرس برای پاکسازی و امن‌سازی URLها قبل از نمایش در خروجی HTML است. در این مقاله به صورت کاربردی و با مثال‌های واقعی، نحوهٔ استفاده، تفاوت‌ها با توابع مشابه و نکات امنیتی مرتبط را بررسی می‌کنیم.

هدف و کاربرد esc_url()

هدف اصلی esc_url() این است که مقدارِ رشته‌ایِ واردشده را طوری آماده کند که در صفات HTML مانند href یا src به‌صورت امن نمایش داده شود. این تابع:

  • پروتکل‌های ناامن را فیلتر یا حذف می‌کند (مثلاً javascript:)
  • کاراکترهای خاص را encode می‌کند تا XSS رخ ندهد
  • اطمینان می‌دهد که خروجی برای قرارگیری در attribute مناسب است

نحوهٔ استفاده پایه

<?php
$url = get_post_meta( $post_id, 'external_link', true );
echo '<a href="' . esc_url( $url ) . '">لینک خارجی</a>';
?>

در این مثال، مقدار متای ذخیره‌شده پیش از چاپ در href با esc_url() پاکسازی شده است تا از حملات XSS یا پروتکل‌های ناخواسته جلوگیری شود.

تفاوت esc_url() با توابع مشابه

تابعهدفموقعیت استفاده
esc_url()پاکسازی URL برای نمایش در خروجی (HTML attributes)قبل از echo در href/src و موارد مشابه
esc_url_raw()پاکسازی URL برای ذخیره/redirect (بدون HTML-encoding)قبل از ذخیره در پایگاه‌داده یا استفاده در redirect
sanitize_text_field()پاکسازی عمومی متن (پاک کردن برچسب‌ها و نویز)برای فیلدهای متنی که URL نیستند
wp_kses()کنترل دقیق HTML مجاززمانی که می‌خواهیم HTML خاصی مجاز باشد

مثال عملی: فرم ورود لینک توسط کاربر

<?php
if ( isset( $_POST['submit_link'] ) ) {
    // هنگام ذخیره در DB: از esc_url_raw یا wp_filter_nohtml_kses استفاده کنید
    $raw = isset( $_POST['user_url'] ) ? $_POST['user_url'] : '';
    $clean_for_db = esc_url_raw( $raw );
    update_post_meta( $post_id, 'user_submitted_url', $clean_for_db );
}
 
// هنگام نمایش خروجی در قالب:
$saved = get_post_meta( $post_id, 'user_submitted_url', true );
echo '<a href="' . esc_url( $saved ) . '" rel="nofollow">لینک کاربر</a>';
?>

توضیح: در این قطعه، برای ذخیرهٔ URL از esc_url_raw() استفاده شده تا رشتهٔ پاکسازی‌شده ولی بدون encode HTML آماده ذخیره باشد. هنگام نمایش، esc_url() اعمال می‌شود تا خروجی برای HTML ایمن گردد.

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

    • همیشه پیش از چاپ URL در attribute از esc_url() استفاده کنید.

<liبرای ذخیرهٔ URL در پایگاه‌داده از esc_url_raw() یا توابع معتبر دیگر استفاده کنید تا encoding مناسب برای redirect و ذخیره صورت گیرد.

  • برای ریدایرکت‌ها از wp_safe_redirect و توابع اعتبارسنجی مانند wp_validate_redirect یا wp_is_local_external استفاده کنید تا از بازگشت به میزبان‌های ناامن جلوگیری شود.
  • لیست پروتکل‌های مجاز را می‌توانید با تابع wp_allowed_protocols() مشاهده یا فیلتر کنید؛ اگر نیاز دارید دیتای data: اجازه داشته باشد، روش ایمن برای اضافه کردن آن را بررسی کنید.
  • esc_url() برای محتوای جاوااسکریپت داخل HTML مناسب نیست؛ برای جاوااسکریپت باید از wp_json_encode یا سایر روش‌های اختصاصی استفاده شود.

 

مثال: جلوگیری از بازگشت به میزبان خارجی در redirect

<?php
$redirect = isset( $_GET['redirect_to'] ) ? $_GET['redirect_to'] : home_url();
$redirect = wp_validate_redirect( $redirect, home_url() );
wp_safe_redirect( $redirect );
exit;
?>

توضیح: در این مثال از wp_validate_redirect برای اعتبارسنجی URL ورودی استفاده شده و سپس با wp_safe_redirect ریدایرکت امن انجام می‌شود. این ترکیب از قرار دادن esc_url قبل از redirect قوی‌تر و مناسب‌تر است، زیرا esc_url برای خروجی HTML طراحی شده است نه ریدایرکت‌ها.

چند نکتهٔ فنی و جزئیات مهم

  • esc_url() ممکن است برخی از کاراکترها مانند فضا را encode کند و ورودی‌های مخرب مانند “javascript:alert(1)” را پاک کند.
  • اگر می‌خواهید پروتکل جدیدی را مجاز کنید، از فیلتر kses_allowed_protocols یا تغییر خروجی wp_allowed_protocols() استفاده کنید، اما مراقب ریسک‌های امنیتی باشید.
  • برای خروجی در attributeهای HTML همیشه از توابع esc_attr() یا esc_url() استفاده کنید، و از قرار دادن مستقیم متغیرهای ورودی در HTML خودداری کنید.

نمونهٔ بهینه‌سازی و بررسی خطا

<?php
$url = isset( $_GET['ref'] ) ? wp_unslash( $_GET['ref'] ) : '';
$url = trim( $url );
if ( empty( $url ) ) {
    $url = home_url();
}
$valid = esc_url( $url );
echo '<a href="' . $valid . '">بازگشت</a>';
?>

توضیح: ابتدا مقدار ورودی با wp_unslash پاک‌سازی می‌شود (در صورتی که از فرم POST/GET باشد و وردپرس آن‌ها را اسلش‌زده باشد)، سپس trim و چک خالی بودن انجام می‌شود. در نهایت esc_url برای خروجی به کار می‌رود.

جمع‌بندی و توصیهٔ نهایی

تابع esc_url() یک ابزار کلیدی برای امن‌سازی URLها هنگام نمایش در قالب و خروجی HTML است. اما باید آن را در کنار توابع دیگر مثل esc_url_raw، wp_validate_redirect و wp_safe_redirect استفاده کنید تا هم‌زمان امنیت، کارایی و سازگاری با نیازهای مختلف (ذخیره، ریدایرکت، نمایش) تضمین شود. همیشه ورودی‌ها را اعتبارسنجی کرده و از قرار دادن مستقیم آنها در HTML خودداری کنید.

اگر نیاز دارید لیست پروتکل‌های مجاز یا رفتار پیش‌فرض را تغییر دهید، ابتدا ریسک‌ها را بسنجید و سپس از فیلترهای وردپرس استفاده کنید. استفادهٔ صحیح از esc_url() می‌تواند جلوی شمار زیادی از حملات XSS مرتبط با لینک‌ها و منابع خارجی را بگیرد.

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

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