Php Codeigniter中替换的字符百分比
在Codeigniter中,我使用POST方法发送一个字符串作为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
“%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
,则可能是对输入进行双重编码。