Есть ли способ полностью отключить пингбэки/трекбэки?

24 окт. 2011 г., 17:58:53
Просмотры: 15.2K
Голосов: 16

Есть возможность отключить трекбэки/пингбэки в разделе Настройки > Обсуждение.

Но я хотел бы удалить заголовок X-Pingback, который отправляет WordPress, и полностью убрать конечную точку trackback.

Есть ли способ это сделать?

0
Все ответы на вопрос 2
4
14
<?php
/*
Plugin Name: [RPC] Блог без XMLRPC
Plugin URI: http://earnestodev.com/
Description: Отключает рекламу/функциональность XMLRPC в блоге.
Version: 0.0.7
Author: EarnestoDev
Author URI: http://earnestodev.com/
*/
// Отключаем заголовок X-Pingback HTTP.
add_filter('wp_headers', function($headers, $wp_query){
    if(isset($headers['X-Pingback'])){
        // Удаляем X-Pingback
        unset($headers['X-Pingback']);
    }
    return $headers;
}, 11, 2);
// Отключаем XMLRPC, перехватывая и блокируя опцию.
add_filter('pre_option_enable_xmlrpc', function($state){
    return '0'; // return $state; // Чтобы оставить XMLRPC и отключить только Pingback
});
// Удаляем rsd_link из фильтров (<link rel="EditURI" />).
add_action('wp', function(){
    remove_action('wp_head', 'rsd_link');
}, 9);
// Перехватываем pingback_url для get_bloginfo (<link rel="pingback" />).
add_filter('bloginfo_url', function($output, $property){
    return ($property == 'pingback_url') ? null : $output;
}, 11, 2);
// Просто отключаем функциональность pingback.ping, оставляя XMLRPC?
add_action('xmlrpc_call', function($method){
    if($method != 'pingback.ping') return;
    wp_die(
        'Функциональность Pingback отключена в этом блоге.',
        'Pingback отключен!',
        array('response' => 403)
    );
});
?>

Используйте этот код для плагина в /wp-content/plugins или /wp-content/mu-plugins (для автоматической активации). Или в functions.php.

24 окт. 2011 г. 18:37:36
Комментарии

return '0' не будет работать так, как вы ожидаете. Строка '0' вернет true. add_filter( 'pre_option_enable_xmlrpc', '__return_false' );

chrisguitarguy chrisguitarguy
24 окт. 2011 г. 18:47:44

var_dump((bool)'0');

EarnestoDev EarnestoDev
24 окт. 2011 г. 18:51:54

Смотрите get_option и как работает перехват pre_option_*. Если вы используете __return_false... это игнорируется, и обработка продолжается как обычно. Вы не должны возвращать ничего === false. Смотрите код.

EarnestoDev EarnestoDev
24 окт. 2011 г. 18:54:06

Спасибо за помощь. Добавил еще один способ отключения правил перезаписи: https://gist.github.com/1309433

chrisguitarguy chrisguitarguy
24 окт. 2011 г. 19:27:02
0

@EarnestoDev дал отличный ответ, но сейчас он немного устарел из-за недавних уязвимостей в xml-rpc.

Я создал обновленную версию, которая, как мне кажется, блокирует все возможные доступы к нему. Однако учтите, что есть несколько плагинов, которые используют функционал пингбэков/трекбэков XML-RPC и могут иметь проблемы, если вы их используете:

  • Мобильное приложение WordPress
  • JetPack LibSyn (для подкастов)
  • Некоторые части BuddyPress
  • Windows Live Writer
  • IFTTT
  • Некоторые плагины галерей

Ниже представлена обновленная версия. Чтобы скачать ее, вы можете скопировать код в файл плагина, поместить его в mu-plugins или загрузить на github:

<?php
/*
Plugin Name:        BYE BYE Pingback
Plugin URI:         https://github.com/Wordpress-Development/bye-bye-pingback/
Description:        Удаление пингбэков в WordPress
Version:            1.0.0
Author:             bryanwillis
Author URI:         https://github.com/bryanwillis/
*/

// Если файл вызывается напрямую, завершаем работу.
if ( ! defined( 'WPINC' ) ) {
    die;
}

/**
 * Директива .htaccess для блокировки xmlrpc в целях безопасности.
 * Примеры правил перезаписи:
 *   404 - RewriteRule xmlrpc\.php$ - [R=404,L]
 *   301 - RewriteRule ^xmlrpc\.php$ index.php [R=301]
 * Если нужна кастомная 404, убедитесь, что сервер находит её, добавив 'ErrorDocument 404 /index.php?error=404' или 'ErrorDocument 404 /wordpress/index.php?error=404' для сайтов в поддиректории.
 */ 
add_filter('mod_rewrite_rules', 'noxmlrpc_mod_rewrite_rules'); // стоит ли помещать это в хук wp_loaded или активации
function noxmlrpc_mod_rewrite_rules($rules) {
  $insert = "RewriteRule xmlrpc\.php$ - [F,L]";
  $rules = preg_replace('!RewriteRule!', "$insert\n\nRewriteRule", $rules, 1);
  return $rules;
}

register_activation_hook(__FILE__, 'noxmlrpc_htaccess_activate');
function noxmlrpc_htaccess_activate() {
  flush_rewrite_rules(true);
}

register_deactivation_hook(__FILE__, 'noxmlrpc_htaccess_deactivate');
function noxmlrpc_htaccess_deactivate() {
  remove_filter('mod_rewrite_rules', 'noxmlrpc_mod_rewrite_rules');
  flush_rewrite_rules(true);
}


// Удаляем rsd_link из фильтров - link rel="EditURI"
add_action('wp', function(){
    remove_action('wp_head', 'rsd_link');
}, 9);


// Удаляем пингбэк из head (link rel="pingback")
if (!is_admin()) {      
    function link_rel_buffer_callback($buffer) {
        $buffer = preg_replace('/(<link.*?rel=("|\')pingback("|\').*?href=("|\')(.*?)("|\')(.*?)?\/?>|<link.*?href=("|\')(.*?)("|\').*?rel=("|\')pingback("|\')(.*?)?\/?>)/i', '', $buffer);
                return $buffer;
    }
    function link_rel_buffer_start() {
        ob_start("link_rel_buffer_callback");
    }
    function link_rel_buffer_end() {
        ob_flush();
    }
    add_action('template_redirect', 'link_rel_buffer_start', -1);
    add_action('get_header', 'link_rel_buffer_start');
    add_action('wp_head', 'link_rel_buffer_end', 999);
}


// Возвращаем пустой pingback_url (<link rel="pingback" href>).
add_filter('bloginfo_url', function($output, $property){
    return ($property == 'pingback_url') ? null : $output;
}, 11, 2);


// Отключаем xmlrpc/pingback
add_filter( 'xmlrpc_enabled', '__return_false' );
add_filter( 'pre_update_option_enable_xmlrpc', '__return_false' );
add_filter( 'pre_option_enable_xmlrpc', '__return_zero' );

// Отключаем трекбэки
add_filter( 'rewrite_rules_array', function( $rules ) {
    foreach( $rules as $rule => $rewrite ) {
        if( preg_match( '/trackback\/\?\$$/i', $rule ) ) {
            unset( $rules[$rule] );
        }
    }
    return $rules;
});


// Отключаем X-Pingback HTTP Header.
add_filter('wp_headers', function($headers, $wp_query){
    if(isset($headers['X-Pingback'])){
        unset($headers['X-Pingback']);
    }
    return $headers;
}, 11, 2);


add_filter( 'xmlrpc_methods', function($methods){
    unset( $methods['pingback.ping'] );
    unset( $methods['pingback.extensions.getPingbacks'] );
    unset( $methods['wp.getUsersBlogs'] ); // Блокируем брутфорс-обнаружение существующих пользователей
    unset( $methods['system.multicall'] );
    unset( $methods['system.listMethods'] );
    unset( $methods['system.getCapabilities'] );
    return $methods;
});


// Просто отключаем функционал pingback.ping, оставляя XMLRPC рабочим?
add_action('xmlrpc_call', function($method){
    if($method != 'pingback.ping') return;
    wp_die(
        'Этот сайт не поддерживает пингбэки.',
        'Пингбэки отключены!',
        array('response' => 403)
    );
});


Также, если вы хотите закрыть все существующие пингбэки, выполните следующие шаги:

1) Откройте phpmyadmin и перейдите в раздел SQL:

sql

2) Введите следующее:

UPDATE wp_posts SET ping_status="closed";

3) Все существующие пингбэки теперь должны быть закрыты

23 нояб. 2015 г. 17:03:38