WordPress 2.8 и $_REQUEST
Очередное нововведение в WordPress
Тем, у кого возникли проблемы с интеграцией в WordPress сторонних приложений, использующих аутентификацию по cookie: разработчики в релизе 2.8 переплюнули сами себя и добавили одну фичу: выбросили из суперглобальной переменной $_REQUEST данные из $_COOKIE.
Я не знаю, какая реальная польза от этого — на мой взгляд, использовать $_REQUEST вместо $_GET и $_POST не совсем разумно и чревато CSRF-атаками, если не принимать специальных мер — зато есть проблемы: приложения, которые используют $_REQUEST, для того, чтобы вытянуть cookie (в частности, это phpBB), перестают работать.
Эта misfeature находится в файле wp-settings.php в районе 50-й строки:
- // Force REQUEST to be GET + POST. If SERVER, COOKIE, or ENV are needed, use those superglobals directly.
- $_REQUEST = array_merge($_GET, $_POST);
Я не знаю, что разработчики имели в виду, упоминая $_SERVER и $_ENV в комментарии, так как их значения в $_REQUEST не попадают: в общем случае,
с поправкой на значение параметра variables_order и, начиная с PHP 5.3.0, параметра request_order.
Тем, кому новое поведение WordPress очень мешает, могу предложить два выхода:
- Закомментировать строку
$_REQUEST = array_merge($_GET, $_POST); - Написать плагин, который по событию
plugins_loadedвосстанавливает$_REQUESTиз$_GET,$_POSTи$_COOKIE. Простейшая реализация будет выглядеть так:[-]View Code PHPfunction restore_request_superglobal()
{
$_REQUEST = array_merge($_GET, $_POST, $_COOKIE);
}
add_action('plugins_loaded', 'restore_request_superglobal');
Пока я копался в коде WordPress, у меня возникло еще одно возражение против $_REQUEST: плагин, использующий $_REQUEST, не должен полагаться на то, что WordPress экранирует значения, делая их безопасными для использования в запросах. Строго говоря, плагин должен быть готов к тому, что данные могут быть как экранированы, так и не экранированы — все зависит от magic_quotes:
- если
magic_quotes_gpc = On, то$_GET,$_POST,$_COOKIE,$_SERVERи$_REQUESTбудут экранированы; - если
magic_quotes_gpc = Off, то$_GET,$_POST,$_COOKIEи$_SERVERбудут экранированы, а$_REQUEST— нет.
- // If already slashed, strip.
- if ( get_magic_quotes_gpc() ) {
- $_GET = stripslashes_deep($_GET );
- $_POST = stripslashes_deep($_POST );
- $_COOKIE = stripslashes_deep($_COOKIE);
- }
- // Escape with wpdb.
- $_GET = add_magic_quotes($_GET );
- $_POST = add_magic_quotes($_POST );
- $_COOKIE = add_magic_quotes($_COOKIE);
- $_SERVER = add_magic_quotes($_SERVER);
Такие вот пироги.
Связанные записи
Автор: Vladimir; опубликовано в: WordPress; метки: PHP, WordPressИюнь
2009


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.





