CI自动过滤掉百分号%后两位的问题解决
在 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~%.:_+&-';Salin selepas log masuk
试过了,没效果,于是就查找应用了 $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个字符过滤掉。直接把这个注释掉,问题解决。
记录这个问题解决的思维全过程。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara melaksanakan middleware tersuai dalam CodeIgniter Pengenalan: Dalam pembangunan web moden, middleware memainkan peranan penting dalam aplikasi. Ia boleh digunakan untuk melaksanakan beberapa logik pemprosesan yang dikongsi sebelum atau selepas permintaan sampai kepada pengawal. CodeIgniter, sebagai rangka kerja PHP yang popular, juga menyokong penggunaan middleware. Artikel ini akan memperkenalkan cara untuk melaksanakan perisian tengah tersuai dalam CodeIgniter dan memberikan contoh kod mudah. Gambaran keseluruhan Middleware: Middleware ialah sejenis permintaan

CodeIgniter Middleware: Mempercepatkan Responsif Aplikasi dan Gambaran Keseluruhan Pemberian Halaman: Memandangkan aplikasi web terus berkembang dalam kerumitan dan interaktiviti, pembangun perlu menggunakan penyelesaian yang lebih cekap dan berskala untuk meningkatkan prestasi dan responsif aplikasi. CodeIgniter (CI) ialah rangka kerja berasaskan PHP ringan yang menyediakan banyak ciri berguna, salah satunya ialah perisian tengah. Middleware ialah satu siri tugasan yang dilakukan sebelum atau selepas permintaan sampai kepada pengawal. Artikel ini akan memperkenalkan cara menggunakan

Pengenalan kepada kaedah menggunakan pembina pertanyaan pangkalan data (QueryBuilder) dalam rangka kerja CodeIgniter: CodeIgniter ialah rangka kerja PHP ringan yang menyediakan banyak alat dan perpustakaan yang berkuasa untuk memudahkan pembangun dalam pembangunan aplikasi web. Salah satu ciri yang paling mengagumkan ialah pembina pertanyaan pangkalan data (QueryBuilder), yang menyediakan cara ringkas dan berkuasa untuk membina dan melaksanakan pernyataan pertanyaan pangkalan data. Artikel ini akan memperkenalkan cara menggunakan Co

Memandangkan aplikasi web terus berkembang, adalah penting untuk membangunkan aplikasi dengan lebih cepat dan cekap. Dan, memandangkan API RESTful digunakan secara meluas dalam aplikasi web, pembangun perlu memahami cara mencipta dan melaksanakan API RESTful. Dalam artikel ini, kita akan membincangkan cara untuk melaksanakan corak MVC dan API RESTful menggunakan rangka kerja CodeIgniter. Pengenalan kepada corak MVC MVC (Model-Vie

CodeIgniter ialah rangka kerja PHP ringan yang menggunakan seni bina MVC untuk menyokong pembangunan pesat dan memudahkan tugas biasa. CodeIgniter5 ialah versi rangka kerja terkini dan menawarkan banyak ciri dan penambahbaikan baharu. Artikel ini akan memperkenalkan cara menggunakan rangka kerja CodeIgniter5 untuk membina aplikasi web mudah. Langkah 1: Pasang CodeIgniter5 Memuat turun dan memasang CodeIgniter5 adalah sangat mudah, cuma ikut langkah berikut: Muat turun versi terkini

Perisian tengah CodeIgniter: Menyediakan fungsi muat naik dan muat turun fail yang selamat Pengenalan: Dalam proses pembangunan aplikasi web, muat naik dan muat turun fail adalah fungsi yang sangat biasa. Walau bagaimanapun, atas sebab keselamatan, pengendalian muat naik dan muat turun fail selalunya memerlukan langkah keselamatan tambahan. CodeIgniter ialah rangka kerja PHP popular yang menyediakan pelbagai alatan dan perpustakaan untuk menyokong pembangun dalam membina aplikasi web yang selamat dan boleh dipercayai. Artikel ini akan memperkenalkan cara menggunakan perisian tengah CodeIgniter untuk melaksanakan fail selamat

Dalam era Internet hari ini, tapak web yang disukai oleh pengguna mesti mempunyai antara muka bahagian hadapan yang ringkas dan jelas serta sistem pengurusan bahagian belakang yang berkuasa, dan rangka kerja PHP CodeIgniter ialah rangka kerja yang sangat baik yang membolehkan pembangun membina bahagian belakang dengan cepat. sistem pengurusan. CodeIgniter mempunyai ciri-ciri ringan, kecekapan tinggi, dan pengembangan yang mudah Artikel ini akan ditujukan kepada pemula dan menerangkan secara terperinci cara membina sistem pengurusan bahagian belakang dengan cepat melalui rangka kerja ini. 1. Pemasangan dan konfigurasi Pemasangan PHPCodeIgniter adalah berasaskan PHP

Dalam tahun-tahun kebelakangan ini, kemajuan teknologi pembangunan Web dan pengembangan berterusan aplikasi Internet global telah menjadikan teknologi PHP digunakan secara meluas. Sebagai teknologi yang pesat membangun, ekosistemnya terus berkembang. Antaranya, CodeIgniter, sebagai salah satu rangka kerja yang terkenal dalam bidang pembangunan PHP, sangat popular di kalangan banyak pembangun. Artikel ini akan memperkenalkan pengetahuan berkaitan rangka kerja CodeIgniter untuk menyediakan panduan pengenalan untuk pemula. 1. Apakah rangka kerja CodeIgniter? CodeIg
