【问题标题】:Is htmlspecialchars() used for all applications when suspect content is put on a page?当可疑内容放在页面上时,htmlspecialchars() 是否用于所有应用程序?
【发布时间】:2013-05-02 13:07:18
【问题描述】:

我了解在页面上将用户提供的内容显示为 HTML 时,我应该使用 htmlspecialchars()。这是否适用于其他内容,例如 JavaScript、CSS、<INPUT> 的值等?我相信我听到有人说使用json_encode() 而不是htmlspecialchars() 来编码JS。

<?php
$dangerous=$_GET['dangerous'];
session_start();
$_SESSION['mySession']=$dangerous;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
        <title><?php echo($dangerous);?></title>  
        <style type="text/css">
        div.<?php echo($dangerous);?> {size:12px;}
        </style> 
        <script type="text/javascript">
        var myVar=<?php echo($dangerous);?>; 
        </script>
    </head>
    <body>
        echo(<?php echo($dangerous);?>)
        <input type="text" value="<?php echo($dangerous);?>" class="whatEver" name="myInput" />
        <a href="<?php echo($dangerous);?>">Some Link</a>
    </body> 
</html>

【问题讨论】:

    标签: php xss html-entities


    【解决方案1】:

    我知道在页面上将用户提供的内容显示为 HTML 时,我应该使用 htmlspecialchars()。这是否适用于其他内容,例如 JavaScript、CSS、&lt;INPUT&gt; 的值等?

    呃……有点。

    首先,假设您打算接受 text(然后您将其表示为 HTML)。如果您接受 HTML,那么您需要使用不同的方法对其进行清理(这通常涉及使用真正的 HTML 解析器和可接受元素和属性的白名单,然后可能会额外检查属性值)。

    如果我们假设我们正在处理文本......

    输入元素的值由 HTML 属性提供。 HTML 属性包含 HTML,因此您需要用实体表示值内的特殊字符。

    CSS 和 JavaScript 不是 HTML,因此您需要对目标语言使用适当的转义。但是,您随后(可能)将 CSS 或 JavaScript 嵌入到 HTML 文档中。

    如果你把它放在一个属性值中,那么你需要像往常一样对其进行转义。

    如果您将其放入&lt;script&gt;&lt;style&gt; 元素中,那么您必须在HTML 中处理它们的特殊处理规则。这些元素被定义为包含 CDATA(如果我们将其放在 HTML 4 术语中),因此您唯一需要注意的是数据中是否存在 &lt;/script&gt;&lt;/style&gt;

    如果您正在处理 XHTML(我建议您不要),那么您必须跳过 the Media Types Note 中描述的常见问题。

    【讨论】:

    • 谢谢昆汀。是的,接受文本(我将 htmlpurifier 用于 HTML)。所以,屏幕上的任何文本以及 HTML 属性,我都会使用htmlspecialchar()。我将研究将 CDATA 用于 JavaScript。我真的没有用将它添加到 CSS 中,但只是包含了完整性问题。而且,不,我没有使用 XHTML。
    • $('#myID').text(data.dangerous);html() 相同,其中 data 是通过 Ajax 提供并来自数据库?
    • 然后数据正在通过 XMLHttpRequest 从“HTTP 请求的内容”转换为“文本”(这样是安全的),并且正在从“文本”转换为“文本的 html 表示”通过jQuery 所以(考虑到该功能已经存在多长时间,在 jQuery 中出现的错误确实不太可能出现)也是安全的。
    • 再次感谢昆汀。我知道我不需要使用htmlspecialchar() 服务器端。如果我误解了你,请指教。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2020-07-30
    • 1970-01-01
    • 2015-11-03
    • 2023-02-15
    相关资源
    最近更新 更多