تابع sanitize_text_field در وردپرس
تابع sanitize_text_field() یکی از توابع استاندارد وردپرس برای پاکسازی ورودیهای متنی است. هدف آن حذف یا تبدیل کاراکترهای خطرناک و تگهای HTML از رشتههایی است که از کاربر دریافت میشود، تا ریسکهای امنیتی مثل XSS یا خراب شدن ساختار دیتابیس کاهش یابد.
چرا باید از sanitize_text_field() استفاده کنیم؟
- جلوگیری از Cross-Site Scripting (XSS) با حذف تگها و کاراکترهای اجرایی.
- یکسانسازی دادهها پیش از ذخیره در دیتابیس.
- محافظت از فیلدهایی که فقط متن ساده (plain text) نیاز دارند، مانند نام، عنوان، توضیحات کوتاه و غیره.
نحوه عملکرد کلی
این تابع ابتدا کاراکترهای کنترل غیرمجاز و تگهای HTML را حذف میکند، سپس توابع دیگری مانند wp_check_invalid_utf8() و trim() را اعمال مینماید تا رشته نهایی پاک و ایمن شود. توجه کنید که این تابع برای حذف کامل HTML طراحی شده و برای محتوای HTML غنی مناسب نیست.
نمونههای کاربردی
1) پاکسازی مقدار ارسالی از فرم قبل از ذخیره
if ( isset( $_POST['first_name'] ) ) {
$first_name = sanitize_text_field( wp_unslash( $_POST['first_name'] ) );
update_user_meta( get_current_user_id(), 'first_name', $first_name );
}در این مثال ابتدا با wp_unslash() اسلشهای اضافه حذف میشوند (زیرا وردپرس دادهها را magic-quote نکرده اما برخی جاها لازم است)، سپس sanitize_text_field اعمال میشود و مقدار پاکشده در متادیتای کاربر ذخیره میشود. استفاده از sanitize_text_field پیش از update_user_meta تضمین میکند که به دیتابیس فقط متن ایمن میرود.
2) پاکسازی آرایهای از مقادیر (مثلاً چند فیلد فرم)
$fields = array_map( 'sanitize_text_field', $_POST['my_fields'] );اگر یک آرایه از فیلدها دارید میتوانید با array_map روی هر مقدار تابع را اجرا کنید. توجه داشته باشید که $_POST[‘my_fields’] باید آرایه باشد؛ قبل از استفاده بهتر است نوع داده را بررسی کنید.
3) تابع بازگشتی برای آرایههای چندبعدی
function sanitize_text_field_recursive( $value ) {
if ( is_array( $value ) ) {
return array_map( 'sanitize_text_field_recursive', $value );
}
return sanitize_text_field( $value );
}
// استفاده:
$sanitized = sanitize_text_field_recursive( $_POST );این تابع بازگشتی تمام مقادیر داخل آرایههای تو در تو را نیز پاکسازی میکند. مناسب زمانی است که دادههای ورودی پیچیده باشند (مثلاً فیلدهای تکرارشونده یا ساختار JSON دیکد شده).
مقایسه با توابع مشابه
| تابع | کاربرد | مناسب برای |
|---|---|---|
| sanitize_text_field() | حذف تگها و کاراکترهای نامعتبر | متن ساده (نام، عنوان، برچسب) |
| sanitize_textarea_field() | مشابه اما برای textarea با حفظ خط جدید | متن چندخطی بدون HTML |
| wp_kses() | اجازه دادن به تگهای HTML مشخص | محتوای HTML محدود و امن |
| esc_html() / esc_attr() | فرار دادن برای نمایش در خروجی | فقط برای خروجی، نه برای ذخیره |
تفاوت sanitization و escaping
یک نکته مهم: sanitize و escape دو مرحله جدا هستند. sanitize_text_field() برای پاکسازی داده پیش از ذخیره در دیتابیس استفاده میشود، در حالی که esc_html() یا esc_attr() برای امن کردن داده هنگام نمایش در قالب کاربرد دارند. بهترین شیوه این است که ورودی را sanitize کنید و هر زمان که آن را در HTML نمایش میدهید، escape نیز انجام دهید.
مواردی که sanitize_text_field() مناسب نیست
- وقتی به HTML مجاز نیاز دارید (مثلاً توضیحات دارای لینک): از wp_kses() استفاده کنید.
- وقتی داده نوع خاصی دارد مثل ایمیل یا URL: از sanitize_email() یا esc_url_raw() استفاده کنید.
- برای خروجی مستقیم در قالب همیشه از توابع esc_* استفاده کنید.
مثال پیشرفته: ذخیره متا در save_post
function my_save_post_meta( $post_id ) {
if ( ! isset( $_POST['my_meta_nonce'] ) || ! wp_verify_nonce( $_POST['my_meta_nonce'], 'my_meta' ) ) {
return;
}
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
if ( isset( $_POST['subtitle'] ) ) {
$subtitle = sanitize_text_field( wp_unslash( $_POST['subtitle'] ) );
update_post_meta( $post_id, '_subtitle', $subtitle );
}
}
add_action( 'save_post', 'my_save_post_meta' );در این نمونه تمامی چکهای امنیتی اولیه مثل nonce، autosave و capability چک شدهاند. سپس داده با wp_unslash و sanitize_text_field پاکسازی و ذخیره میشود — این رویکرد ایمن و استاندارد است.
نکات حرفهای و بهترین شیوهها
- همیشه دادههای ورودی را قبل از ذخیره sanitise کنید و هنگام نمایش، escape را فراموش نکنید.
- برای هر نوع داده تابع مخصوص را انتخاب کنید (ایمیل، URL، متن ساده، HTML محدود).
- برای آرایهها از توابع بازگشتی یا array_map استفاده کنید تا همه مقادیر پاک شوند.
- به کارایی هم توجه کنید؛ sanitize_text_field سبک است اما روی آرایههای بزرگ از نظر زمان پردازش تاثیر دارد.
- مستندات وردپرس را مطالعه کنید تا تغییرات نسخههای جدید را دنبال کنید (رفتار توابع ممکن است بهبود یابد).
جمعبندی
تابع sanitize_text_field() یک ابزار ساده اما حیاتی برای محافظت از اپلیکیشنهای وردپرس است که باید در هر نقطهای که داده متنی ساده از کاربر دریافت میکنید، مورد استفاده قرار گیرد. با این حال لازم است تفاوت آن با توابع خروجیسازی و دیگر توابع sanitization را بدانید تا هیچگاه از آن در محل نامناسب استفاده نکنید.
آیا این مطلب برای شما مفید بود ؟




