Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Codeigniter中替换的字符百分比_Php_Codeigniter - Fatal编程技术网

Php Codeigniter中替换的字符百分比

Php Codeigniter中替换的字符百分比,php,codeigniter,Php,Codeigniter,在Codeigniter中,我使用POST方法发送一个字符串作为“%100”,它变成“0”。我相信这是因为它们被视为编码的,但它们不是 在保持高安全性的同时,是否有任何方法可以取消此操作,因为这似乎是由安全性->xss_clean()和公共删除不可见的字符()造成的。我相信这里的问题与CI甚至PHP无关,而是与您的HTTP请求有关 假设我发出一个如下所示的POST请求: POST /path/to/file HTTP/1.1 Host: server.com User-Agent: Bob th

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


在保持高安全性的同时,是否有任何方法可以取消此操作,因为这似乎是由
安全性->xss_clean()
公共删除不可见的字符()
造成的。我相信这里的问题与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
Array
    (
        [name] => Dave
        [percentage] => %100
    )
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
<?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);
    }

}

?>
您可能期望的是
$\u 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
Array
    (
        [name] => Dave
        [percentage] => %100
    )
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
<?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);
    }

}

?>
但事实上,PHP会(正确地)将其解码为:

Array
    (
        [name] => Dave
        [percentage] => 0
    )
这是因为
%10
是一个有效的url编码字符串,将被转换为不可打印且在此上下文中没有意义

为了获得您期望的结果,请求需要如下所示:

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
Array
    (
        [name] => Dave
        [percentage] => %100
    )
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
<?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);
    }

}

?>

因此,您在帖子正文中实际发送的值是
%25100
。这将被正确解码为
%100

而不是删除rawurldecode函数,您可以创建自己的MY_安全类,然后使用该类重写xss_clean函数。在调用父xss_clean函数之前,可以使用PHP的rawurlencode函数。大概是这样的:

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
Array
    (
        [name] => Dave
        [percentage] => %100
    )
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
<?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);
    }

}

?>


这将对值进行编码,以便在父函数对其进行解码时,您将获得您提交的原始值。

只需查找CodeIgniter system/core/Common.php中定义的remove_invisible_characters()函数,该函数由函数CI_Input::_sanitize_globals()调用。它负责清理某些以“%”开头的转义序列。我更喜欢覆盖输入类来禁用全局数据的自动清理。

嗨,我发现这实际上不是关于我的HTTP请求,它已经是url编码的,而是关于Codeigniter的安全类,它正在调用
rawurldecode()
,以获取POST数据。你知道删除
rawurldecode
会不会在系统中造成任何安全漏洞吗?这也发生在我身上,在这种情况下,我通过双重编码选择了懒惰。现在,当CI试图阻止它时,它会以单编码结束,这正是我想要的。在您的
/application/config/config.php中
$config['global\u xss\u filtering']]
设置为
TRUE
还是
FALSE
?如果将其设置为
TRUE
,并且您再次使用
xss_clean
,则可能是对输入进行双重编码。