Web安全之防止XSS跨站脚本攻击

XSS攻击全称跨站脚本攻击(Cross-site scripting),为和CSS区别,改为XSS。XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意的web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。
XSS攻击的产生原因是对外部输入的参数没有做严格过滤,导致输入参数直接参与页面源代码,相当于页面源代码可以被外部修改,因此可能被改变页面结构、植入恶意脚本,可被用于钓鱼、盗取数据、篡改页面等。解决的方法是加强页面输出过滤或转义,如ESAPI的Encoder转义、自定义转义,或者采用不存在XSS风险的页面标签进行输出。

攻击分类

反射型XSS攻击

又称为非持久性跨站点脚本攻击。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。

例子

http://www.test.com/message.php?send=Hello,World 

接收者将会接收信息显示Hello,World

http://www.test.com/message.php?send=<script>alert(‘foolish!’)</script> 

接收者接收消息显示的时候将会弹出警告窗口显示foolish!

存储型XSS攻击

又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大,因为每当用户打开页面,查看内容时脚本将自动执行。

例子

一个正常的表单,正常操作是用户提交相应留言信息;将数据存储到数据库;其他用户访问,应用查询数据并显示。

<input type=“text” name=“content” value=“这里是用户填写的数据”> 

攻击者在value填写

<script>alert(‘foolish!’)</script> 

或者其他攻击代码。将代码存储到数据库中;其他用户取出数据显示的时候,将会执行这些攻击性代码。

攻击入口

可以通过HTML节点、HTML属性、JavaScript代码、富文本等只要有用户输入信息的地方都可能是被攻击的注入点。

防范方法

需要将一些特殊字符进行转义处理。
Web安全之防止XSS跨站脚本攻击

  • 通过前端对用户输入内容进行处理:

     var escapeHtml = function(str) { str = str.replace(/</g,'&lt;'); str = str.replace(/</g,'&gt;'); return str; } 
  • 通过后台对用户输入内容进行处理:

     private String cleanXSS(String value) { //You'll need to remove the spaces from the html entities below value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;"); value = value.replaceAll("\(", "(").replaceAll("\)", ")"); value = value.replaceAll("'", "'"); value = value.replaceAll("eval\((.*)\)", ""); value = value.replaceAll("[\"\'][\s]*javascript:(.*)[\"\']", """"); value = value.replaceAll("script", ""); return value; } 
  • 后台使用第三方方法处理:添加commons-lang-2.5.jar 包,然后使用方法或者使用Spring框架中的HtmlUtils方法:

     StringEscapeUtils.escapeHtml(string); StringEscapeUtils.escapeJavaScript(string); StringEscapeUtils.escapeSql(string); 

在父Controller里面进行处理:

@InitBinder protected void initBinder(WebDataBinder binder) { // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击 binder.registerCustomEditor(String.class, new PropertyEditorSupport() { @Override public void setAsText(String text) { setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim())); } @Override public String getAsText() { Object value = getValue(); return value != null ? value.toString() : ""; } }); } 

参考资料

  1. XSS攻击原理分析与防御技术
  2. XSS跨站脚步攻击
  3. Web安全测试之XSS
  4. Java防止XSS攻击方法

原文链接:https://www.cnblogs.com/universal/p/10481673.html

原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/18049

(0)
上一篇 2023年8月21日
下一篇 2023年8月22日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml