CodeIgniter Запрещенные Ключевые Символы - PullRequest
31 голосов
/ 16 ноября 2010

CodeIgniter выдаёт мне ошибку Disallowed Key Characters.Я сократил его до атрибута имени поля формы: name='prod[50-4121.5]', но я не уверен, что с этим делать.

Ответы [ 20 ]

34 голосов
/ 13 августа 2013

Проблема в том, что вы используете символы, не включенные в стандартное регулярное выражение. Используйте это:

!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
27 голосов
/ 16 ноября 2010

Откройте 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 так, чтобы она разрешала новые символы.

Обратите внимание, что отсутствующий символ - это . (точка), и вы всегда должны экранировать . (точку) в регулярных выражениях, так как в противном случае они позволят использовать один символ.

/^[a-z0-9:_\/-\.]+$/i
9 голосов
/ 04 ноября 2012

Чтобы использовать CodeIgniter с jQuery Ajax, используйте «Объект» в качестве данных вместо строки запроса, как показано ниже:

$.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);
    }
});
2 голосов
/ 05 января 2013
function _clean_input_keys($str)
{
if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
{
exit('Disallowed Key Characters.');
}

return $str;
}

Пожалуйста, добавьте. $ Str для выхода ('Запрещенные ключевые символы.'); Как: exit ('Запрещенные ключевые символы.'. $ Str);

, чтобы помочь вам в поиске мошеннических ошибок.

2 голосов
/ 08 октября 2012

Я получил эту ошибку при отправке данных из текстового редактора, в который был включен амперсанд. Замена амперсанда% 26 - кодировка URL амперсанда - решила проблему. Я также обнаружил, что ajax-запрос jQuery, настроенный таким образом, волшебным образом решает проблему:

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

, где объект json является, удивлением, удивлением, объектом JSON, содержащим свойство со значением, которое содержит амперсанд.

2 голосов
/ 06 ноября 2013

У меня была такая же проблема благодаря французским спецсимволам.Вот мой класс на случай, если это кому-нибудь понадобится.Это должно быть сохранено здесь: /application/core/MY_Input.php

(также это расширение сообщит, что символ ведьмы не разрешен в будущем)

class MY_Input extends CI_Input {</p>

<code>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;
}
</code>

}

Прочитайте Дружественное руководство по расширению основных классов: http://ellislab.com/codeigniter/user-guide/general/core_classes.html

2 голосов
/ 16 ноября 2010

Php оценит то, что вы написали в скобках [].

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

Будет выдавать string(6) "apples", потому что возвращает $ foo [2].

Если вы хотите это в виде строки, поместите в кавычки.

2 голосов
/ 03 февраля 2015

У меня была такая же ошибка после того, как я отправил свою форму. у них есть пробел в моих входных атрибутах имени. имя входа = 'имя_первой'

Исправление, которое избавило от ошибки.

2 голосов
/ 17 октября 2013

Открыть 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))

2 голосов
/ 01 декабря 2014

Шаг1.Найдите функцию _clean_input_keys в /system/core/Input.php

Step2.Изменить эту строку

exit ('Запрещенные ключевые символы.');

до

exit ('Запрещенные ключевые символы.'. $ Str);

Шаг 3.Обновите страницу, чтобы увидеть символы, которые генерируют ошибку

Шаг 4.Если вам нужно добавить эти символы в список исключений, просто добавьте в эту строку

if (! Preg_match («/ ^ [a-z0-9: _ / -] + $ | / i”, $ Str))

Я добавляю |(труба) символ в приведенном выше примере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...