如何在java过滤器中更改请求体以防止< code>XSS攻击?我构建了< code > http servlet requestwrapper 并使用< code>getparameter来更改主体,但得到流关闭异常。
由于我没有足够的声誉来添加评论,我将添加它作为一个答案。三年后,我找到了公认的答案,节省了我的时间。同时,我必须解决两件事,因此添加了。。。
(1)一个bug(缺少对rawData的赋值)
public void resetInputStream(byte[] newRawData) {
rawData = newRawData;
servletStream.stream = new ByteArrayInputStream(newRawData);
}
(2)随着时间的推移需要进行的更改。参考:HttpServletRequest estWrapper,setReadListener/isFinfied/isReady的示例实现?
public class XSSFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
XSSRequestWrapper wrappedRequest = new XSSRequestWrapper(
(HttpServletRequest) request);
String body = IOUtils.toString(wrappedRequest.getReader());
if(!"".equals(body))
{
JSONObject oldJsonObject = new JSONObject(body);
JSONObject newJsonObject = new JSONObject();
for(String key : oldJsonObject.keySet())
{
newJsonObject.put(key, XSSUtils.stripXSS(oldJsonObject.get(key).toString()));
}
wrappedRequest.resetInputStream(newJsonObject.toString().getBytes());
}
chain.doFilter(wrappedRequest, response);
}
}
public class XSSRequestWrapper extends HttpServletRequestWrapper {
private byte[] rawData;
private HttpServletRequest request;
private ResettableServletInputStream servletStream;
public XSSRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
this.servletStream = new ResettableServletInputStream();
}
public void resetInputStream(byte[] newRawData) {
servletStream.stream = new ByteArrayInputStream(newRawData);
}
@Override
public ServletInputStream getInputStream() throws IOException {
if (rawData == null) {
rawData = IOUtils.toByteArray(this.request.getReader());
servletStream.stream = new ByteArrayInputStream(rawData);
}
return servletStream;
}
@Override
public BufferedReader getReader() throws IOException {
if (rawData == null) {
rawData = IOUtils.toByteArray(this.request.getReader());
servletStream.stream = new ByteArrayInputStream(rawData);
}
return new BufferedReader(new InputStreamReader(servletStream));
}
private class ResettableServletInputStream extends ServletInputStream {
private InputStream stream;
@Override
public int read() throws IOException {
return stream.read();
}
}
}
public class XSSUtils {
private XSSUtils()
{
}
public static String stripXSS(String value) {
return value == null ? value : escapeHtml4(value);
}
}
问题内容: 如何使用Servlet过滤器来更改来自的传入Servlet请求网址 至 ? 问题答案: 实施。 在方法中,将传入内容强制转换为。 用抢的路径。 使用简单的方法,如,,c等提取感兴趣的部分,构成了新的路径。 使用或然后将请求/响应转发到新的URL(服务器端重定向,不反映在浏览器地址栏中),或将传入的内容强制转换为然后将响应重定向到新的URL(客户端重定向,反映在浏览器地址栏)。 注册过滤
我在Eclipse Juno中启动了一个DyanmicWeb项目,但现在我想继续在Netbean 7.3中工作。当我在Eclipse中创建Servlet时,默认情况下使用如下注释(而不是在中注册): 但是当我在Netbeans中创建一个servlet时,它没有显示注释,也没有将Servlet名称和映射放在web.xml中。 如何在 Netbeans 中设置我的项目以创建带有注释的 Servlet?
是否可以更改事件接收的对象的标头? 两次尝试: > 修改现有标题: 失败,原因是。 创建新的请求对象: 失败与
问题内容: index.php 一个.php two.php ajax.js 上面的代码运行完美。当我单击链接“ One”时,字符串“ One”被加载到工作区DIV中,而当我单击链接“ Two”时,则字符串“ Two”被加载到工作区DIV中。 题: 现在,我想使用下拉列表在工作区DIV中加载one.php和two.php,而不是index.php中的链接。 当我使用链接时,我在链接属性中使用cla
问题内容: 我想向页面URL 添加一些参数。我正在加载这样的内容: 如何更改具有相同参数的URL ? 问题答案: 您可以使用HTML5 pushState API来实现。但是,只有最新的浏览器才支持它,而IE9甚至不支持IE。没有办法做到这一点。但是,有一个约定,您将使用location.hash来指示页面的状态已被ajax请求修改的页面。有关如何使用URL散列来表示你的页面上状态的更多信息,你可
问题内容: 在Java Servlet中,如何更改现有Cookie的值?有一个addCookie方法,但是HttpServletResponse中没有deleteCookie或editCookie 问题答案: 那些确实不存在。只需自己创建实用工具方法即可。特别是获得所需的cookie会很肿。例如 要编辑Cookie,请设置其值,然后将其添加到响应中: 如果有必要,请设置最大值,路径和域(如果它们与