【问题标题】:Joomla error: 'Illegal variable _files or _env or _get or _post or _cookie or _server or _session or globals passed to script'Joomla 错误:“传递给脚本的非法变量 _files 或 _env 或 _get 或 _post 或 _cookie 或 _server 或 _session 或全局变量”
【发布时间】:2011-12-02 13:01:04
【问题描述】:

我在 Joomla 中收到此错误:

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

我在谷歌上没有得到太多帮助。

【问题讨论】:

  • 你知道所有这些变量都是大写的,例如$_POST,对吧?
  • 一些代码和更多细节会很好......
  • 你能提供更多关于你想要做什么的信息吗?你运行了什么脚本?
  • 哇。一条新的错误信息。在这里,我认为 PHP 没有更多的秘密了 :)
  • @halfer 我的朋友这个问题不清楚。这是实际的错误消息。该代码只是一个提交一些输入字段的表单。我也不确定我应该在这里发布什么。带字段的表单?这对任何人都没有兴趣。我认为以前已经看过此内容的人可以发布一些提示。

标签: php forms joomla


【解决方案1】:

如果您尝试指定名称仅由数字组成的 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.' );
    }
    ...
}

请注意,该错误消息特别具有误导性,因为不仅在保留变量名称的情况下会引发错误消息,而且在参数名称为数字的情况下也会引发。

【讨论】:

【解决方案2】:

这不是 PHP 生成的错误,而是似乎属于 Joomla! 的错误。在谷歌搜索“非法变量”20 秒后,我找到了this page

【讨论】:

    【解决方案3】:

    我必须为 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 引起了问题,所以因为这是一个最小的脚本,我可以在加载 joomla 之前简单地将信息从 $_FILES 转移到其他地方

    例如这样:

    $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';
    

    请注意,在包含/includes/framework.php 之后,您不能使用变量$files,因为joomla 会用null 覆盖它

    【讨论】:

      【解决方案4】:

      唯一有效的解决方案是在 request.php 文件中删除以下行

      找到文件 /{your_joomla_folder}/libraries/joomla/environment/request.php

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多