Sanitization در وردپرس (پاک‌سازی داده) چرا حیاتی است؟ این پرسشی است که پاسخ آن، مرز بین یک سایت امن و یک سایت آسیب‌پذیر را مشخص می‌کند. Sanitization (پاک‌سازی) فرآیند تمیز کردن داده‌های ورودی از کاراکترها، تگ‌ها و الگوهای خطرناک قبل از ذخیره یا پردازش است. برخلاف Output Escaping که در لحظه نمایش انجام می‌شود، Sanitization در لحظه ورود داده عمل می‌کند و اطمینان می‌دهد که داده «تمیز» در پایگاه داده ذخیره می‌شود. وردپرس مجموعه گسترده‌ای از توابع Sanitization مانند sanitize_text_field()، sanitize_email()، sanitize_url()، wp_kses() و absint() را فراهم کرده است. این توابع نه فقط برای امنیت، بلکه برای یکپارچگی داده و جلوگیری از ذخیره اطلاعات بی‌معنا نیز ضروری هستند. چرا Sanitization حیاتی است؟ زیرا: اولاً از XSS (Cross-Site Scripting - اسکریپت‌نویسی میان‌سایتی)، SQL Injection و بسیاری از حملات دیگر جلوگیری می‌کند؛ دوماً کیفیت داده پایگاه داده را حفظ می‌کند؛ سوماً تجربه کاربری را بهبود می‌بخشد. متأسفانه بسیاری از توسعه‌دهندگان Sanitization را به‌عنوان «کار اضافی» تلقی می‌کنند و پیامد آن، آسیب‌پذیری‌های پرهزینه است. در این نوشتار، از ریشه‌های فنی تا پیاده‌سازی عملی Sanitization در وردپرس را بررسی می‌کنیم.

نخستین‌باری که اهمیت Sanitization را به‌طور عملی درک کردم، در یک پروژه فروشگاهی بود که نام محصولات را بدون پاک‌سازی در پایگاه داده ذخیره می‌کرد. نتیجه، نمایش نام‌های مخدوش و در برخی موارد، اجرای اسکریپت‌های ناخواسته در پیشخوان بود. از آن زمان، Sanitization را به‌عنوان یک اصل غیرقابل چشم‌پوشی در همه پروژه‌ها اعمال می‌کنم. در این نوشتار، از ریشه‌های فنی تا پیاده‌سازی عملی را بررسی می‌کنیم.

Sanitization چیست؟

Sanitization (پاک‌سازی) فرآیند تبدیل داده ورودی به فرمتی امن و قابل اعتماد است. این فرآیند شامل حذف کاراکترهای خطرناک، محدودسازی تگ‌های HTML، اعتبارسنجی نوع داده و اطمینان از تطابق با فرمت مورد انتظار است. برخلاف Validation که داده را «رد یا قبول» می‌کند، Sanitization داده را «اصلاح» می‌کند تا قابل استفاده باشد.

Sanitization در وردپرس معمولاً در سه نقطه انجام می‌شود:

  • ورودی: هنگام دریافت داده از فرم، URL یا API.
  • ذخیره: قبل از نوشتن در پایگاه داده.
  • خروجی: اگرچه این مورد در واقع Escaping است، اما برخی Sanitizationها در این لایه هم اعمال می‌شوند.

برای درک عمیق‌تر جایگاه این مفهوم در امنیت وب، اصول امنیت وب را ببینید.

Sanitization یک «صافی» است: داده‌های خطرناک را می‌گیرد، داده‌های مفید را عبور می‌دهد. بدون این صافی، داده خام به پایگاه داده می‌رسد و در نهایت، فاجعه‌بار می‌شود.

چرا Sanitization حیاتی است؟

Sanitization در چند لایه حیاتی است:

  • امنیت: جلوگیری از XSS، SQL Injection، و بسیاری از حملات دیگر.
  • یکپارچگی داده: اطمینان از اینکه داده در فرمت درست ذخیره می‌شود.
  • کیفیت نمایش: داده‌های نامعتبر می‌توانند نمایش سایت را خراب کنند.
  • عملکرد: داده‌های بسیار بزرگ یا پیچیده می‌توانند عملکرد را کاهش دهند.
  • سازگاری: داده‌های پاک‌شده با سایر سیستم‌ها بهتر کار می‌کنند.
  • تجربه کاربری: جلوگیری از نمایش پیام‌های ناخواسته یا مخدوش.

نکته مهم این است که Sanitization به‌تنهایی کافی نیست، اما بدون آن، سایر لایه‌های دفاعی نیز بی‌اثر می‌شوند. برای مرور انواع آسیب‌پذیری‌های مرتبط، انواع آسیب‌پذیری‌های رایج وب را ببینید.

تفاوت Sanitization و Validation

ویژگیValidationSanitization
هدفرد یا قبول دادهپاک‌سازی داده
خروجیBoolean یا خطاداده پاک
رفتار در خطارد دادهاصلاح داده
کاربرد اصلیورودی‌های ساخت‌یافتهورودی‌های آزاد و متنی
ترتیب اجرااولدوم

جمع‌بندی این مقایسه ساده است: Validation می‌گوید «این داده قابل قبول است یا نه»، و Sanitization می‌گوید «این داده را چطور امن کنم». بهترین رویکرد، ترکیب هر دو است. برای درک عمیق‌تر Validation، اعتبارسنجی داده‌ها در کدنویسی وردپرس را ببینید.

توابع Sanitization در وردپرس

وردپرس مجموعه گسترده‌ای از توابع Sanitization را فراهم کرده است:

تابعکاربرد
sanitize_text_field()متن ساده بدون HTML
sanitize_email()ایمیل
sanitize_url() / esc_url_raw()URL
sanitize_key()کلید (فقط حروف کوچک، اعداد، خط تیره)
sanitize_file_name()نام فایل
sanitize_title()عنوان برای slug
sanitize_user()نام کاربری
absint() / intval()عدد صحیح مثبت
wp_kses()HTML با تگ‌های محدود
wp_kses_post()HTML مجاز برای پست
wp_strip_all_tags()حذف کامل تگ‌ها

هر کدام از این توابع برای زمینه خاصی طراحی شده‌اند. برای درک عمیق‌تر، پاک‌سازی داده‌ها در کدنویسی وردپرس را ببینید.

انتخاب تابع مناسب برای هر نوع داده

قاعده طلایی Sanitization این است: «تابع مناسب برای نوع داده مناسب».

متن ساده

$name = sanitize_text_field( $_POST['name'] );

ایمیل

$email = sanitize_email( $_POST['email'] );

URL

$url = esc_url_raw( $_POST['url'] );

عدد صحیح

$age = absint( $_POST['age'] );

کلید (slug، action، status)

$action = sanitize_key( $_POST['action'] );

HTML مجاز

$content = wp_kses_post( $_POST['content'] );

HTML با تگ‌های سفارشی

$allowed = [
  'a' => ['href' => [], 'title' => []],
  'strong' => [],
  'em' => [],
  'p' => [],
];
$custom = wp_kses( $_POST['custom'], $allowed );

برای درک عمیق‌تر این توابع، نوشتن کد PHP امن برای وردپرس را ببینید.

مکانیزم محافظت Sanitization

برای درک اهمیت Sanitization، مکانیزم محافظت آن را بررسی می‌کنیم. فرض کنید داده مخرب زیر وارد شده است:

<script>alert('XSS')</script>

اگر از sanitize_text_field() استفاده کنیم، خروجی می‌شود:

scriptalertXSSscript

تگ‌ها حذف شده‌اند و کد بی‌خطر شده است. اگر از wp_kses_post() استفاده کنیم، تگ script حذف می‌شود اما تگ‌های مجاز مانند p و a باقی می‌مانند. برای دیدن نمونه‌های مشابه، راهنمای پیشگیری از حملات XSS را ببینید.

پیاده‌سازی عملی در افزونه و قالب

Sanitization را می‌توان در سه سطح پیاده کرد:

سطح ۱: فرم‌های HTML

$name = isset( $_POST['name'] ) ? sanitize_text_field( $_POST['name'] ) : '';
$email = isset( $_POST['email'] ) ? sanitize_email( $_POST['email'] ) : '';
$content = isset( $_POST['content'] ) ? wp_kses_post( $_POST['content'] ) : '';

سطح ۲: AJAX Handlers

add_action( 'wp_ajax_myplugin_save', function() {
  check_ajax_referer( 'myplugin_nonce', 'nonce' );
  
  $data = [
    'name' => sanitize_text_field( $_POST['name'] ?? '' ),
    'email' => sanitize_email( $_POST['email'] ?? '' ),
    'age' => absint( $_POST['age'] ?? 0 ),
  ];
  
  update_option( 'myplugin_data', $data );
  wp_send_json_success( $data );
} );

سطح ۳: REST API

register_rest_route( 'myplugin/v1', '/settings', [
  'methods' => 'POST',
  'callback' => 'myplugin_save_settings',
  'permission_callback' => function() {
    return current_user_can( 'manage_options' );
  },
  'args' => [
    'title' => [
      'sanitize_callback' => 'sanitize_text_field',
    ],
    'description' => [
      'sanitize_callback' => 'wp_kses_post',
    ],
    'url' => [
      'sanitize_callback' => 'esc_url_raw',
    ],
  ],
] );

برای مرور ساختار افزونه، ساختار استاندارد افزونه وردپرس را ببینید.

اشتباهات رایج در Sanitization

  • استفاده از sanitize_text_field() برای HTML: این تابع همه تگ‌ها را حذف می‌کند.
  • استفاده از wp_kses_post() برای متن ساده: این تابع تگ‌های مجاز را نگه می‌دارد.
  • اتکای صرف به Sanitization: باید با Validation و Output Escaping ترکیب شود.
  • فراموش کردن Sanitization در متادیتا: داده متادیتا نیز نیازمند Sanitization است.
  • نادیده گرفتن آرایه‌ها: $_POST['items'] که آرایه است، باید تیم‌به‌تیم Sanitize شود.
  • استفاده از strip_tags(): این تابع در برابر attribute-based XSS ضعیف است.
  • نادیده گرفتن داده‌های JSON: داده‌های JSON از REST API نیز نیازمند Sanitization هستند.
  • Sanitize در لحظه نمایش به‌جای ذخیره: داده اصلی از بین می‌رود و امکان بازیابی نیست.

برای مرور خطاهای مشابه در پیکربندی، اشتباهات امنیتی رایج در وردپرس را ببینید.

پرسش‌های پرتکرار درباره Sanitization

آیا Sanitization به‌تنهایی برای امنیت کافی است؟ نه، باید با Validation و Output Escaping ترکیب شود تا دفاع چندلایه ایجاد گردد.

تفاوت sanitize_text_field() و wp_kses_post() چیست؟ اولی همه تگ‌های HTML را حذف می‌کند و دومی تگ‌های مجاز برای پست را نگه می‌دارد.

آیا esc_html() یک تابع Sanitization است؟ نه، این تابع Output Escaping است. تفاوت در زمان اجرا است: Sanitization ورودی، Escaping خروجی.

آیا افزونه‌های امنیتی Sanitization را خودکار اعمال می‌کنند؟ نه، Sanitization باید در کد انجام شود. افزونه‌های امنیتی می‌توانند WAF داشته باشند، اما این لایه کافی نیست. برای مرور گزینه‌ها، بهترین افزونه‌های امنیتی وردپرس را ببینید.

چطور بفهمم فرم من Sanitization دارد؟ کد فرم را جست‌وجو کنید. هر جا داده‌ای از $_POST یا $_GET خوانده می‌شود، باید Sanitize شود.

آیا Sanitization کیفیت داده را کاهش می‌دهد؟ نه، اگر تابع مناسب انتخاب شود، داده‌های مفید حفظ می‌شوند و فقط کاراکترهای خطرناک حذف می‌شوند.

برای مطالعه بیشتر درباره این مفهوم، صفحه Data sanitization در ویکی‌پدیا مفید است.

خط پایان

Sanitization یکی از آن لایه‌های امنیتی است که در سایه Validation و Output Escaping کمتر دیده می‌شود، اما در واقع «صافی اصلی» است که داده‌های خطرناک را از پایگاه داده دور نگه می‌دارد. در بستر وردپرس، توابع Sanitization متعددی وجود دارد که بسیاری از آن‌ها نادیده گرفته می‌شوند. دفاع مؤثر نیازمند انتخاب تابع مناسب برای هر نوع داده، ترکیب Sanitization با Validation و Output Escaping، و اعمال آن در همه سطوح (فرم، AJAX، REST API) است. اگر سایت شما فرم یا endpoint دارد، همین امروز کد را بازبینی کنید.

اگر در پروژه‌ای با حمله ناشی از عدم Sanitization روبه‌رو شده‌اید یا راهکار متفاوتی پیاده کرده‌اید، تجربه خود را در دیدگاه‌ها بنویسید؛ به‌خصوص اگر افزونه یا قالب خاصی عامل بوده، این اطلاعات برای خواننده بعدی بسیار ارزشمند است.