Open Redirect Prevention در وردپرس (پیشگیری از تغییر مسیر باز) چرا ضروری است؟ Open Redirect (تغییر مسیر باز) نوعی آسیب‌پذیری است که در آن برنامه، کاربر را بر اساس پارامتر ورودی به یک دامنه خارجی هدایت می‌کند. این آسیب‌پذیری در ظاهر بی‌خطر به‌نظر می‌رسد، اما در واقع به یک ابزار قدرتمند برای فیشینگ، سرقت اعتبارنامه، و توزیع بدافزار تبدیل می‌شود. در بستر وردپرس، Open Redirect از چند مسیر وارد می‌شود: پارامتر redirect_to در صفحه ورود، تابع wp_redirect() بدون اعتبارسنجی، افزونه‌های فرم‌ساز که URL بازگشت را از ورودی می‌خوانند، و افزونه‌های ریدایرکت که مقصد را از پارامتر می‌گیرند. پیامدهای موفقیت این حمله می‌تواند از سرقت اعتبارنامه مدیر تا نصب بدافزار و آلودگی سایت متغیر باشد. مهم‌تر از پیامد فنی، آسیب اعتباری است: دامنه معتبر شما به‌عنوان پلی برای حمله استفاده می‌شود و اعتماد کاربران از بین می‌رود. دفاع اصلی شامل whitelist دامنه‌های مجاز، استفاده از wp_safe_redirect() به‌جای wp_redirect()، و اعتبارسنجی سختگیرانه URL است. چالش اصلی این است که بسیاری از توسعه‌دهندگان Open Redirect را یک آسیب‌پذیری «کم‌خطر» می‌دانند و آن را نادیده می‌گیرند. در این نوشتار، از ریشه‌های فنی Open Redirect تا پیاده‌سازی حرفه‌ای دفاع را بررسی می‌کنیم.

نخستین‌باری که با Open Redirect روبه‌رو شدم، در یک پروژه بود که در آن فرم ورود، پارامتر redirect_to را بدون اعتبارسنجی پردازش می‌کرد. مهاجم می‌توانست با ارسال لینکی حاوی ?redirect_to=https://fake-login.com، کاربر را به صفحه فیشینگ هدایت کند. از آن زمان، Open Redirect را به‌عنوان یک تهدید جدی در همه پروژه‌های وردپرسی در نظر می‌گیرم. در این نوشتار، تجربه‌های عملی را با شما به اشتراک می‌گذارم.

Open Redirect چیست و چرا خطرناک است؟

Open Redirect (تغییر مسیر باز) یا Unvalidated Redirect (تغییر مسیر اعتبارسنجی‌نشده) نوعی آسیب‌پذیری است که در آن برنامه، کاربر را بر اساس پارامتر ورودی به یک دامنه خارجی هدایت می‌کند. این آسیب‌پذیری در OWASP Top 10 در دسته «Broken Access Control» قرار می‌گیرد و از نظر شدت، در سطح متوسط تا بالا طبقه‌بندی می‌شود.

مسئله اصلی که Open Redirect ایجاد می‌کند، سوءاستفاده از اعتماد دامنه شما است. وقتی کاربر لینکی از دامنه معتبر شما می‌بیند، به آن اعتماد می‌کند. اما اگر آن لینک در واقع به دامنه مهاجم هدایت کند، اعتماد کاربر به‌عنوان یک ابزار برای فیشینگ استفاده می‌شود. برای درک عمیق‌تر جایگاه این آسیب‌پذیری در دسته‌بندی کلی، انواع آسیب‌پذیری‌های رایج وب را ببینید.

سه ویژگی کلیدی این آسیب‌پذیری:

  • سادگی اجرا: فقط با یک پارامتر در URL.
  • اعتماد کاربر: لینک از دامنه معتبر به‌نظر می‌رسد.
  • پیامد سنگین: فیشینگ، سرقت اعتبارنامه، و توزیع بدافزار.
  • کم‌توجهی توسعه‌دهندگان: بسیاری آن را «کم‌خطر» می‌دانند.

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

Open Redirect یک «پل اعتماد» است: دامنه معتبر شما به‌عنوان یک واسطه برای هدایت کاربر به دامنه مخرب استفاده می‌شود. همین، آن را خطرناک‌تر از یک آسیب‌پذیری فنی ساده می‌کند.

چرا Open Redirect Prevention ضروری است؟

Open Redirect در ظاهر بی‌خطر به‌نظر می‌رسد، اما در واقع یک ابزار قدرتمند برای چند حمله است:

  • فیشینگ پیشرفته: لینک https://trusted-site.com/?redirect=https://fake-login.com اعتماد کاربر را جلب می‌کند.
  • سرقت اعتبارنامه: کاربر در صفحه فیشینگ، رمز عبور خود را وارد می‌کند.
  • توزیع بدافزار: هدایت به سایت حاوی فایل مخرب.
  • سرقت توکن OAuth: در جریان‌های OAuth، توکن به دامنه مهاجم ارسال می‌شود.
  • بازگردانی اعتبار برند: در صورت سوءاستفاده، اعتماد کاربران از بین می‌رود.
  • blacklist شدن دامنه: Google و سایر سرویس‌ها دامنه شما را به‌عنوان «مخرب» علامت‌گذاری می‌کنند.
  • مشکلات SEO: کاهش رتبه به‌دلیل سوءاستفاده از دامنه.

در پروژه‌های واقعی که بررسی کرده‌ام، سایت‌هایی که Open Redirect داشتند، در فهرست سیاه Google قرار گرفتند و ترافیک آن‌ها به‌شدت کاهش یافت. برای درک عمیق‌تر، حمله فیشینگ را ببینید.

مسیرهای ورود Open Redirect در وردپرس

وردپرس در چندین نقطه از تغییر مسیر پویا استفاده می‌کند. هر یک از این نقاط، یک سطح حمله بالقوه است:

  • صفحه ورود: پارامتر redirect_to.
  • خروج از حساب: پارامتر redirect.
  • افزونه‌های فرم‌ساز: URL بازگشت پس از ارسال فرم.
  • افزونه‌های ریدایرکت: مقصد ریدایرکت از پارامتر.
  • افزونه‌های پرداخت: URL بازگشت از درگاه پرداخت.
  • افزونه‌های عضویت: هدایت پس از ثبت‌نام.
  • REST API: پارامتر _redirect در برخی endpointها.

نکته مهم این است که وردپرس هسته از تابع wp_safe_redirect() در بسیاری از نقاط استفاده می‌کند که دامنه‌های خارجی را رد می‌کند. اما این محافظت به‌طور خودکار به افزونه‌ها و قالب‌های شخص‌ثالث منتقل نمی‌شود. برای درک عمیق‌تر ساختار افزونه، ساختار استاندارد افزونه وردپرس را ببینید.

مکانیزم فنی حمله Open Redirect

یک payload ساده Open Redirect:

https://trusted-site.com/login.php?redirect_to=https://fake-login.com

اگر کد به این شکل باشد:

$redirect = $_GET['redirect_to'];
header( 'Location: ' . $redirect );
exit;

مهاجم می‌تواند کاربر را به دامنه خود هدایت کند. برای دور زدن فیلترهای ساده، مهاجم از تکنیک‌های مختلف استفاده می‌کند:

https://trusted-site.com/redirect?url=//fake.com
https://trusted-site.com/redirect?url=https:fake.com
https://trusted-site.com/redirect?url=https%3A%2F%2Ffake.com
https://trusted-site.com/redirect?url=https://trusted-site.com.fake.com
https://trusted-site.com/redirect?url=https://trusted-site.com@fake.com
https://trusted-site.com/redirect?url=\\fake.com

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

Open Redirect و فیشینگ پیشرفته

Open Redirect به‌طور خاص برای فیشینگ پیشرفته استفاده می‌شود، زیرا:

  • دامنه در URL معتبر به‌نظر می‌رسد.
  • کاربر به لینک کلیک می‌کند و به دامنه مخرب هدایت می‌شود.
  • ابزارهای امنیتی ممکن است دامنه اول را بررسی کنند و آن را امن تشخیص دهند.
  • لینک در ایمیل یا پیام‌رسان، معتبر به‌نظر می‌رسد.

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

پیامدهای واقعی در پروژه‌های وردپرسی

سطحپیامد
فیشینگسرقت اعتبارنامه کاربران
توزیع بدافزارآلودگی دستگاه کاربران
blacklist شدنحذف از نتایج Google
اعتباریکاهش اعتماد کاربران
OAuthسرقت توکن و دسترسی به حساب

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

دفاع مؤثر در برابر Open Redirect

دفاع در چند لایه انجام می‌شود. هیچ لایه‌ای به‌تنهایی کافی نیست.

لایه ۱: استفاده از wp_safe_redirect

وردپرس تابع wp_safe_redirect() را ارائه می‌دهد که دامنه‌های خارجی را رد می‌کند:

wp_safe_redirect( $url );
exit;

این تابع، آدرس‌هایی که دامنه آن‌ها با home_url() متفاوت است، رد می‌کند. برای درک عمیق‌تر، نوشتن کد PHP امن برای وردپرس را ببینید.

لایه ۲: whitelist دامنه‌های مجاز

$allowed_hosts = ['example.com', 'www.example.com'];
$parsed = wp_parse_url( $url );
if ( ! in_array( $parsed['host'], $allowed_hosts, true ) ) {
    wp_die( 'دامنه نامعتبر' );
}
wp_redirect( $url );
exit;

این الگو، مطمئن‌ترین روش است. حتی اگر مهاجم بتواند URL را دستکاری کند، فقط دامنه‌های مجاز پذیرفته می‌شوند.

لایه ۳: مسیر نسبی به‌جای مطلق

$path = $_GET['redirect'];
if ( strpos( $path, '/' ) !== 0 || strpos( $path, '//' ) === 0 ) {
    wp_die( 'مسیر نامعتبر' );
}
wp_safe_redirect( home_url( $path ) );
exit;

این الگو، فقط مسیرهای نسبی داخلی را می‌پذیرد و از هدایت به دامنه خارجی جلوگیری می‌کند.

لایه ۴: استفاده از nonce

در برخی موارد، می‌توان از nonce برای اطمینان از اعتبار URL استفاده کرد:

$url = add_query_arg( 'nonce', wp_create_nonce( 'safe_redirect' ), home_url( $path ) );

// در سمت سرور:
if ( ! wp_verify_nonce( $_GET['nonce'], 'safe_redirect' ) ) {
    wp_die( 'درخواست نامعتبر' );
}

نقش wp_safe_redirect در دفاع

تابع wp_safe_redirect() در وردپرس به‌طور خودکار دامنه‌های خارجی را رد می‌کند. اما این تابع کامل نیست:

  • اگر سایت شما از subdomain استفاده می‌کند، این subdomainها ممکن است رد شوند.
  • در برخی موارد، تنظیمات سرور می‌تواند آن را دور بزند.
  • تابع wp_validate_redirect() که در پشت آن است، باید به‌درستی پیکربندی شود.

یک نمونه جامع:

$url = $_GET['redirect_to'];

// wp_safe_redirect به‌طور خودکار wp_validate_redirect را فراخوانی می‌کند
wp_safe_redirect( $url );
exit;

برای درک عمیق‌تر، خطای ریدایرکت مداوم را ببینید.

الگوی whitelist در دامنه مجاز

الگوی whitelist را می‌توان در همه جا پیاده کرد:

function myplugin_safe_redirect( $url ) {
    $allowed = [
        'dashboard' => admin_url( 'index.php' ),
        'profile' => admin_url( 'profile.php' ),
        'settings' => admin_url( 'options-general.php' ),
    ];
    
    $key = sanitize_key( $_GET['redirect'] );
    if ( isset( $allowed[ $key ] ) ) {
        wp_safe_redirect( $allowed[ $key ] );
        exit;
    }
    
    wp_safe_redirect( admin_url() );
    exit;
}

این الگو، هم امن است و هم خوانایی کد را بالا می‌برد. برای درک عمیق‌تر ساختار افزونه، ساختار استاندارد افزونه وردپرس را ببینید.

اشتباهات رایج در دفع Open Redirect

  • استفاده از wp_redirect() به‌جای wp_safe_redirect(): نسخه امن باید استفاده شود.
  • اعتماد به strpos() ساده: https://trusted-site.com.fake.com رد نمی‌شود.
  • نادیده گرفتن // در ابتدای URL: به دامنه خارجی هدایت می‌کند.
  • اعتماد به filter_var به‌تنهایی: فقط معتبر بودن URL را بررسی می‌کند، نه دامنه.
  • نادیده گرفتن encoding: مهاجم از %2F%2F استفاده می‌کند.
  • عدم اعتبارسنجی دامنه: فقط بررسی می‌شود که URL معتبر است.
  • اعتماد به wp_validate_redirect به‌تنهایی: باید با whitelist ترکیب شود.
  • عدم مدیریت subdomain: در سایت‌های چندزبانه، subdomainها باید اضافه شوند.
  • نادیده گرفتن REST API: در endpointها هم Open Redirect ممکن است.
  • اعتماد به افزونه‌های شخص‌ثالث: بسیاری از افزونه‌ها Open Redirect دارند.

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

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

Open Redirect چیست و چرا خطرناک است؟ نوعی آسیب‌پذیری که در آن کاربر بر اساس پارامتر ورودی به دامنه خارجی هدایت می‌شود. برای فیشینگ و توزیع بدافزار استفاده می‌شود.

تفاوت Open Redirect و ریدایرکت معمولی چیست؟ در ریدایرکت معمولی، مقصد ثابت است؛ در Open Redirect، مقصد از ورودی کاربر می‌آید.

آیا wp_safe_redirect() کافی است؟ در بیشتر موارد بله، اما برای امنیت حداکثری باید با whitelist ترکیب شود.

چطور بفهمم سایت من Open Redirect دارد؟ URLها را بررسی کنید. هر جا پارامتر redirect، url، یا return باشد، یک نقطه خطر است.

آیا Open Redirect روی SEO تأثیر دارد؟ بله، در صورت سوءاستفاده، Google دامنه شما را blacklist می‌کند و رتبه کاهش می‌یابد.

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

چطور Open Redirect را در REST API دفع کنم؟ با whitelist دامنه و استفاده از wp_safe_redirect.

آیا Open Redirect می‌تواند به سرقت OAuth منجر شود؟ بله، در جریان‌های OAuth، توکن می‌تواند به دامنه مهاجم ارسال شود. برای مرور، OAuth و ورود با گوگل را ببینید.

برای مطالعه بیشتر درباره Open Redirect، صفحه Open redirect در ویکی‌پدیا مفید است.

خط پایان

Open Redirect Prevention در وردپرس یکی از آن لایه‌های امنیتی است که در سایه XSS و SQL Injection کمتر دیده می‌شود، اما پیامدهای آن می‌تواند از سرقت اعتبارنامه تا blacklist شدن دامنه متغیر باشد. در بستر وردپرس، استفاده گسترده از تغییر مسیر پویا در افزونه‌ها و قالب‌ها، سطح حمله را بزرگ می‌کند. دفاع مؤثر نیازمند ترکیب چند لایه است: استفاده از wp_safe_redirect()، whitelist دامنه، مسیر نسبی، و توجه به REST API. اگر سایت شما فرم ورود، خروج، یا پرداخت دارد، همین امروز بازبینی کنید. نکته مهم این است که Open Redirect یک آسیب‌پذیری «کم‌خطر» نیست و باید با همان جدیت XSS و SQL Injection با آن برخورد کرد.

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