当可疑内容放在页面上时,htmlspecialchars()是否用于所有应用程序?

时间:2013-05-02 13:07:18

标签: php xss html-entities

我了解在页面上将用户提供的内容显示为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>

1 个答案:

答案 0 :(得分:1)

  

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

错......等等。

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

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

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

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

如果要将其放在属性值中,则需要正常转义它。

如果要将其放入<script><style>元素中,则必须使用HTML处理其特殊处理规则。这些元素被定义为包含CDATA(如果我们将其置于HTML 4术语中),因此您唯一需要注意的是数据中存在</script></style>

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