وندا نوژن
سایتهای فروشگاهی وردپرسی از زمان ارتقای وردپرس خود به نسخه 4.7 و بالاتر با مشکلی در نماد اعتماد خود روبرو شدند؛ به طوری که که برخلاف گذشته، کلیک بر روی نماد اعتماد به پیام خطای «صفحه مورد نظر یافت نشد» ختم میشد. اما داستان از چه قرار است و چکار باید کرد؟
دلیل خطا
اگر به کدهای html لینک نماد اعتماد نگاه کنیم، دو ویژگی را میبینیم. یعنی تعریف تارگت لینک به صورت _blank که باعث میشود لینک در تب جدید باز شود و دیگری تگِ noopener noreferrer که وردپرس به خاطر مسائل امنیتی و جلوگیری از نوع خاصی از حمله فیشینگ، به هر لینکی با این تارگت اختصاص داد. ترکیب این دو ویژگی با هم باعث بروز چنین خطایی پس از باز کردن نماد اعتماد میشود.
منطق فنی وردپرس
این اقدام وردپرس اساسا برای جلوگیری از نوعی حمله فیشینگ موسوم به «تَبقاپی معکوس» (Reverse Tabnabbing) بوده که طی آن هکر سعی میکند با استفاده از اسکریپت window.opener.location.assign() تبِ اصلی را بقاپد و به جای آن یک داکیومنت آلوده قرار بدهد.
بنابراین ویژگی noreferrer به مرورگر شما میگوید که پس از کلیک بر روی لینک، اطلاعات http از صفحه مرجع را (اعم از لوکیشن، نوع مرورگر، نوع دستگاه و غیره) جمعآوری نکند و ویژگی noopener هم باعث میشود که صفحه جدید نتواند از طریق اسکریپت window.opener اطلاعات صفحه مرجع را به سرقت ببرد یا کدهای مخرب را واردش کند.
حل مساله
حالا که دلیل مشکل روشن شد، راهکار آن هم ساده است. کافی است کدهای زیر را در انتهای فایل functions.php قرار بدهید تا این ویژگیها را حذف کند:
//This code removes noreferrer from your new or updated posts
add_filter( 'wp_targeted_link_rel', 'my_targeted_link_rel_remove_noreferrer',999);
function my_targeted_link_rel_remove_noreferrer( $rel_values ) {
return preg_replace( '/noreferrers*/i', '', $rel_values );
}
//This code removes noopener from your new or updated posts
add_filter( 'wp_targeted_link_rel', 'my_targeted_link_rel_remove_noopener',999);
function my_targeted_link_rel_remove_noopener( $rel_values ) {
return preg_replace( '/noopeners*/i', '', $rel_values );
}
//remove noreferrer on the frontend, *will still show up in the editor.*
function my_formatter($content) {
$replace = array(" noreferrer" => "" );
$new_content = strtr($content, $replace);
return $new_content;
}
//remove noopener on the frontend, *will still show up in the editor.*
function noopener_formatter($content) {
$replace = array("noopener" => "" );
$new_content = strtr($content, $replace);
return $new_content;
}
add_filter('the_content', 'noopener_formatter', 999);
add_filter('the_content', 'my_formatter', 999);