CodeIgniter不允许使用关键字符

时间:2010-11-16 19:08:54

标签: codeigniter

CodeIgniter给我一个Disallowed Key Characters错误。我已将其缩小到表单字段的name属性:name='prod[50-4121.5]'但我不知道该怎么办。

21 个答案:

答案 0 :(得分:34)

问题是您使用的是未包含在标准正则表达式中的字符。使用此:

<强> !preg_match("/^[a-z0-9\x{4e00}-\x{9fa5}\:\;\.\,\?\!\@\#\$%\^\*\"\~\'+=\\\ &_\/\.\[\]-\}\{]+$/iu", $str)

根据评论(和个人经验),您不应修改他们Input.php文件 - 而应该创建/使用您自己的MY_Input.php,如下所示:

<?php

class MY_Input extends CI_Input {

    /**
     * Clean Keys
     *
     * This is a helper function. To prevent malicious users
     * from trying to exploit keys we make sure that keys are
     * only named with alpha-numeric text and a few other items.
     * 
     * Extended to allow: 
     *      - '.' (dot), 
     *      - '[' (open bracket),
     *      - ']' (close bracket)
     * 
     * @access  private
     * @param   string
     * @return  string
     */
    function _clean_input_keys($str) {
        // UPDATE: Now includes comprehensive Regex that can process escaped JSON
        if (!preg_match("/^[a-z0-9\:\;\.\,\?\!\@\#\$%\^\*\"\~\'+=\\\ &_\/\.\[\]-\}\{]+$/iu", $str)) {
            /**
             * Check for Development enviroment - Non-descriptive 
             * error so show me the string that caused the problem 
             */
            if (getenv('ENVIRONMENT') && getenv('ENVIRONMENT') == 'DEVELOPMENT') {
                var_dump($str);
            }
            exit('Disallowed Key Characters.');
        }

        // Clean UTF-8 if supported
        if (UTF8_ENABLED === TRUE) {
            $str = $this->uni->clean_string($str);
        }

        return $str;
    }

}

// /?/> /* Should never close php file - if you have a space after code, it can mess your life up */

++汉字支持

// NOTE: \x{4e00}-\x{9fa5} = allow chinese characters
// NOTE: 'i' — case insensitive
// NOTE: 'u' — UTF-8 mode
if (!preg_match("/^[a-z0-9\x{4e00}-\x{9fa5}\:\;\.\,\?\!\@\#\$%\^\*\"\~\'+=\\\ &_\/\.\[\]-\}\{]+$/iu", $str) { ... }

// NOTE: When Chinese characters are provided in a URL, they are not 'really' there; the browser/OS
//   handles the copy/paste -> unicode conversion, eg:
//        一二三  -->  xn--4gqsa60b   
//   'punycode' converts these codes according to RFC 3492 and RFC 5891.
//   https://github.com/bestiejs/punycode.js ---  $ bower install punycode

答案 1 :(得分:27)

打开libraries/Input.php(CI版本2.0+中的system/core/Input.php)并找到function _clean_input_keys($str){,整个块应如下所示:

function _clean_input_keys($str)
{
    if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
    {
        exit('Disallowed Key Characters.');
    }

    return $str;
}

修改它允许新字符的PCRE。

请注意,缺少的字符是.(点),并且您应该始终在正则表达式中转义.(点),否则它们将允许任何单个字符。

/^[a-z0-9:_\/-\.]+$/i

答案 2 :(得分:9)

要将CodeIgniter与jQuery Ajax一起使用,请使用“Object”作为数据而不是Query string,如下所示:

$.ajax({
    url: site_url + "ajax/signup",
    data: ({'email': email, 'password': password}), //<--- Use Object
    type: "post",
    success: function(response, textStatus, jqXHR){
        $('#sign-up').html(response);
    },
    error: function(jqXHR, textStatus, errorThrown){
        console.log("The following error occured: "+
                    textStatus, errorThrown);
    }
});

答案 3 :(得分:2)

由于法国特色字符,我遇到了同样的问题。如果有人需要,这是我的课程。它必须保存在这里:/application/core/MY_Input.php

(此扩展程序将来也不允许报告女巫角色)

class MY_Input extends CI_Input {

function __construct() { parent::__construct(); } /** * Clean Keys * * This is a helper function. To prevent malicious users * from trying to exploit keys we make sure that keys are * only named with alpha-numeric text and a few other items. * * @access private * @param string * @return string */ function _clean_input_keys($str) { if ( ! preg_match("/^[a-z0-9:_\/-àâçéèêëîôùû]+$/i", $str)) { exit('Disallowed Key Characters : '.$str); } // Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { $str = $this->uni->clean_string($str); } return $str; }

}

阅读关于核心类扩展的友好手册:http://ellislab.com/codeigniter/user-guide/general/core_classes.html

答案 4 :(得分:2)

我发布了一个我的表格后,我遇到了同样的错误。他们在我的输入名称属性中有一个空格。输入名称=&#39;如first_name&#39;

修复摆脱错误。

答案 5 :(得分:2)

步骤1。在/system/core/Input.php上搜索函数_clean_input_keys

第二步。修改此行

退出('禁止关键字符'。);

退出('禁止关键字符。'。$ str);

步骤3。刷新页面以查看生成错误的字符

步骤4。如果您需要将这些字符添加到例外列表中,只需添加到此行

即可
  

if(!preg_match(“/ ^ [a-z0-9:_ / - ] + $ | / i”,$ str))

我添加|上面例子中的(管道)字符

答案 6 :(得分:2)

Php会评估你在[]括号之间写的内容。

$foo = array('eins', 'zwei', 'apples', 'oranges');
var_dump($foo[3-1]);

将生成string(6) "apples",因为它返回$ foo [2]。

如果你想将它作为一个字符串,请在它周围加上引号。

答案 7 :(得分:2)

打开libraries/Input.phpsystem/core/Input.php中的CI version 2.0+)并找到函数_clean_input_keys($str){

if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))修改为if ( ! preg_match("/^[a-z0-9:_\-|]+$/i", $str))

答案 8 :(得分:2)

我发布了一个我的表格后,我遇到了同样的错误。 我只是错过了一个输入名称属性中的开头引号。我有:

<input name=first_name">

修复摆脱错误。

答案 9 :(得分:2)

function _clean_input_keys($str)
{
if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
{
exit('Disallowed Key Characters.');
}

return $str;
}

请添加。$ str退出('禁止关键字符'。); 例如:exit('Disallowed Key Characters。'。$ str);

帮助您搜索流氓错误。

答案 10 :(得分:2)

从包含&符号的富文本编辑器发送数据时出现此错误。用%26替换&符号 - &符号的URL编码 - 解决了问题。我还发现像这样配置的jQuery ajax请求神奇地解决了这个问题:

request = $.ajax({
        "url": url,
        type: "PUT",
        dataType: "json",
        data: json
    });

对象json是令人惊讶的惊讶,一个JSON对象,其中包含一个包含&符号值的属性。

答案 11 :(得分:1)

在我的例子中,我使用jquery serialize()序列化输入表单,然后使用encodeURIComponent()对其进行urlencoding。

var datas = form.serialize();
encodeURIComponent(datas);
$.getJSON(url,datas,function(){});

和codeigniter给出了不允许的字符错误。

我认为这里的问题是,jquery serialize给出了一个编码输出,我再次用encodeURIcomponent对它进行编码,这是不必要的,当codeingiter对它进行解码时,它没有得到实际的字符串,因为某些部分被编码了两次。 我将用一个例子来解释它。

string: quantity[]=1&option=sell

urlencoded while serializing: quantity%5B%5D%3D1%26option%3Dsell

again urlencoded with encodedURICompontent(): quantity%255B%255D%253D1%2526option%253Dsell

---在codeigntier

urldecode: quantity%5B%5D=1&option=sell

根据输入类正则表达式禁止使用charecters。

注意:这不是这个问题的答案,但有助于检查是否有人遇到此错误...谢谢。

答案 12 :(得分:1)

在Ubuntu中,您可以通过清除浏览器的cookie来解决问题。我有同样的问题并以这种方式解决了。

答案 13 :(得分:1)

花了一段时间才弄明白这个。似乎我们大多数人错过了明显的错误......最后一个“ - ”没有被转义。

添加。和|正如我所见,其他建议可能适合你,但正则表达式应该是:

if ( ! preg_match("/^[a-z0-9:_\/\-\.|]+$/i", $str))  

答案 14 :(得分:1)

我在尝试发送表单时看到了这个错误,并且在其中一个字段的名称中,我使用了“endereço”这个词。

echo form_input(array('class' => 'form-control', 'name' => 'endereco', 'placeholder' => 'Endereço', 'value' => set_value('endereco')));

当我为'c'更改'ç'时,错误消失了。

答案 15 :(得分:1)

我有这个问题,但我的问题是我错误地在输入名称之前添加了一个空格,如下所示:

<input type="text" name=" evening_time_phone">

当shpuld是这样的时候:

<input type="text" name="evening_time_phone">

答案 16 :(得分:0)

我引用的错误是在system / libraries / Input.php中生成的(关于第215行 - 查找函数_clean_input_keys($ str)。

正则表达式不允许索引中的点字符。我改变它就好了。

答案 17 :(得分:0)

我遇到了同样的问题,我发现它位于电子邮件地址的域名中,从.更改为_,如:name@domain_com而不是{{} 1}}

答案 18 :(得分:0)

根据我的经验,它可能是由未完成的语法引起的,例如:

$('#teks').val

而不是

$('#teks').val()

答案 19 :(得分:0)

替换_clean_input_keys函数中的以下代码

    if ( ! preg_match("/^[a-z0-9:_\/-]+$|/i", $str))
    {
        exit('Disallowed Key Characters.\n');
    }
    if (UTF8_ENABLED === TRUE)
    {
        $str = $this->uni->clean_string($str);
    }

    return $str;

答案 20 :(得分:0)

在大多数情况下,如果您有现有软件,并尝试在新环境中进行部署,则此类错误应该是由PHP属性引起的

short_open_tag

检查是否已在新环境中启用。 换句话说,PHP无法读取代码中的标记。