说明:此页面有跨网站脚本攻击。 跨站点脚本漏洞(即XSS )通常用Javascript语言编写,允许攻击者向其他用户发送恶意代码。 由于浏览器无法识别脚本是否可信,因此会运行站点之间的漏洞脚本,使攻击者能够检索其他用户的cookie或session。
加强建议:
整体修复方式:验证所有输入数据,有效检测攻击; 对所有输出数据进行适当编码,以防止成功注入的脚本在浏览器端运行。 具体如下。
输入验证:在数据被显示或接受为可存储之前,使用标准输入验证机制验证所有输入数据的长度、类型、语法和业务规则。
输出编码:在输出数据之前,建议确保用户提交的数据已正确编码实体,并对所有字符(不仅仅是子集)进行编码。
注意黑名单验证方法的局限性:如果只是搜索或替换关键字(如“”和“script”),XSS变种攻击很容易绕过验证机制。
警惕规范化错误:在验证录入之前,必须进行解码和规范化,以匹配APP应用程序的当前内部表示方式。 请确保APP应用程序不会解码相同的条目两次。 过滤客户端发送的数据时,通常建议排除双引号“”、尖括号“”等特殊字符,或将双引号“”转换为实体格式等,或者对客户端发送的数据中包含的特殊字符进行实体转换。 以下是要过滤的常用字符:
[1] |(竖线符号) ) ) ) ) ) ) )。
[2] (符号)
[3]; (分号)
[4] $ (美元符号) ) ) )。
[5] % (百分号)
[6] @(at符号)
[7] ' (单引号) )。
[8] (' ((引号) ) ) ) ) ) ) )。
[9] ' (反斜杠用单引号转义() ) )。
[10] " (()反斜线转义引号() ) ) ) )。
[11] (尖括号)
[12] (() );括号) ) ) ) ) )。
[13] (((加号) ) ) ) ) ) )。
[14] CR (回车,ASCII0x0d ) ) ) )。
[15] LF (换行,ASCII0x0a ) ) )。
[16],(逗号)
[17] ()反斜线) ) )。
请求页面关键字符转义;
[1] " (双引号):quot "
[2]’(单引号):apos
[3] (符号):amp
[4]
[5] (右尖括号):gt
建议将cookie标记为httpOnly,同时禁用TRACE方法,而不影响APP应用。
以上是绿色联赛的扫描结果和建议。
我在网上找了很多,很多只是过滤了普通的请求参数,不包括json格式的。 这也是我不能过滤的原因。 原理非常简单,可以解决XSS攻击,过滤和退出后端输入的数据,禁用XSS攻击代码。 为大家提供一个,避免绕道
xssandsqlhttpservletrequestwrapper.Java
importorg.Apache.com mons.lang3. string utils;
importorg.Apache.com mons.text.stringescapeutils;
import javax.servlet.http.http servlet请求;
导入javax.servlet.http.httpservletrequestwrapper;
//*
防止XSS攻击
*/
publicclassxssandsqlhttpservletrequestwrapperextendshttpservletrequestwrapper {
私有ttpservletrequestrequest;
publicxssandsqlhttpservletrequestwrapper (httpservletrequestrequest ) {
super (请求;
this.request=request;
}
@Override
公共字符串获取参数(字符串名称) {
string value=request.getparameter (name;
if (! stringutils.isempty(value ) }{
value=stringescapeutils.escape html4(value;
}
返回值;
}
@Override
公共字符串[ ] getparameter values {
string [ ] parameter values=super.getparameter values (name;
if (参数值==null )
{return null;
}
for (int i = 0; i < parameterValues.length; i++) {
String value = parameterValues[i];
parameterValues[i] = StringEscapeUtils.escapeHtml4(value);
}
return parameterValues;
}
}
这里重写了两个方法:getParameter和getParameterValues,getParameter方法是直接通过request获得querystring类型的入参调用的方法。如果是通过springMVC注解类型来获得参数的话,走的是getParameterValues的方法。大家可以通过打印一个输出来验证一下。
StringEscapeUtils.escapeHtml4这个方法来自Apache的工具类,maven坐标如下:
org.apache.commons
commons-text
1.4
XssFilter.java
过滤的代码写完了,下面就是在一个filter中应用该代码。
import com.fasterxml.wndbbt.databind.ObjectMapper;
import com.fasterxml.wndbbt.databind.module.SimpleModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.ssdby2ObjectMapperBuilder;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter
@Component
public class XssFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
XssAndSqlHttpServletRequestWrapper xssRequestWrapper = new XssAndSqlHttpServletRequestWrapper(req);
chain.doFilter(xssRequestWrapper, response);
}
@Override
public void destroy() {
}
/**
* 过滤json类型的
* @param builder
* @return
*/
@Bean
@Primary
public ObjectMapper xssObjectMapper(ssdby2ObjectMapperBuilder builder) {
//解析器
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
//注册xss解析器
SimpleModule xssModule = new SimpleModule("XssStringJsonSerializer");
xssModule.addSerializer(new XssStringJsonSerializer());
objectMapper.registerModule(xssModule);
//返回
return objectMapper;
}
}
过滤表单类型的代码已经完成(xssObjectMapper这个是后面过滤json类型才用到的)。下面来实现过滤json类型的代码:
XssStringJsonSerializer.java
import com.fasterxml.wndbbt.core.JsonGenerator;
import com.fasterxml.wndbbt.databind.JsonSerializer;
import com.fasterxml.wndbbt.databind.SerializerProvider;
import org.apache.commons.text.StringEscapeUtils;
import java.io.IOException;
public class XssStringJsonSerializer extends JsonSerializer {
@Override
public Class handledType() {
return String.class;
}
@Override
public void serialize(String value, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
if (value != null) {
String encodedValue = StringEscapeUtils.escapeHtml4(value);
jsonGenerator.writeString(encodedValue);
}
}
}
这里是通过修改SpringMVC的json序列化来达到过滤xss的目的的。其实也可以通过第一种方法,重写getInputStream方法来实现,这里我就不做演示了(通过json类型传参会走getInputStream方法,通过重写该方法打印输出可以证明)。