var_dump filter_var FILTER_SANITIZE_URL返回行为

时间:2016-01-22 10:51:31

标签: php var-dump filter-var

这里我很困惑为什么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已经修复了。当我记录这些类型的数据时,我需要这个函数来返回确切的字符数。

1 个答案:

答案 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个字符。