Codeigniter中替换的字符百分比

时间:2012-01-04 11:12:33

标签: php codeigniter

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

无论如何取消这一点同时仍保持高安全性,因为这似乎是由Security->xss_clean()Common remove_invisible_characters()

引起的

3 个答案:

答案 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" characterASCII 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