Добавление admin-ajax.php в веб-интерфейс. Хорошая или плохая идея?

17

Я люблю admin-ajax.php. Но я ненавижу локализацию, чтобы указывать на нее сценарии внешнего интерфейса, и мне хотелось бы, чтобы для тем был эквивалентный, легкий для поиска файл. (Меня также беспокоит то, что запросы внешнего интерфейса проходят через «/ wp-admin /». Нет практической причины, просто выглядит ужасно IMO.)

Поэтому я просто скопировал admin-ajax.php в корневой каталог по адресу /ajax.php, отрегулировал пути включения и удалил определение константы WP_ADMIN. Кажется, работает как gangbusters (теперь я могу просто направить все свои запросы AJAX внешнего интерфейса в /ajax.php! И я все еще могу использовать обычные хуки wp_ajax в моих плагинах!).

Но безопасно ли это? Что может пойти не так? Поскольку это не встроено в ядро, я предполагаю, что есть веская причина, почему бы и нет. Но просматривая код, я не вижу никаких непосредственных проблем.

Ты умный - скажи мне, если этот подход сумасшедший. Или, если есть более простой метод, который я пропускаю.

MathSmath
источник
Вы можете забыть и пропустить этот файл во время автоматических обновлений, что может привести к поломке и оставлению уязвимостей в безопасности.
Хемм

Ответы:

19

Вы можете просто использовать RewriteRule для вашего .htaccess выше обычных правил перезаписи постоянных ссылок:

RewriteRule ^ajax$ /wp-admin/admin-ajax.php [L]

Теперь отправляйте ваши AJAX-запросы example.com/ajaxи никогда не пропускайте основные изменения в этом файле после обновлений.

Фуксия
источник
Отличная идея! Это одна из тех вещей, которые, услышав это, вы думаете: «Это так просто и очевидно!» Благодарю.
MathSmath
Я добавил правило переписывания согласно вашему предложению, но example.com/ajaxURL 404. Не могли бы вы уточнить, где именно в этом .htaccessя должен добавить это. У меня есть это в настоящее время между # BEGIN WordPress <IfModule mod_rewrite.c>и</IfModule> # END WordPress
Джон
Это работает. Мне не хватало косой черты. У меня установлены постоянные ссылки /% postname% /
John
7

Первое: стандартизация. Если вы планируете использовать плагины сообщества, скорее всего, они не будут заботиться о вашем /ajax.phpфайле в корне документа. Таким образом, они не будут использовать это.

Если вы собираетесь свернуть все сами, это не проблема.

Второе: что если обновится ядро? Будете ли вы отслеживать и изменять свой AJAX-файл?

Третье : несмотря admin-ajax.phpна то wp-admin, что оно находится в нем , оно не загружает какие-либо вещи из области администрирования (например, таблицы списков и т. Д.). Он также не проверяет подлинность и не выставляет что-либо, чувствительное к незарегистрированным пользователям. Другими словами, это как интерфейсный файл. Не о чем беспокоиться.

В-четвертых: в связи с первой проблемой некоторые плагины проверяют перед слепой загрузкой функций, связанных с ajax. Пример ниже. Ваш измененный файл ajax.php, скорее всего, не приведет к загрузке.

<?php
if (is_admin() && defined('DOING_AJAX') && DOING_AJAX) {
    //  load ajax stuff
}

И наконец: то, на что вы жалуетесь, полезно использовать локализацию для получения URL-адреса Ajax. Почему? Потому что Ваши JS-файлы не знают ничего о стороне сервера. Вы собираетесь использовать URL, который сломается, если / когда сайт переместится? Похоже, плохой выбор.

Если вы действительно не хотите локализовать каждый сценарий, использующий Ajax, просто подключитесь к нему wp_headочень рано и выложите админский URL-адрес администратора. Проблема решена (кстати, именно так и поступает админка).

<?php
add_action('wp_head', 'wpse83650_lazy_ajax', 0, 0);
function wpse83650_lazy_ajax()
{
    ?>
    <script type="text/javascript">
    /* <![CDATA[ */
    var ajax_url = "<?php echo esc_js(admin_url('admin-ajax.php')); ?>";
    /* ]]> */
    </script>
    <?php
}
chrisguitarguy
источник
Спасибо, Крис! Все действительные баллы. Самое важное, что вы помогли мне понять, это то, что, хотя я не думал об этом как о «взломе ядра» (поскольку я добавлял, а не изменял файл), это действительно так, поскольку это зависит от других функций в ядре, которые могут измениться. , Не слишком сильно отличается от любого другого плагина (который также может умереть после изменений в основной функциональности), но определенно философски отличается. Спасибо за мысли!
MathSmath
Re: «В- третьих: ... Не о чем беспокоиться. », Как насчет того, чтобы попытаться заблокировать каталог wp-admin, например, используя правила .htaccess для ограничения известных безопасных диапазонов IP-адресов? Я предполагаю, что нужно сделать какое-то исключение для файла ajax-admin.php? (Я говорю «презумпция», потому что я ничего не понимаю, когда речь идет о правилах .htaccess, и не знаю, возможно ли это?).
Сепстер
Должно быть возможно разрешить один файл, да.
chrisguitarguy
@ chrisguitarguy, это блестящий ответ, спасибо. Я пытаюсь загрузить admin-ajax на передний конец, так как я возвращаю проставку siteurl к моей промежуточной / домашней ссылке. Пожалуйста, посмотрите на это: ссылка Возможно ли это сделать с помощью стороннего плагина? Мой подход неверен?
Paranza
5

Как и во многих вещах в WordPress, существует почти бесконечное количество способов скинуть кошку. Хотя все принятые методы работают, я обнаружил, что они менее «аккуратны», чем использование wp_localize_script для включения возможности ajax во внешнем интерфейсе.

Проверь это:

add_action( 'wp_enqueue_scripts', 'se83650_js' );
function se83650_js()
{
    wp_enqueue_script( 'se83650-js', plugin_dir_url( __FILE__ ) . 'js/se83650.js',  'jquery', '1.0.0', true );
    // First param is the name of the script you are attaching it to - in this case
    // it is the name of the custom script we added.  Second param is the name of 
    // the javscript Object that will be attached with your information.
    // Third param is an array of attributes, in this case, ajaxurl
    wp_localize_script( 'se83650-js', 'se83650Ajax', 
        array(
            // You can put any variables here you want for your script
            // such as plugin-specific variables or nonces, etc.
            'ajaxurl'    => admin_url( 'admin-ajax.php' )
        )
    );
}

И затем в se83650.jsфайле вы бы ссылались на вашу переменную с помощью se83650Ajax.ajaxurl.

Преимущество этого метода заключается в том, что, если у вас будет множество плагинов, которые пытаются дублировать эту функцию, они не будут включать или перезаписывать одну и ту же переменную. ajaxurlдовольно общий для включения, он делает вас более замкнутым и лучше взаимодействует с другими разработчиками.

bybloggers
источник