使用htmlentities( )函数抵御跨站点脚本(XSS)攻击
Posted lnboxue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用htmlentities( )函数抵御跨站点脚本(XSS)攻击相关的知识,希望对你有一定的参考价值。
网站为了实现和用户的互动,经常会提供留言版块方便用户提交留言信息,但是如果用户在表单中的留言板输入的留言内容恰恰就是一些html代码的话,就会对页面的格式产生意想不到的影响,比如用户如图1所示那样输入了内容并提交,就会收到图2的处理信息。
图1
图2
上面的问题是用户提交的这些留言(HTML代码),都被服务器当作HTML源码执行和解析了。这种问题或许还会导致更糟的结果,从而引发网站安全方面的问题。比如javascript就是被放置在HTML标签中的,所以怀有恶意的用户会在留言区域提交JavaScript,当这些JavaScript重新显示在处理页面上时它们会被执行,这被称为“跨站点脚本攻击”。跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页时,嵌入Web里面的html代码会被执行,从而达到恶意用户的特殊目的。比如,用户在留言板中提交的内容是:
<script>alert("你好")</script>
那么当用户提交这些内容时,这些代码就会在服务器端被运行,用户就会收到下图中的信息:
图3
显然这可不是我们希望看到的结果。为了防止用户提交的内容中的代码被服务器当作HTML代码执行或解析,我们可以使用函数htmlentities( )将内容中的代码转换为HTML实体输出,这样就得到我们想要的效果了。可以这样书写posting.php处理用户的留言内容:
<?php
$name=$_POST['name']; //将表单中填写的用户姓名赋予变量$name
$html_post=nl2br(htmlentities($_POST['posting'])); /*将用户留言内容中出现的代码使用htmlentities( )函数转换为HTML实体内容后再应用nl2br( )函数处理用户输入时的换行问题,将处理结果赋予变量$html_post。nl2br( )函数的用法请参考上两期内容*/
print "<p>谢谢您,".$name.",感谢您提交的留言:"."<p>".$html_post."<p>稍后我们会将处理结果发送至您的邮箱:".$email;
?>
这样,用户提交的留言内容经过posting.php这个页面的处理后,用户就会看到网站的反馈信息了,请参见图4:
图4
以上是关于使用htmlentities( )函数抵御跨站点脚本(XSS)攻击的主要内容,如果未能解决你的问题,请参考以下文章
如何修复 Veracode - 跨站点脚本 - CWE ID 80 - 基本 XSS - 在 .each 函数中使用 $(item)
PHP Htmlentities函数未使用PDO将字符串编码为数据库