gpt4 book ai didi

XSS 过滤器以 enctype ="multipart/form-data"形式

转载 作者:行者123 更新时间:2023-12-04 17:07:47 24 4
gpt4 key购买 nike

我找到了防止 xss 攻击的下一个代码。但它有一个问题。它适用于具有 enctype="application/x-www-form-urlencoded" 的表单,但不适用于具有 enctype="multipart/form-data" 的表单.我观察到 getParameterValues() 和其他方法没有被调用。

//--- XSS过滤器---//

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
* Servlet Filter implementation class XSSFilter
*/
public class XSSFilter implements Filter {

@SuppressWarnings("unused")
private FilterConfig filterConfig;

/**
* Default constructor.
*/
public XSSFilter() {

}

public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}

public void destroy() {
this.filterConfig = null;
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
chain.doFilter(new RequestWrapperXSS((HttpServletRequest) request), response);
}

}

//--- RequestWrapperXSS ---//

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public final class RequestWrapperXSS extends HttpServletRequestWrapper {
public RequestWrapperXSS(HttpServletRequest servletRequest) {
super(servletRequest);
}

public String[] getParameterValues(String parameter) {
System.out.println("entra parameterValues");
String[] values = super.getParameterValues(parameter);
if (values == null) {
return null;
}
int count = values.length;
String[] encodedValues = new String[count];
for (int i = 0; i < count; i++) {
encodedValues[i] = cleanXSS(values[i]);
}
return encodedValues;
}

public String getParameter(String parameter) {
System.out.println("entra getParameter");
String value = super.getParameter(parameter);
if (value == null) {
return null;
}
return cleanXSS(value);
}

public String getHeader(String name) {
System.out.println("entra header");
String value = super.getHeader(name);
if (value == null)
return null;
return cleanXSS(value);
}

private String cleanXSS(String cadena) {
System.out.println("entra claean XSS");
StringBuffer sb = new StringBuffer(cadena.length());
// true if last char was blank
boolean lastWasBlankChar = false;
int len = cadena.length();
char c;

for (int i = 0; i < len; i++)
{
c = cadena.charAt(i);
if (c == ' ') {
// blank gets extra work,
// this solves the problem you get if you replace all
// blanks with &nbsp;, if you do that you loss
// word breaking
if (lastWasBlankChar) {
lastWasBlankChar = false;
sb.append("&nbsp;");
}
else {
lastWasBlankChar = true;
sb.append(' ');
}
}
else {
lastWasBlankChar = false;
//
// HTML Special Chars
if (c == '"')
sb.append("&quot;");
else if (c == '&')
sb.append("&amp;");
else if (c == '<')
sb.append("&lt;");
else if (c == '>')
sb.append("&gt;");
else if (c == '\n')
// Handle Newline
sb.append("&lt;br/&gt;");
else {
int ci = 0xffff & c;
if (ci < 160 )
// nothing special only 7 Bit
sb.append(c);
else {
// Not 7 Bit use the unicode system
sb.append("&#");
sb.append(new Integer(ci).toString());
sb.append(';');
}
}
}
}
return sb.toString();


}
}

最佳答案

如果是multipart/form-data请求,数据可通过 getPart() 获得和 getParts() 方法,而不是 getParameter() , getParameterValues()和配偶。

请注意,这些方法是在 Servlet 3.0 中引入的,在旧版本中,没有任何标准的 API 工具可以从 multipart/form-data 中提取数据。要求。用于此的事实上的 API 是众所周知的 Apache Commons FileUpload .


与具体问题无关,这是 IMO 防止 XSS 的糟糕方法。在重新显示用户控制的输入期间,应该在 View 端阻止 XSS,就在那里它可能造成伤害。在处理用户控制的输入之前转义只会有双重转义的风险,因为这不是 XSS 预防的“标准”方式。开发人员应该确保他们始终使用 JSTL 在 View 端转义用户控制的数据 <c:out>fn:escapeXml()或任何其他 MVC 框架提供的工具(例如 JSF 默认转义所有内容)。

另见

关于XSS 过滤器以 enctype ="multipart/form-data"形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9080338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com