var_dump filter_var FILTER_SANITIZE_URL return 行为

var_dump filter_var FILTER_SANITIZE_URL return behaviour

这里我很困惑为什么 var_dump FILTER_SANITIZE_URL return 中的字符串长度错误并且没有删除诸如 .这发生在所有 filter_var 个预定义过滤器常量中。这是一个错误还是背后有逻辑?

我正在使用 PHP 5.4,因为我必须使用我们的服务器 运行。让我演示一下。 我有这个 URL:

$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));

它将 return:

string(60) "http://www.example.com/index.php?a=1&b=2&c=3&d=some%20string"

现在,如果我将恶意代码放入 URL

$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)); 将 return 这个:

string(132) "http://www.example.com/index.php?a=1&b=2&c=3&d=some%20string"

注意 returned 变量的类型和长度。比之前多了 72 个字符,但显然字符串的长度仍为 60 个字符。为什么 var_dump 或 filter_var 会有这样的举止?如果这是一个错误,这是否已修复。当我记录这些类型的数据时,我需要这个函数来 return 确切的字符数。

FILTER_SANITIZE_URL 从 URL 中删除了所有不必要的字符,包括空格,如果您检查查看源代码,它会显示

<script>functionmyFunction(){varx="<?phpecho$var;?>";alert(x);}</script>

为什么 return 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 个字符。