CI自动过滤掉百分号%后两位的问题解决_PHP教程
在 CodeIgniter 做的网站里,想输入一段代码:
$var = sprintf("%04d", 2);
但是发现入库后,代码变成了
$var = sprintf("d", 2);
在网上环境,本地环境都测试过,最终确认是 CodeIgniter 系统的问题。下面谈一下问题解决的过程与思维方法:
1. 是 config.php 的 permitted_uri_chars 吗?
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
在 stackoverflow 上找到几个差不多的问题,有答案说改 config.php 的 permitted_uri_chars 就行了。
Ahem... after looking at your sample string again. Here is why you get "
The URI you submitted has disallowed characters
".Short explanation: Add the ampersand & to the allowed characters list
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_+&-';Copier après la connexion
试过了,没效果,于是就查找应用了 $config['permitted_uri_chars'] 的代码。
2. 是 core/Input.php 的 _clean_input_keys() 函数问题吗?
function _clean_input_keys($str) { $config = &get_config('config'); if ( ! preg_match("/^[".$config['permitted_uri_chars']."]+$/i", rawurlencode($str))) { exit('Disallowed Key Characters.'); } // Clean UTF-8 if supported if (UTF8_ENABLED === TRUE) { $str = $this->uni->clean_string($str); } return $str; }
这个函数使用了 $config['permitted_uri_chars'] 直接过滤 post 过来的数据,很大原因就是元凶了。我把它单独出来,经过测试发现,post $var = sprintf("%04d", 2); 过来,结果还是 $var = sprintf("%04d", 2); ,%04并未被过滤,看来还得细细地找。
3. 是 xss 的防御机制吗?
stackoverflow 有个人说他完美解决了这个问题,是 xss clean 的原因。
:) God damn URLDECODE, I have looked at the code in URI.php but the xss clean is doing the job so I missed it. Thank you now everything is perfect. – RaduM
于是我找到了 core/security.php 下的 xss_clean() 函数。把函数体代码全部注释掉,发现输入还是会把 %04 过滤掉,显然也不是 xss 的问题。
4. 问题出在 _clean_input_data() 函数
重新回到 Input.php,发现 _clean_input_data 与 _clean_input_keys 有联系。
$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
于是把 _clean_input_data() 的函数体注释掉,竟然输入没被过滤了。继续缩小范围,发现是这段代码惹得祸:
// Remove control characters // 就是这个会把%0x过滤掉 $str = remove_invisible_characters($str);
5. 元凶找到了 remove_invisible_characters() 函数
那么 remove_invisible_characters() 这个函数是什么呢?
这个函数在 core/Common.php中,我把它揪出来:
function remove_invisible_characters($str, $url_encoded = TRUE) { $non_displayables = array(); // every control character except newline (dec 10) // carriage return (dec 13), and horizontal tab (dec 09) if ($url_encoded) { $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 } $non_displayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 do { $str = preg_replace($non_displayables, '', $str, -1, $count); } while ($count); return $str; }
看这么几行代码:
if ($url_encoded) { $non_displayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 $non_displayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 }
明确了吧,他会把%0与%1开头的3个字符过滤掉。直接把这个注释掉,问题解决。
记录这个问题解决的思维全过程。

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment implémenter un middleware personnalisé dans CodeIgniter Introduction : Dans le développement Web moderne, le middleware joue un rôle essentiel dans l'application. Ils peuvent être utilisés pour exécuter une logique de traitement partagé avant ou après que la demande atteigne le contrôleur. CodeIgniter, en tant que framework PHP populaire, prend également en charge l'utilisation de middleware. Cet article explique comment implémenter un middleware personnalisé dans CodeIgniter et fournit un exemple de code simple. Présentation du middleware : le middleware est une sorte de requête

Middleware CodeIgniter : accélère la réactivité des applications et le rendu des pages Présentation : À mesure que les applications Web continuent de gagner en complexité et en interactivité, les développeurs doivent utiliser des solutions plus efficaces et évolutives pour améliorer les performances et la réactivité des applications. CodeIgniter (CI) est un framework léger basé sur PHP qui fournit de nombreuses fonctionnalités utiles, dont le middleware. Le middleware est une série de tâches effectuées avant ou après que la demande parvienne au contrôleur. Cet article explique comment utiliser

Introduction à la méthode d'utilisation du générateur de requêtes de base de données (QueryBuilder) dans le framework CodeIgniter : CodeIgniter est un framework PHP léger qui fournit de nombreux outils et bibliothèques puissants pour faciliter les développeurs dans le développement d'applications Web. L'une des fonctionnalités les plus impressionnantes est le générateur de requêtes de base de données (QueryBuilder), qui fournit un moyen concis et puissant de créer et d'exécuter des instructions de requête de base de données. Cet article expliquera comment utiliser Co

À mesure que les applications Web continuent d’évoluer, il est important de développer des applications plus rapidement et plus efficacement. Et comme l'API RESTful est largement utilisée dans les applications Web, il est nécessaire que les développeurs comprennent comment créer et implémenter l'API RESTful. Dans cet article, nous verrons comment implémenter le modèle MVC et l'API RESTful à l'aide du framework CodeIgniter. Introduction au modèle MVC MVC (Model-Vie

CodeIgniter est un framework PHP léger qui utilise l'architecture MVC pour prendre en charge un développement rapide et simplifier les tâches courantes. CodeIgniter5 est la dernière version du framework et offre de nombreuses nouvelles fonctionnalités et améliorations. Cet article explique comment utiliser le framework CodeIgniter5 pour créer une application Web simple. Étape 1 : Installer CodeIgniter5 Le téléchargement et l'installation de CodeIgniter5 sont très simples, suivez simplement ces étapes : Téléchargez la dernière version

Middleware CodeIgniter : fournit des fonctions sécurisées de téléchargement et de téléchargement de fichiers. Introduction : Le téléchargement et le téléchargement de fichiers sont des fonctions très courantes lors du développement d'applications Web. Cependant, pour des raisons de sécurité, la gestion des téléchargements et des téléchargements de fichiers nécessite souvent des mesures de sécurité supplémentaires. CodeIgniter est un framework PHP populaire qui fournit une multitude d'outils et de bibliothèques pour aider les développeurs à créer des applications Web sécurisées et fiables. Cet article explique comment utiliser le middleware CodeIgniter pour implémenter des fichiers sécurisés.

À l'ère d'Internet d'aujourd'hui, un site Web apprécié des utilisateurs doit disposer d'une interface frontale simple et claire et d'un système de gestion back-end puissant, et le framework PHP CodeIgniter est un excellent framework qui permet aux développeurs de créer rapidement un back-end. système de gestion. CodeIgniter a les caractéristiques d'une légèreté, d'une grande efficacité et d'une expansion facile. Cet article s'adressera aux débutants et expliquera en détail comment créer rapidement un système de gestion backend via ce cadre. 1. Installation et configuration L'installation de PHPCodeIgniter est basée sur PHP

Ces dernières années, les progrès de la technologie de développement Web et l’expansion continue des applications Internet mondiales ont rendu la technologie PHP de plus en plus largement utilisée. En tant que technologie en développement rapide, son écosystème continue de croître. Parmi eux, CodeIgniter, en tant que l'un des frameworks les plus connus dans le domaine du développement PHP, est très populaire parmi de nombreux développeurs. Cet article présentera les connaissances pertinentes du framework CodeIgniter pour fournir un guide d'introduction pour les débutants. 1. Qu'est-ce que le framework CodeIgniter ? CodeIg
