SpringMVC结果参数转换XSS攻击安全处理
首先在sprigMvc的配置文件中配置返回结果集使用的类
<!-- 参数转码 -->
<mvc:annotation-driven>
<!-- 注册处理 JSON 的转换器 register-defaults="true" -->
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html;charset=UTF-8" />
<property name="writeAcceptCharset" value="false" />
</bean>
<bean class="com.util.json.JsonConverter">
<property name="supportedMediaTypes">
<list>
<!-- 这里顺序不能反,一定先写text/html,不然ie下出现下载提示 -->
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
由于现有工程使用的是json对象结果集,所以只对json格式的参数进行转义
然后在自己工程里配置一个JSON返回结果集的参数转换类
package com.util.json; import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map; import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject; import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; /**
* JSON格式返回参数转换类
* <功能详细描述>
*
* @author songxiaotong
* @version [版本号, 2016年10月14日]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public class JsonConverter extends FastJsonHttpMessageConverter
{
/**
* 日志记录器
**/
private static final Logger LOGGER = LogManager.getLogger(JsonConverter.class); /**
* 重写writeInternal方法,在返回内容前首先进行HTML字符转义
* <功能详细描述>
* @param object
* @param outputMessage
* @throws IOException
* @throws HttpMessageNotWritableException
* @see [类、类#方法、类#成员]
*/
@Override
protected void writeInternal(Object object, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException
{
// 获取输出流
OutputStream out = outputMessage.getBody(); // 获取要输出的文本
String text = JSON.toJSONString(object, super.getFeatures()); // 对文本做HTML特殊字符转义
String result = convertJson(text); // 输出转义后的文本
out.write(result.getBytes(super.getCharset()));
} /**
* JSON参数转义
* <功能详细描述>
* @param json
* @return
* @see [类、类#方法、类#成员]
*/
private String convertJson(String json)
{
try
{
// 判断是否是JSON对象
if (json.startsWith("{"))
{
// 将参数转换成JSONObject
JSONObject jsonObj = JSONObject.fromObject(json);
// 处理参数
JSONObject myobj = jsonObj(jsonObj);
return myobj.toString();
}
// 判断是否是JSON数组
else if (json.startsWith("["))
{
// 将参数转换成JSONArray
JSONArray jsonArray = JSONArray.fromObject(json);
//处理参数
JSONArray array = parseArray(jsonArray);
return array.toString();
}
else
{
return json;
}
}
catch (JSONException e)
{
LOGGER.error("Json数据解析处理失败!");
return "{}";
}
} /**
* JSON参数Map(对象)转义
* <功能详细描述>
* @param json
* @return
* @see [类、类#方法、类#成员]
*/
@SuppressWarnings("rawtypes")
private JSONObject jsonObj(JSONObject json)
{ for (Iterator iter = json.keys(); iter.hasNext();)
{
// 获取对象的key
String key = (String)iter.next();
// 获取对象的值
Object obj = json.get(key); // 判断对象类型
if (obj instanceof List)
{
json.put(key, parseArray((JSONArray)obj)); }
// 判断是否是对象结构
else if (obj instanceof Map)
{
// 处理参数
json.put(key, jsonObj((JSONObject)obj));
}
else if (obj instanceof String)
{
// 处理参数
json.put(key, convertStr((String)obj));
} }
return json;
} /**
* JSON参数List(数组)转义
* <功能详细描述>
* @param json
* @return
* @see [类、类#方法、类#成员]
*/
private JSONArray parseArray(JSONArray jsonArray)
{
// 判空
if (null == jsonArray || jsonArray.isEmpty() || jsonArray.size() == 0)
{
return jsonArray;
}
//
for (int i = 0, l = jsonArray.size(); i < l; i++)
{
Object obj = jsonArray.get(i); // 判断是否是数据结构
if (obj instanceof List)
{
// 处理数组对象
parseArray((JSONArray)obj);
}
// 判断是否是对象结构
else if (obj instanceof Map)
{
// 处理参数
jsonObj((JSONObject)obj);
}
// 判断是否是String结构
else if (obj instanceof String)
{
jsonArray.set(i, convertStr((String)obj));
}
} return jsonArray;
} /**
* HTML脚本转义
* <功能详细描述>
* @param str
* @return
* @see [类、类#方法、类#成员]
*/
private String convertStr(String str)
{
// TODO &、<、>、"、'、(、)、%、+、\
return str.replace("&", "&")
.replace("<", "<")
.replace(">", ">")
.replace("\"", """)
.replace("'", "'")
.replace("(", "(")
.replace(")", ")")
.replace("%", "%")
.replace("+", "+")
.replace("\\", "\");
}
}
SpringMVC结果参数转换XSS攻击安全处理的更多相关文章
- XSS攻击解决办法 Spring mvc databinder
XSS攻击解决办法 一.SpringMVC架构下@InitBinder方法 Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解, ...
- 360[警告]跨站脚本攻击漏洞/java web利用Filter防止XSS/Spring MVC防止XSS攻击
就以这张图片作为开篇和问题引入吧 <options>问题解决办法请参考上一篇 如何获取360站长邀请码,360网站安全站长邀请码 首先360能够提供一个这样平台去检测还是不错的.但是当体检 ...
- XSS攻击过滤处理
关于XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中. XSS漏洞的危害 网络钓鱼,包括盗取各类用户账号: 窃取用户cooki ...
- 记一次JAVA WEB项目解决XSS攻击的办法(亲测有效)
什么是XSS攻击 简单来说,XSS 攻击是页面被注入了恶意的代码,度娘一大堆的东西,不想说 系统架构主要是SSM框架,服务层另外使用了DubboX. 为啥说这个,因为SpringMVC对于Xss攻 ...
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...
- SpringBoot防XSS攻击
1 . pom中增加依赖 <!-- xss过滤组件 --> <dependency> <groupId>org.jsoup</groupId> < ...
- Spring Boot XSS 攻击过滤插件使用
XSS 是什么 XSS(Cross Site Scripting)攻击全称跨站脚本攻击,为了不与 CSS(Cascading Style Sheets)名词混淆,故将跨站脚本攻击简称为 XSS,XSS ...
- 防御XSS攻击-encode用户输入内容的重要性
一.开场先科普下XSS 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶 ...
- 防止XSS攻击的方法
什么是XSS? 使用Jsoup来防止XSS攻击 Jsoup官网 Jsoup中文 maven包引入 <dependency> <groupId>org.jsoup</gro ...
随机推荐
- 实例透彻分析CMS垃圾收集器执行过程
CMS收集器收集步骤: 在上一次[https://www.cnblogs.com/webor2006/p/11055468.html]中已经对CMS的垃圾收集器有了一定的理论上的了解,其中提到了CMS ...
- CSS自定义字体的实现,前端实现字体压缩
CSS中使用自定义字体,首先需要下载你需要的字体ttf或者otf文件 这里推荐一个网站:http://www.zitixiazai.org/ /********css中********/ @font- ...
- 初学JavaScript正则表达式(六)
JavaScript预定义类 ab+数字+任意字符 ab[0-9][^\r\n] 等价于 ab\d. '@123@abc@'.replace(/@./g,'Q') Q23Qbc@ 将"@加任 ...
- ACM-单向链表插入排序算法(在原链表上操作)
/* 1.若链表只有一个节点或者为空,直接返回 2.将链表的前两个节点排序,并将排序之后的第二个节点的下一个节点赋空 3.此时整个链表分为了两个,将未排序的节点一一插入到已排序链表中: 3.1.第 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第十一周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第十一周学习总结 实验九 泛型程序设计技术 实验时间 2019-11-8 1.实验目的与要求 (1) 理解泛型概念: (2 ...
- mysql 高级查询二
各种showshow columns from my_student;show grants for root;show aviables;show processlist;show table st ...
- python批量json文件转xml文件脚本(附代码)
场景:在使用了mask rcnn跑实验后标注了大量地json格式文件,现在打算使用yolo和faster rcnn 跑实验 所以需要将之前地json文件转为xml 但是找了很久,没发现有批量处 ...
- Open3D-PointNet2-Semantic3D-master的运行
1.修改download_semantic3d.sh文件 #!/bin/bash ans=`dpkg-query -W p7zip-full` if [ -z "$ans" ]; ...
- oracle存储过程中循环游标,变量的引用
创建出错时使用: show errors查看具体的错误提示 一. 存储过程中的一个循环及变量引用示例: create or replace procedure my_proiscursor cur i ...
- Codeforces Round 589 (Div. 2) 题解
Is that a kind of fetishism? No, he is objectively a god. 见识了一把 Mcdic 究竟出题有多神. (虽然感觉还是吹过头了) 开了场 Virt ...