【问题标题】:var_dump filter_var FILTER_SANITIZE_URL return behaviourvar_dump filter_var FILTER_SANITIZE_URL 返回行为
【发布时间】:2016-04-28 22:44:24
【问题描述】:

在这里我很困惑为什么var_dump 中的FILTER_SANITIZE_URL 返回错误的字符串长度并且不删除诸如 .这发生在所有 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 中放入恶意代码

$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 会以这种方式表现?如果这是一个错误,则已修复。当我记录这些类型的数据时,我需要这个函数来返回确切的字符数。

【问题讨论】:

  • FILTER_SANITIZE_URL 从 url 中删除了所有不必要的字符,包括空格,如果你检查查看源它显示
  • @devpro ...我知道...但是为什么它仍然在 var_dump 上返回 132 个字符?
  • 因为, 包含在此计数中,并且 y 不可见,因为它在
  • 如果你看 var_dump 手册它会说它会返回字符串的类型和长度但是长度是错误的!
  • var_dump(htmlspecialchars(filter_var($url, FILTER_SANITIZE_URL))); 会告诉你真相。 (或者看看HTML源代码,之前它被浏览器解释为HTML。)

标签: php var-dump filter-var


【解决方案1】:

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

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

为什么要返回 132 个字符?

因为&lt;script&gt; 标记和内部代码也包含在字符串中。 FILTER_SANITIZE_URL 不删除标签它只是删除空格和这个过滤器允许所有字母、数字和

$-_.+!*'(),{}|\\^~[]`"><#%;/?:@&=

要删除恶意代码,请使用strip_tags()等其他功能。

$var = filter_var(strip_tags($url), FILTER_SANITIZE_URL);

如果代码包含为字符串,那为什么不显示?

因为您在浏览器上使用 var_dump 并检查结果,除非转到页面查看源,否则您无法在浏览器上查看 &lt;script&gt; 标签内的任何代码。

如果你去掉&lt;script&gt;标签,会发生什么?

如果您删除了&lt;script&gt; 标签,它将显示以下内容:

string(115) "http://www.example.com/index.php?functionmyFunction(){varx="";alert(x);}a=1&b=2&c=3&d=some%20string" 

&lt;script&gt;&lt;/script&gt; 的 17 个字符应删除。

【讨论】:

  • 感谢您的回答,但这并不能解释我的问题。我知道你所写的一切,但正确的行为应该是 string(60),因为它返回 60 个字符...... var_dump 应该返回最终字符的数量,而不是之前被 filter_var 删除的那些。
  • 哪些字符被 filter_var 删除了???你知道吗??? @DanielPurPur,它没有删除
  • 我已经这样做了。在发布问题之前,我已经做了很多测试。为什么删除的字符仍然计入 var_dump。看来我们这里有误会。我的问题完全是另一个主题。
  • @DanielPurPur:我认为问题在于,您认为,
  • 好的现在我明白了!问题的答案应该是因为它只删除了不友好的 urlcharacters 而实际上并没有清理标签的 URL。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多