使用htmlentities( )函数抵御跨站点脚本(XSS)攻击

Posted lnboxue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用htmlentities( )函数抵御跨站点脚本(XSS)攻击相关的知识,希望对你有一定的参考价值。

网站为了实现和用户的互动,经常会提供留言版块方便用户提交留言信息,但是如果用户在表单中的留言板输入的留言内容恰恰就是一些html代码的话,就会对页面的格式产生意想不到的影响,比如用户如图1所示那样输入了内容并提交,就会收到图2的处理信息。

图1

使用htmlentities( )函数抵御跨站点脚本(XSS)攻击

图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将字符串编码为数据库

SpringBoot 项目添加抵御跨站防御脚本(XSS)攻击功能

153-PHP htmlentities函数

使用 `json_encode` 防止 XSS 攻击

有啥 绕过 htmlentities 进行 xss 攻击的方法吗