[英]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's "different."
htmlentities: Well that's "different."
htmlspecialchars: Well that's "different."
这是因为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.