在Codeigniter中,我使用POST方法发送一个字符串作为"%100"
,它变成"0"
。我相信这是因为他们被视为编码,但他们不是。在Codeigniter中替换的字符百分比
反正有没有取消,同时仍然保持安全性很高,因为这似乎是由Security->xss_clean()
和Common remove_invisible_characters()
在Codeigniter中,我使用POST方法发送一个字符串作为"%100"
,它变成"0"
。我相信这是因为他们被视为编码,但他们不是。在Codeigniter中替换的字符百分比
反正有没有取消,同时仍然保持安全性很高,因为这似乎是由Security->xss_clean()
和Common remove_invisible_characters()
造成的,我相信这里的问题是无关的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编码字符串,并且会被翻译成不可打印的,在这种情况下无意义"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
。
嗨,我发现它实际上并不是关于我的HTTP请求,它已经被url编码,而是关于Codeigniter的Security类,它调用'rawurldecode()'来获取POST数据。你有任何想法将删除'rawurldecode'导致系统中的任何安全漏洞? – kubilayeksioglu 2012-01-04 14:35:42
这也发生在我身上,我选择在这种情况下通过双重编码变得懒惰。现在,当CI试图以单编码方式结束时,它就是我想要的。 – clockworkgeek 2012-07-13 14:39:09
您可以创建自己的MY_Security类,而不用去除rawurldecode函数,然后使用它来覆盖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_Input :: _ sanitize_globals()调用的CodeIgniter system/core/Common.php中定义的remove_invisible_characters()函数即可。它负责清理以“%”开头的某些转义序列。我更喜欢重写输入类以禁用全局变量的自动清理。
在你的'/ application/config/config.php'中是$ config ['global_xss_filtering']'设置为'TRUE'或'FALSE'?如果它设置为“TRUE”,并且您再次使用“xss_clean”,那么这可能是对输入进行双重编码的原因。 – stealthyninja 2012-01-04 16:54:09