繁体   English   中英

为什么 filter_var() 对引号的编码与 htmlentities() 不同?

[英]Why does filter_var() encode quotes differently than htmlentities()?

为什么 filter_var() 的 FILTER_SANITIZE_STRING 过滤器将单引号编码为' 和双引号作为" 而 htmlentities() 将单引号编码为' 和双引号作为" ?

代码示例:

<?php
$string = "Well that's \"different.\"";

echo "filter_var: ".filter_var($string, FILTER_SANITIZE_STRING)."\n";
echo "htmlentities: ".htmlentities($string, ENT_QUOTES)."\n";
echo "htmlspecialchars: ".htmlspecialchars($string, ENT_QUOTES)."\n";

输出:

filter_var: Well that&#39;s &#34;different.&#34; 
htmlentities: Well that&#039;s &quot;different.&quot; 
htmlspecialchars: Well that&#039;s &quot;different.&quot;

这是因为filter扩展与 HTML 处理无关。 它不使用 HTML 实体转换表。 它只是一种基于 ASCII 值的愚蠢编码。

  • "在 ASCII 中是 34
  • '在 ASCII 中是 39

这同样适用于filter扩展转换为 HTML 编码形式的任何其他字符。 它采用十进制的 ASCII 数值,在前面加上&#并附加; . 就是这样! 它简单而有效,即使它不是很正确。

无意冒犯任何人,但将此扩展用于任何与 HTML 相关的内容是一个相当愚蠢的想法。 现在不推荐使用常量FILTER_SANITIZE_STRING ,它将在 PHP 的未来版本中删除。 存在一个过滤器FILTER_SANITIZE_FULL_SPECIAL_CHARS ,它只是htmlspecialchars()的包装器,但我想不出有任何理由在简单的htmlspecialchars()函数上使用它。

其中一些过滤器是懒惰 PHP 时代的残余。 开发人员使用诸如魔术引号之类的懒惰方法来确保安全性,这些方法没有提供足够的安全性,并且通常会导致更多的混乱。 这些 HTML 过滤器是用同样的懒惰方法创建的。 提供一些东西总比不提供东西来缓解 XSS 更好。 但是,这绝对不再是推荐的做法。 请使用适当的函数正确格式化输出以避免 XSS,而不是依赖过滤器进行清理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM