web-dev-qa-db-fra.com

CodeIgniter caractères clés non autorisés

CodeIgniter me donne un Disallowed Key Characters Erreur. Je l'ai réduit à l'attribut name d'un champ de formulaire: name='prod[50-4121.5]' mais je ne sais pas quoi faire à ce sujet.

32
John Rand

Le problème est que vous utilisez des caractères non inclus dans le Regex standard. Utilisez ceci:

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

Selon les commentaires (et l'expérience personnelle), vous ne devez pas les modifier Input.php fichier - vous devez plutôt créer/utiliser votre propre MY_Input.php comme suit:

<?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 */

++ Prise en charge des caractères chinois

// 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
34
Wallter

Ouvrez libraries/Input.php (system/core/Input.php Dans CI version 2.0+) et localisez function _clean_input_keys($str){, le bloc entier devrait ressembler à ceci:

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

    return $str;
}

Modifiez le PCRE afin qu'il autorise les nouveaux caractères.

Veuillez noter que le caractère manquant est le . (Point) et vous devez toujours échapper au . (Point) dans les expressions régulières car ils autoriseraient autrement un seul caractère.

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

Pour utiliser CodeIgniter avec jQuery Ajax, utilisez "Object" comme données au lieu de la chaîne de requête comme ci-dessous:

$.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);
    }
});
9

Étape 1. Recherchez la fonction _clean_input_keys sur /system/core/Input.php

Étape 2. Modifier cette ligne

exit ("Caractères clés interdits.");

à

exit (‘Caractères clés interdits.’. $ str);

Étape 3. Actualiser la page pour voir les caractères qui génèrent l'erreur

Étape 4. Si vous devez ajouter ces caractères dans la liste d'exceptions, ajoutez simplement à cette ligne

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

J'ajoute | (pipe) dans l'exemple ci-dessus

3
Uttam Panara

J'ai eu la même erreur après avoir publié un de mes formulaires. ils ont un espace dans mes attributs de nom d'entrée. nom d'entrée = "prénom"

Correction qui a éliminé l'erreur.

2
Ron raj

J'ai eu cette erreur lors de l'envoi de données à partir d'un éditeur de texte riche où j'avais inclus une esperluette. Le remplacement de l'esperluette par% 26 - l'encodage URL de l'esperluette - a résolu le problème. J'ai également trouvé qu'une demande jQuery ajax configurée comme celle-ci résout comme par magie le problème:

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

où l'objet json est, surprise, surprise, un objet JSON contenant une propriété avec une valeur qui contient une esperluette.

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

return $str;
}

Veuillez ajouter. $ Str pour quitter ('Caractères clés interdits.'); Comme: exit ('Disallowed Key Characters.'. $ Str);

pour vous aider dans votre recherche d'erreurs.

2
richardwhitney

Ouvrez libraries/Input.php (system/core/Input.php Dans CI version 2.0+) Et localisez la fonction _clean_input_keys($str){,

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

2
Eugine Joseph

J'ai eu le même problème grâce aux caractères spéciaux français. Voici ma classe au cas où quelqu'un en aurait besoin. Il doit être enregistré ici: /application/core/MY_Input.php

(cette extension signalera également que le caractère de sorcière n'est plus autorisé à l'avenir)

 classe MY_Input étend 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;
}

}

Lisez le manuel convivial sur l'extension des classes de base: http://ellislab.com/codeigniter/user-guide/general/core_classes.html

2
Guidouil

J'ai eu la même erreur après avoir publié un de mes formulaires. J'ai simplement raté la citation d'ouverture dans l'un de mes attributs de nom d'entrée. J'ai eu:

<input name=first_name">

Correction qui a éliminé l'erreur.

2
Keith Ritter

Php évaluera ce que vous avez écrit entre les crochets [].

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

Produira string(6) "apples", car elle retourne $ foo [2].

Si vous le souhaitez sous forme de chaîne, placez-y des virgules inversées.

2
Tilman Köster

Dans mon cas, je sérialisais un formulaire d'entrée à l'aide de jquery serialize (), puis le codais par URL à l'aide d'encodeURIComponent ().

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

et codeigniter donnait l'erreur de caractère non autorisé.

j'ai pensé que le problème était ici, jquery serialize donne une sortie codée et je l'ai à nouveau encodée avec l'encodeURIcomponent qui n'était pas nécessaire, et lorsque codageiter l'a décodé, il n'obtenait pas la chaîne réelle car une partie a été encodée deux fois. je vais l'expliquer avec un exemple.

string: quantity[]=1&option=sell

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

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

--- chez codeigntier

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

qui a interdit les caractères selon la regex de la classe d'entrée.

note: ce n'est pas une réponse à cette question, mais aiderait à vérifier si l'on rencontre cette erreur ... merci.

1
MortalViews

Il a fallu un certain temps pour comprendre celui-ci. Il semble que la plupart d'entre nous aient raté l'erreur évidente… le dernier "-" n'est pas échappé.

Ajout du. et | comme je l'ai vu, d'autres suggèrent peut fonctionner pour vous, mais le regex était censé être:

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

j'ai vu cette erreur lorsque j'essayais d'envoyer un formulaire, et dans l'un des noms des champs, j'ai laissé le mot "endereço".

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

Lorsque j'ai changé "ç" pour "c", l'erreur a disparu.

1
heavyrick

Dans Ubuntu, vous pouvez résoudre le problème en effaçant les cookies de votre navigateur. J'ai eu le même problème et l'ai résolu de cette façon.

1
Jamshid Hashimi

J'ai eu ce problème mais mon problème était que j'ai par erreur ajouté un espace avant le nom de l'entrée comme ceci:

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

Quand ça devrait être comme ça:

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

Remplacez le code ci-dessous dans la fonction _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;
0
ganesh sekaran

J'ai le même problème et je l'ai trouvé dans le nom de domaine de l'adresse e-mail qui est en quelque sorte changé de . à _ comme: name@domain_com au lieu [email protected]

0
Radenko Kosic

D'après mon expérience, cela pourrait être dû à une syntaxe incomplète, comme:

$('#teks').val

au lieu de

$('#teks').val()
0
mas_budhi

L'erreur que j'ai référencée a été générée dans le système/bibliothèques/Input.php (à propos de la ligne 215 - recherchez la fonction _clean_input_keys ($ str).

L'expression régulière ne permet pas le caractère point dans un index. Je l'ai changé pour que ce soit le cas.

0
John Rand