WordPress 2.8 и $_REQUEST

Vladimir
Опубликовано в: WordPress

Очередное нововведение в WordPress

Тем, у кого возникли проблемы с интеграцией в WordPress сторонних приложений, использующих аутентификацию по cookie: разработчики в релизе 2.8 переплюнули сами себя и добавили одну фичу: выбросили из суперглобальной переменной $_REQUEST данные из $_COOKIE.

Я не знаю, какая реальная польза от этого — на мой взгляд, использовать $_REQUEST вместо $_GET и $_POST не совсем разумно и чревато CSRF-атаками, если не принимать специальных мер — зато есть проблемы: приложения, которые используют $_REQUEST, для того, чтобы вытянуть cookie (в частности, это phpBB), перестают работать.

Эта misfeature находится в файле wp-settings.php в районе 50-й строки:

[-]
View Code PHP
  1. // Force REQUEST to be GET + POST.  If SERVER, COOKIE, or ENV are needed, use those superglobals directly.
  2. $_REQUEST = array_merge($_GET, $_POST);

Я не знаю, что разработчики имели в виду, упоминая $_SERVER и $_ENV в комментарии, так как их значения в $_REQUEST не попадают: в общем случае,

[-]
View Code PHP
$_REQUEST = array_merge($_GET, $_POST, $_COOKIE);

с поправкой на значение параметра variables_order и, начиная с PHP 5.3.0, параметра request_order.

Тем, кому новое поведение WordPress очень мешает, могу предложить два выхода:

  1. Закомментировать строку $_REQUEST = array_merge($_GET, $_POST);
  2. Написать плагин, который по событию plugins_loaded восстанавливает $_REQUEST из $_GET, $_POST и $_COOKIE. Простейшая реализация будет выглядеть так:
    [-]
    View Code PHP
    function 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 — нет.
[-]
View Code PHP
  1. // If already slashed, strip.
  2. if ( get_magic_quotes_gpc() ) {
  3.         $_GET    = stripslashes_deep($_GET   );
  4.         $_POST   = stripslashes_deep($_POST  );
  5.         $_COOKIE = stripslashes_deep($_COOKIE);
  6. }
  7.  
  8. // Escape with wpdb.
  9. $_GET    = add_magic_quotes($_GET   );
  10. $_POST   = add_magic_quotes($_POST  );
  11. $_COOKIE = add_magic_quotes($_COOKIE);
  12. $_SERVER = add_magic_quotes($_SERVER);

Такие вот пироги.

Добавить в закладки

Связанные записи

14
Июнь
2009

Комментарии к статье «WordPress 2.8 и $_REQUEST»  »

К статье «WordPress 2.8 и $_REQUEST» комментариев пока нет. Не хотите ли стать первым?

Подписаться на RSS-ленту комментариев к статье «WordPress 2.8 и $_REQUEST» Trackback URL: http://blog.sjinks.org.ua/wordpress/578-wordpress-28-and-request-superglobal/trackback/

Оставить комментарий к записи «WordPress 2.8 и $_REQUEST»

Вы можете использовать данные тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, Вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя