这里我很困惑为什么FILTER_SANITIZE_URL
中的var_dump
返回错误的字符串长度并且不会删除诸如的标记。这发生在所有filter_var预定义过滤器常量中。这是一个错误还是背后有一个逻辑?
我正在使用PHP 5.4,因为我必须在我们的服务器上运行它。让我演示。 我有这个网址:
$url = 'http://www.example.com/index.php?a=1&b=2&c=3&d=some%20string';
如果我清理它并var_dump它:
var_dump(filter_var($url, FILTER_SANITIZE_URL));
它将返回:
string(60) "http://www.example.com/index.php?a=1&b=2&c=3&d=some%20string"
现在我将恶意代码放入网址
$url = 'http://www.example.com/index.php?
<script>
function myFunction() {
var x = "<?php echo $var; ?>";
alert(x);
}
</script>a=1&b=2&c=3&d=some%20string';
相同代码:var_dump(filter_var($url, FILTER_SANITIZE_URL));
将返回此:
string(132) "http://www.example.com/index.php?a=1&b=2&c=3&d=some%20string"
注意返回var的类型和长度。比前一个字符多72个字符,但显然字符串仍然是60个字符长。为什么var_dump或filter_var会以这种方式表现出来?如果它是一个bug已经修复了。当我记录这些类型的数据时,我需要这个函数来返回确切的字符数。
答案 0 :(得分:2)
FILTER_SANITIZE_URL
从网址中删除了所有不必要的字符,包括空格,如果您查看其显示的视图来源
<script>functionmyFunction(){varx="<?phpecho$var;?>";alert(x);}</script>
为什么要返回132个字符?
因为<script>
标记和内部代码也包含在字符串中。 FILTER_SANITIZE_URL不删除它只删除空格的标签,此过滤器允许所有字母,数字和
$-_.+!*'(),{}|\\^~[]`"><#%;/?:@&=
删除恶意代码使用其他功能,例如strip_tags()
。
$var = filter_var(strip_tags($url), FILTER_SANITIZE_URL);
如果代码包含在字符串中,那么为什么不显示?
因为您在浏览器上使用var_dump并检查结果,并且除非转到页面查看源,否则您无法在浏览器上查看<script>
标记内的任何代码。
如果您删除<script>
代码,应该发生什么?
如果您删除了<script>
代码,则会显示以下内容:
string(115) "http://www.example.com/index.php?functionmyFunction(){varx="";alert(x);}a=1&b=2&c=3&d=some%20string"
应删除<script></script>
的17个字符。