Подтвердить что ты не робот

Недопустимые ключевые символы CodeIgniter

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

4b9b3361

Ответ 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;