2012-01-04 37 views
3

在Codeigniter中,我使用POST方法发送一个字符串作为"%100",它变成"0"。我相信这是因为他们被视为编码,但他们不是。在Codeigniter中替换的字符百分比

反正有没有取消,同时仍然保持安全性很高,因为这似乎是由Security->xss_clean()Common remove_invisible_characters()

+0

在你的'/ application/config/config.php'中是$ config ['global_xss_filtering']'设置为'TRUE'或'FALSE'?如果它设置为“TRUE”,并且您再次使用“xss_clean”,那么这可能是对输入进行双重编码的原因。 – stealthyninja 2012-01-04 16:54:09

回答

1

造成的,我相信这里的问题是无关的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

+1

嗨,我发现它实际上并不是关于我的HTTP请求,它已经被url编码,而是关于Codeigniter的Security类,它调用'rawurldecode()'来获取POST数据。你有任何想法将删除'rawurldecode'导致系统中的任何安全漏洞? – kubilayeksioglu 2012-01-04 14:35:42

+0

这也发生在我身上,我选择在这种情况下通过双重编码变得懒惰。现在,当CI试图以单编码方式结束时,它就是我想要的。 – clockworkgeek 2012-07-13 14:39:09

0

您可以创建自己的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); 
    } 

} 

?> 

这将编码值,这样,当它是由父解码功能,您将有您所提交的原始值。

3

只需查找由函数CI_Input :: _ sanitize_globals()调用的CodeIgniter system/core/Common.php中定义的remove_invisible_characters()函数即可。它负责清理以“%”开头的某些转义序列。我更喜欢重写输入类以禁用全局变量的自动清理。