在Codeigniter中,我使用POST方法发送一个字符串"%100"
,它变为"0"
。我相信这是因为他们被视为编码,但他们不是。
无论如何取消这一点同时仍保持高安全性,因为这似乎是由Security->xss_clean()
和Common remove_invisible_characters()
答案 0 :(得分:3)
只需查看CodeIgniter system / core / Common.php中定义的remove_invisible_characters()函数,该函数由函数CI_Input :: _ sanitize_globals()调用。它负责清除以“%”开头的某些转义序列。我更喜欢覆盖输入类来禁用全局变量的自动清理。
答案 1 :(得分:1)
您可以创建自己的MY_Security类,然后可以使用它来覆盖xss_clean函数,而不是删除rawurldecode函数。也许在调用父父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);
}
}
?>
这将对值进行编码,以便在父函数解码时,您将获得您提交的原始值。
答案 2 :(得分:0)
我认为这里的问题与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
是一个有效的网址编码字符串,并且会被翻译为不可打印的字符串,并且在此上下文中无意义"Data Link Escape" character,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
。