用户可能会尝试将恶意数据发送到Web应用程序。使用防火墙时,它将阻止请求而不返回任何内容。
Spring MVC是否可以在应用程序级别执行相同的操作,因为返回某些内容以进行恶意攻击是浪费资源,尤其是在DDOS尝试的情况下?
由于
答案 0 :(得分:2)
防火墙根据规则(或策略)阻止请求。
示例:如果IP每秒发送的请求超过10个,则阻止所有后续请求2小时。
我可以使用Spring MVC吗?
好吧,因为你可以用它编程任何东西:是的,你可以。 (虽然你只能发送一个空响应,但不会阻止像防火墙一样的连接。)你所要做的就是考虑规则并实现它们。
但它并不像设置防火墙那么简单,而且很可能这不是你应用程序的工作。
对于上面的示例,您可以创建一个HashMap
来存储从控制器请求任何内容的每个IP;和一个柜台。如果该计数器大于10,则将IP移至另一个HashMap
(例如blockedIpsMap
)两小时。然后,每次向控制器发出的请求都应该在发送响应之前检查IP是否不在blockedIpsMap
。
再次:可能吗?是。你应该这样做吗?只有你确实需要这样做(例如,如果你受到很多攻击),并且无法使用防火墙进行管理(一种软件意味着这样做)
构建应用程序服务器(和Servlet)的方式,您必须始终返回响应。我的意思是:你不能发送回复。 (Servlet和应用程序服务器都是健壮的,没有响应就会失败。)
正如我所说,防火墙可以阻止连接,但绝不会在需要时发送响应。
无论如何,由于你必须发送一个回复,你所能做的只是发送一个回复。
使用 Spring MVC ,发送空响应就是这样:
@RequestMapping(value = "/path")
@ResponseBody
public String emptyResponse() {
if (shouldIblock()) {
return "";
}
else {
// do the stuff as usual
}
}
上面的代码将返回content-length = 0的HTTP 200-OK响应。
但是,你最好的选择是在每个请求和每个控制器之间使用Servlet Filter“。”
这是一个让你入门的代码(不言自明):
package ipfilter;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class BlockIPFilter implements Filter {
public void init(FilterConfig config) throws ServletException { }
public void destroy() { }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterchain) throws IOException, ServletException {
String userip = request.getRemoteAddr();
if (isIpAllowed(userip)) {
filterchain.doFilter(request, response); // go on
} else {
HttpServletResponse httpResponse = null;
if (response instanceof HttpServletResponse) {
httpResponse = (HttpServletResponse) response;
}
// will return a 403-Forbidden error
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Error message (may wanna leave empty)");
/* or you can just comment the line above and an empty
* response 200-OK will be sent, giving no clue to the user that he was blocked
*/
}
}
public boolean isIpAllowed(String ip) {
// maybe add to the HashMap and do any other checking
return false;
}
}
同时将其添加到web.xml
的顶部:
<filter>
<filter-name>BlockIPFilter</filter-name>
<filter-class>ipfilter.BlockIPFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>BlockIPFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>