使用Struts2框架开发的后台在防御XSS攻击的时候很多方式都不能用,因为Struts2对请求进行的二次封装有区别。以下针对Struts2的XSS攻击进行拦截过滤防御解决:

Struts2.3

本方案采用struts2的拦截器过滤,将提交上来的参数转码来解决。 
配置struts.xml:

<package name="default" namespace="/"
extends="struts-default, json-default">
<!-- 配置拦截器 -->
<interceptors>
<!-- 定义xss拦截器 -->
<interceptor name="xssInterceptor" class="...此处填写拦截器类名"></interceptor>
<!-- 定义一个包含xss拦截的拦截栈 -->
<interceptor-stack name="myDefault">
<interceptor-ref name="xssInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 这个必须配置,否则拦截器不生效 -->
<default-interceptor-ref name="myDefault"></default-interceptor-ref>
<action>
...此处省略n个action
</action>
</package>

Java代码,拦截器实现类:

import java.util.Map;
import org.apache.commons.lang3.StringEscapeUtils;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; public class XssInterceptor extends AbstractInterceptor{ @Override
public String intercept(ActionInvocation invocation) throws Exception {
// TODO Auto-generated method stub
ActionContext actionContext = invocation.getInvocationContext();
Map<String, Object> map = actionContext.getParameters();
for (Map.Entry<String, Object> entry : map.entrySet()) {
String value = ((String[])(entry.getValue()))[0];
entry.setValue(StringEscapeUtils.escapeHtml4(value));//将提交上来的字符串进行转码
//System.out.println((entry.getValue()));
}
return invocation.invoke();
}
}

Struts2.5

需要注意的是,根据测试,从Struts2.3升级到Struts2.5并不能平滑升级,也就是说不能向前兼容。 
Apache官方修改了invocation.getInvocationContext().getParameters();接口的实现,原来返回的是一个java.util.Map,现在返回了一个org.apache.struts2.dispatcher.HttpParameters类型的对象,总体来说更加合理。 
2.5版本的拦截器与2.3版本的差异主要在XssInterceptor.java这个类的intercept方法的具体实现,简单测试了一下,应该问题不大。

public class XssInterceptor extends AbstractInterceptor {

    @Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpParameters parameters = actionContext.getParameters();
for (Map.Entry<String,Parameter> entry : parameters.entrySet()) {
if (!entry.getValue().isMultiple() && entry.getValue().isDefined()){
if (!entry.getValue().getValue().equals(StringEscapeUtils.escapeHtml4(entry.getValue().getValue()))){
entry.setValue(new Parameter.Request(entry.getValue().getName(),StringEscapeUtils.escapeHtml4(entry.getValue().getValue())));
}
}
}
return invocation.invoke();
}
}

测试结果:

输入值:

payload:<script>alert(1)</script>

数据库查看入库:


经测试,上述方式能够有效防御XSS的攻击。

原文:https://blog.csdn.net/huplion/article/details/49001151

拦截过滤防御XSS攻击 -- Struts2.3 以及 2.5 的解决方式的更多相关文章

  1. 防御XSS攻击的七条原则

    本文将会着重介绍防御XSS攻击的一些原则,需要读者对于XSS有所了解,至少知道XSS漏洞的基本原理,如果您对此不是特别清楚,请参考这两篇文章:<Stored and Reflected XSS ...

  2. Jsoup代码解读之六-防御XSS攻击

    Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...

  3. 认识与防御XSS攻击

    什么是xss攻击? XSS,即(Cross Site Scripting)中文名称为“跨站脚本攻击”.XSS的重点不在于跨站攻击而在于脚本攻击.攻击者可以利用 web应用的漏洞或缺陷之处,向页面注入恶 ...

  4. WEB安全 - 认识与防御XSS攻击

    目录 什么是xss攻击? XSS的危害 XSS攻击分类 xss攻击示例 反射型攻击 - 前端URL参数解析 反射型攻击 - 后端URL参数解析 注入型攻击 - 留言评论 如何规避xss攻击? 总结 什 ...

  5. 8. 博客系统| 富文本编辑框和基于bs4模块防御xss攻击

    views.py @login_required def cn_backend(request): article_list = models.Article.objects.filter(user= ...

  6. Asp.net防御XSS攻击组件库

    一.AntiXss 翻看mvc4高级编程,偶看到作者强烈推荐使用AntiXss防御XSS攻击,收集资料看下. 目前类库已融入到.netframework中,类库主页不再更新. 使用方法:使用Nuget ...

  7. PHP不过过滤防止xss攻击的方法

    PHP不过过滤防止xss攻击的方法<pre> $content=htmlspecialchars($content); $pos=strpos($content,"\u" ...

  8. Spring mvc拦截器防御CSRF攻击

    CSRF(具体参考百度百科) CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSR ...

  9. 防御XSS攻击-encode用户输入内容的重要性

    一.开场先科普下XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶 ...

随机推荐

  1. 使用 AWK 去掉文本文档中的空白行

    在 Linux 操作系统中,可以使用 AWK 命令高效地处理文本文档.AWK 命令通过执行使用 AWK 语言编写的脚本程序,处理文本文档.AWK 脚本程序是由模式(patterns)与相关操作(cor ...

  2. RAMOS (内存操作系统)-无忧百科(不断完善中)

    RAMOS (内存操作系统)-无忧百科(不断完善中) - RAMOS - 无忧启动论坛 - Powered by Discuz! http://bbs.wuyou.net/forum.php?mod= ...

  3. DOM知识点总结

    今天简单整理了一下js三部曲之DOM部分的内容,二话不说先上笔记: 1.什么是DOM? Document Object Model,即文档对象模型,它是让JavaScript能够操作html和xml的 ...

  4. 双网卡单IP实现网卡冗余与负载均衡

    WINDOWS下: 所谓双网卡,就是通过软件将双网卡绑定为一个IP地址,这个技术对于许多朋友来说并不陌生,许多高档服务器网卡(例如intel8255x系列.3COM服务器网卡等)都具有多网卡绑定功能, ...

  5. kong api可视化管理工具konga安装

    说明:官网推荐: kong-dashboard,但对比界面高端程度和友好度,更推荐konga.[一个坑]kong版本问题:我在安装时目前kong最新版本已经到1.0.0, 对于konga和kong-d ...

  6. 数学模块_math

    ceil 进一, 向上取整 floor 向下取整 pow(x, y) x的y次方 print(math.pow(2, 3)) # 8.0 sqrt(x) x的开平方(结果为浮点数) print(mat ...

  7. new words

    Your cooperation is greatly appreciated 感谢您的合作! budget 预算

  8. python3 lcs 最大公共子序列

    抛出问题: 假定字符串 s1 = 'BDCABA', s2 = 'ABCBDAB',求s1和s2的最大公共子序列. 问题分析: 我们想要求出s1和s2的最大公共子序列,我们可以用c(i,j)表示s1( ...

  9. java 继承内存分配

    今天,复习的是继承的内存分配.我们知道,Java中内存可以初略分为堆.栈.方法区. package sort; class Person{ public int age; public String  ...

  10. jinja2 把文本变成html

    data 是传过去的值 过滤器 | {{data.name | safe}}