在Codeigniter中,我使用POST方法发送一个字符串作为"%100"
,它成为"0"
。我相信这是因为它们被视为编码,但它们不是。
是否有办法在保持高安全性的同时取消这个,因为这似乎是由Security->xss_clean()
和Common remove_invisible_characters()
引起的
查找CodeIgniter system/core/Common.php中定义的remove_invisible_characters()函数,该函数由函数CI_Input::_sanitize_globals()调用。它负责清除以"%"开头的某些转义序列。我更喜欢重写输入类来禁用对全局变量的自动清理。
不需要删除rawurldecode函数,您可以创建自己的MY_Security类,然后使用它来覆盖xss_clean函数。也许在调用父xss_clean函数之前使用PHP的rawurlencode函数。像这样:
<?php
class MY_Security extends Security {
function MY_Security() {
parent::Security();
}
public function xss_clean($str, $is_image = FALSE) {
$str = rawurlencode($str);
return parent::xss_clean($str, $is_image);
}
}
?>
这将对该值进行编码,以便在父函数对其进行解码时,您将获得您提交的原始值
我认为这里的问题与CI甚至PHP无关,而是与您的HTTP请求有关。
让我们假设我发出一个POST请求,看起来像这样:
POST /path/to/file HTTP/1.1
Host: server.com
User-Agent: Bob the browser/1.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 25
name=Dave&percentage=%100
您可能期望的是$_POST
看起来像这样:
Array
(
[name] => Dave
[percentage] => %100
)
但是,实际上PHP会(正确地)将其解码为:
Array
(
[name] => Dave
[percentage] => 0
)
这是因为%10
是一个有效的url编码字符串,并且将被转换为不可打印的,并且在此上下文中没有意义的"数据链接转义"字符,ASCII 0x10。
为了得到预期的结果,请求需要像这样:
POST /path/to/file HTTP/1.1
Host: server.com
User-Agent: Bob the browser/1.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
name=Dave&percentage=%25100
所以你在POST正文中实际发送的值是%25100
。这将被正确解码为%100
。