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.
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 */
// 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
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
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);
}
});
É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
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.
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.
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.
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))
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
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.
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.
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.
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))
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.
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.
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">
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;
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]
D'après mon expérience, cela pourrait être dû à une syntaxe incomplète, comme:
$('#teks').val
au lieu de
$('#teks').val()
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.