Я получаю эту ошибку в Joomla:
Illegal variable `_files` or `_env` or `_get` or `_post` or `_cookie` or `_server` or `_session` or `globals` passed to script.
Я не очень помог по поиску.
Вы увидите эту ошибку, если попытаетесь указать параметр URL, чье имя состоит только из цифр, например
http://www.example.com/?1234567=test
или если вы пытаетесь использовать переменную joomla-reserved, например
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.' ); } ... }
Обратите внимание, что сообщение об ошибке особенно вводит в заблуждение, потому что оно не только генерируется в случае зарезервированного имени переменной, но также и если имя параметра является числовым.
Это не ошибка PHP, это ошибка, которая, похоже, принадлежит Joomla !. Я нашел эту страницу после 20 секунд Google для «Недопустимой переменной».
Я должен был исправить это для joomla 1.5
Вот как я это сделал
Найдите файл /{your_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 бесполезно перезапишет его нулевым
Единственное решение, которое сработало, – это вывести следующую строку в файле request.php
Найдите файл /{your_joomla_folder}/libraries/joomla/environment/request.php
// $ failed | = is_numeric ($ key);