Spring MVC不返回HTTP响应

时间:2013-05-02 23:26:00

标签: spring spring-mvc

用户可能会尝试将恶意数据发送到Web应用程序。使用防火墙时,它将阻止请求而不返回任何内容。

Spring MVC是否可以在应用程序级别执行相同的操作,因为返回某些内容以进行恶意攻击是浪费资源,尤其是在DDOS尝试的情况下?

由于

1 个答案:

答案 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>