在Codeigniter中替换的字符百分比


Percent character replaced in Codeigniter

在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