CodeIgniter дает мне ошибку Disallowed Key Characters
. Я сузил его до атрибута name поля формы: name='prod[50-4121.5]'
, но я не уверен, что с этим делать.
Недопустимые ключевые символы CodeIgniter
Ответ 1
Проблема заключается в том, что вы используете символы, не включенные в стандартное Regex. Используйте это:
!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
Ответ 2
Откройте libraries/Input.php
(system/core/Input.php
в CI версии 2.0+) и найдите 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, чтобы он разрешал новые символы.
Пожалуйста, не считайте, что char отсутствует .
(точка), и вы всегда должны избегать .
(точка) в регулярных выражениях, поскольку в противном случае они разрешат любой одиночный char.
/^[a-z0-9:_\/-\.]+$/i
Ответ 3
Чтобы использовать CodeIgniter с jQuery Ajax, используйте "Object" в качестве данных вместо строки Query, как показано ниже:
$.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);
}
});
Ответ 4
Php будет оценивать, что вы написали между скобками [].
$foo = array('eins', 'zwei', 'apples', 'oranges');
var_dump($foo[3-1]);
Создает string(6) "apples"
, потому что он возвращает $foo [2].
Если вы хотите, чтобы это как строка, поместите туда перевернутые запятые.
Ответ 5
Я получил эту ошибку при отправке данных из текстового редактора, где я включил амперсанд. Замена амперсанда на% 26 - кодировка URL амперсанда - решила проблему. Я также обнаружил, что запрошенный jQuery ajax-запрос, подобный этому, волшебным образом решает проблему:
request = $.ajax({
"url": url,
type: "PUT",
dataType: "json",
data: json
});
где объект json
является, неожиданным, неожиданным, объектом JSON, содержащим свойство со значением, которое содержит амперсанд.
Ответ 6
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);
чтобы помочь вам в поиске ошибок изгоев.
Ответ 7
У меня была такая же ошибка после того, как я опубликовал форму. Я просто пропустил вводную цитату в одном из моих атрибутов имени ввода. У меня было:
<input name=first_name">
Фиксация, которая избавилась от ошибки.
Ответ 8
Откройте 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))
Ответ 9
У меня была такая же проблема благодаря французским персонажам. Вот мой класс, если кому-то это понадобится. Он должен быть сохранен здесь:/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
Ответ 10
Шаг1. Поиск функции _clean_input_keys на /system/core/Input.php
Шаг2. Измените эту строку
exit ("Запрещенные ключевые символы.);
к
exit ("Запрещенные ключевые символы. $str);
Step3. Обновить страницу, чтобы увидеть символы, которые генерируют ошибку
Step4. Если вам нужно добавить эти символы в список исключений, просто добавьте в эту строку
if (! preg_match ( "/^ [a-z0-9: _/-] + $|/i", $str))
Я добавляю | (pipe) в примере выше
Ответ 11
У меня была такая же ошибка после того, как я опубликовал форму. у них есть пробел в моих атрибутах имени ввода. input name= 'first_name'
Фиксация, которая избавилась от ошибки.
Ответ 12
В моем случае я сериализовал входную форму, используя jquery serialize(), а затем urlencoding с помощью encodeURIComponent().
var datas = form.serialize();
encodeURIComponent(datas);
$.getJSON(url,datas,function(){});
и codeigniter выдавал недопустимую символьную ошибку.
Я понял, что проблема здесь: jquery serialize дает кодированный вывод, и я снова кодировал его с помощью encodeURIcomponent, который был лишним, и когда кодировщик декодировал его, он не получал фактическую строку, поскольку некоторая часть была закодирована дважды. я объясню это на примере.
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 в соответствии с переменным класса ввода.
Примечание: это не ответ на этот вопрос, но поможет проверить, не встречается ли эта ошибка... спасибо.
Ответ 13
В Ubuntu вы можете решить эту проблему, очистив файлы cookie вашего браузера. У меня была та же проблема, и я решил это так.
Ответ 14
Понадобилось время, чтобы понять это. Похоже, большинство из нас пропустило очевидную ошибку... последний "-" не сбежал.
Добавление. и | как я видел, другое предложение может работать для вас, но регулярное выражение должно было быть:
if ( ! preg_match("/^[a-z0-9:_\/\-\.|]+$/i", $str))
Ответ 15
Я видел эту ошибку, когда я пытался отправить форму, и в одном из имен полей я дал слово "endereço".
echo form_input(array('class' => 'form-control', 'name' => 'endereco', 'placeholder' => 'Endereço', 'value' => set_value('endereco')));
Когда я изменил 'ç' для 'c', ошибка исчезла.
Ответ 16
У меня была эта проблема, но моя проблема заключалась в том, что я по ошибке добавил пробел перед именем ввода так:
<input type="text" name=" evening_time_phone">
Когда это shpuld будет выглядеть так:
<input type="text" name="evening_time_phone">
Ответ 17
Ошибка, на которую я ссылался, была сгенерирована в системе /library/Input.php(о строке 215 - искать функцию _clean_input_keys ($ str).
Регулярное выражение не допускает символа точки в индексе. Я изменил его таким образом.
Ответ 18
У меня та же проблема, и я обнаружил, что она находится в доменном имени адреса электронной почты, который каким-то образом изменился с .
на _
следующим образом: [email protected]_com
вместо [email protected]
Ответ 19
По моему опыту, это может быть вызвано незавершенным синтаксисом, например:
$('#teks').val
вместо
$('#teks').val()
Ответ 20
Замените приведенный ниже код в функции _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;