CodeIgniter给我一个Disallowed Key Characters
错误。我已将其缩小到表单字段的name属性:name='prod[50-4121.5]'
但我不知道该怎么办。
答案 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.php
(system/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无法读取代码中的标记。