Rumah php教程 php手册 CI自动过滤掉百分号%后两位的问题解决

CI自动过滤掉百分号%后两位的问题解决

Jun 13, 2016 am 09:39 AM
codeigniter

在 CodeIgniter 做的网站里,想输入一段代码:

$var = sprintf("%04d", 2);
Salin selepas log masuk

但是发现入库后,代码变成了

$var = sprintf("d", 2);
Salin selepas log masuk

在网上环境,本地环境都测试过,最终确认是 CodeIgniter 系统的问题。下面谈一下问题解决的过程与思维方法:

1. 是 config.php 的 permitted_uri_chars 吗?

$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
Salin selepas log masuk

在 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;   
	} 
Salin selepas log masuk

这个函数使用了 $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);
Salin selepas log masuk

于是把 _clean_input_data() 的函数体注释掉,竟然输入没被过滤了。继续缩小范围,发现是这段代码惹得祸:

// Remove control characters
// 就是这个会把%0x过滤掉
$str = remove_invisible_characters($str);
Salin selepas log masuk

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;
	}
Salin selepas log masuk

看这么几行代码:

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
}
Salin selepas log masuk

明确了吧,他会把%0与%1开头的3个字符过滤掉。直接把这个注释掉,问题解决。

记录这个问题解决的思维全过程。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana untuk melaksanakan perisian tengah tersuai dalam CodeIgniter Bagaimana untuk melaksanakan perisian tengah tersuai dalam CodeIgniter Jul 29, 2023 am 10:53 AM

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

Perisian tengah CodeIgniter: Mempercepatkan responsif aplikasi dan pemaparan halaman Perisian tengah CodeIgniter: Mempercepatkan responsif aplikasi dan pemaparan halaman Jul 28, 2023 pm 06:51 PM

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

Cara menggunakan pembina pertanyaan pangkalan data (Pembina Pertanyaan) dalam rangka kerja CodeIgniter Cara menggunakan pembina pertanyaan pangkalan data (Pembina Pertanyaan) dalam rangka kerja CodeIgniter Jul 28, 2023 pm 11:13 PM

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

Pembangunan PHP: Menggunakan CodeIgniter untuk melaksanakan corak MVC dan API RESTful Pembangunan PHP: Menggunakan CodeIgniter untuk melaksanakan corak MVC dan API RESTful Jun 16, 2023 am 08:09 AM

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

Bagaimana untuk menggunakan rangka kerja CodeIgniter5 dalam php? Bagaimana untuk menggunakan rangka kerja CodeIgniter5 dalam php? Jun 01, 2023 am 11:21 AM

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

CodeIgniter middleware: Menyediakan fungsi muat naik dan muat turun fail yang selamat CodeIgniter middleware: Menyediakan fungsi muat naik dan muat turun fail yang selamat Aug 01, 2023 pm 03:01 PM

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

Cara menggunakan rangka kerja PHP CodeIgniter untuk membina sistem pengurusan backend dengan cepat Cara menggunakan rangka kerja PHP CodeIgniter untuk membina sistem pengurusan backend dengan cepat Jun 27, 2023 am 09:46 AM

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

Rangka Kerja Pelaksanaan PHP: Tutorial Bermula CodeIgniter Rangka Kerja Pelaksanaan PHP: Tutorial Bermula CodeIgniter Jun 18, 2023 pm 10:43 PM

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

See all articles