Ошибка Joomla: «Недопустимая переменная _files или _env или _get или _post или _post или _cookie или _server или _session или globals передана в скрипт» - PullRequest
2 голосов
/ 02 декабря 2011

Я получаю эту ошибку в Joomla:

Illegal variable `_files` or `_env` or `_get` or `_post` or `_cookie`
or `_server` or `_session` or `globals` passed to script.

Я не получил много помощи в поиске Google.

Ответы [ 4 ]

9 голосов
/ 02 декабря 2011

Вы увидите эту ошибку, если попытаетесь указать параметр URL, имя которого состоит только из цифр, например,

http://www.example.com/?1234567=test

или если вы попытаетесь использовать зарезервированную переменную joomla, например,

http://www.example.com/?_files=test

Это не очень хорошее сообщение об ошибке. Если у вас есть доступ к Unix-терминалу, вы можете отлаживать подобные проблемы с помощью некоторых инструментов командной строки, например,

$ find /var/www/html -exec grep -l 'Illegal variable' {} \;
/var/www/html/libraries/joomla/environment/request.php

Это вымышленная установка joomla, предполагающая довольно стандартную DocumentRoot. Результат немедленно подтверждает, что это ошибка Joomla, и сообщает, какой файл вызвал ее. Извлечение из этого файла:

static $banned = array( '_files', '_env', '_get', '_post', '_cookie', '_server', '_session', 'globals' );

foreach ($array as $key => $value)
{   
    // PHP GLOBALS injection bug 
    $failed = in_array( strtolower( $key ), $banned );

    // PHP Zend_Hash_Del_Key_Or_Index bug 
    $failed |= is_numeric( $key );

    if ($failed) {
        jexit( 'Illegal variable <b>' . implode( '</b> or <b>', $banned ) . '</b> passed to script.' );
    }
    ...
}

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

4 голосов
/ 02 декабря 2011

Это не ошибка, которую генерирует PHP, это ошибка, которая, похоже, принадлежит Joomla !. Я нашел эту страницу после 20 секунд поиска в Google для "Недопустимая переменная".

0 голосов
/ 14 апреля 2014

Единственное решение, которое сработало , это подключить следующую строку в request.php file

Найдите файл / {your_joomla_folder} / library / joomla /environment / request.php

// $ failed | = is_numeric ($ key);

0 голосов
/ 30 января 2014

Мне пришлось исправить это для joomla 1.5

Вот как я это сделал

Найдите файл / enjyour_joomla_folder‹/libraries/joomla/environment/request.php

И сделайте ошибку более дружественной

function clean()
{
    JRequest::_cleanArray( $_FILES , false, 'FILES');
    JRequest::_cleanArray( $_ENV , false, 'ENV' );
    JRequest::_cleanArray( $_GET , false, 'GET' );
    JRequest::_cleanArray( $_POST , false, 'POST' );
    JRequest::_cleanArray( $_COOKIE , false, 'COOKIE' );
    JRequest::_cleanArray( $_SERVER , false, 'SERVER' );

    if (isset( $_SESSION )) {
        JRequest::_cleanArray( $_SESSION , false, 'SESSION' );
    }

    $REQUEST    = $_REQUEST;
    $GET        = $_GET;
    $POST       = $_POST;
    $COOKIE     = $_COOKIE;
    $FILES      = $_FILES;
    $ENV        = $_ENV;
    $SERVER     = $_SERVER;

    if (isset ( $_SESSION )) {
        $SESSION = $_SESSION;
    }

    foreach ($GLOBALS as $key => $value)
    {
        if ( $key != 'GLOBALS' ) {
            unset ( $GLOBALS [ $key ] );
        }
    }
    $_REQUEST   = $REQUEST;
    $_GET       = $GET;
    $_POST      = $POST;
    $_COOKIE    = $COOKIE;
    $_FILES     = $FILES;
    $_ENV       = $ENV;
    $_SERVER    = $SERVER;

    if (isset ( $SESSION )) {
        $_SESSION = $SESSION;
    }

    // Make sure the request hash is clean on file inclusion
    $GLOBALS['_JREQUEST'] = array();
}
function _cleanArray( &$array, $globalise=false, $type=null )
{
    static $banned = array( '_files', '_env', '_get', '_post', '_cookie', '_server', '_session', 'globals' );

    foreach ($array as $key => $value)
    {
        // PHP GLOBALS injection bug
        $failed = in_array( strtolower( $key ), $banned );
        $is_injection = false;
        if($failed){
            $is_injection = true;
        }

        // PHP Zend_Hash_Del_Key_Or_Index bug
        $failed |= is_numeric( $key );
        if ($failed) {
            if($type){
                $str = $type;
            }else{
                $str = implode( '</b> or <b>', $banned );
            }
            throw new Exception( 'Illegal variable <b>' . $str . '</b> passed to script.'.(($is_injection)?' (globals injection)': ' key "'.$key.'" is numeric in '.$str) );
            //jexit( 'Illegal variable <b>' . implode( '</b> or <b>', $banned ) . '</b> passed to script.' );
        }
        if ($globalise) {
            $GLOBALS[$key] = $value;
        }
    }
}

В моем случае AJAX-скрипт загружал файлы как

$_FILES = array(
    0=>array(
        [name] => 6767.bmp
    [type] => image/bmp
    [tmp_name] => /tmp/phpfbIzXU
    [error] => 0
    [size] => 12774
    ),
);

0 вызывал проблемы, так как это был минимальный скрипт, я могпросто передайте информацию из $_FILES куда-нибудь еще до того, как Joomla загрузит

, например, так:

$files = array();
foreach($_FILES as $f){
    $files[] = $f;
}
$_FILES = array('files'=>$files);

... joomla launch code...
define( '_JEXEC', 1 );
define('JPATH_BASE', realpath(dirname(dirname(__FILE__).'/')));
define( 'DS', DIRECTORY_SEPARATOR );
require JPATH_BASE . DS . 'includes' . DS . 'defines.php';
require JPATH_BASE . DS . 'includes' . DS . 'framework.php';

Обратите внимание, что вы не можете использовать переменную $files после включения /includes/framework.php поскольку joomla бесполезно перезапишет его с нулем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...