1

我们有一个页面,用户可以在这里创建他的 ID。因此,任何未经授权的用户都可以来创建他的 ID。

问题是这个页面有一些 AJAX 调用进行验证,检查用户在屏幕上输入的 ID 格式是否正确。

攻击者可以通过 Browser-> Inspect Element 记下基于 AJAX 的 URL,并可以通过一些攻击工具多次调用它来阻塞我们的服务器。

请注意,基于 AJAX 的 URL 正在访问我认为正在执行资源密集型操作的 Web 服务(即域是否正确,用户是否已经存在?)。

我使用 Spring MVC 作为 Web 应用程序框架。我可以保护未经授权的用户对 URL (ajax) 的直接访问吗?

4

2 回答 2

1

如果 AJAX (XmlHTTPrequest) 请求 Web 服务的 URL,则不能隐藏它。

您最好在为您的网络服务提供服务的网络服务器上实施服务器端“节流”(谷歌搜索!)。如果特定 IP 发出过多请求,或者通过了某个请求的总体阈值 - 您将返回一个 Web 服务异常,要求用户稍后再试。

在 DDOS 的情况下,您需要在网络路由级别进行处理。

于 2013-09-02T05:23:47.740 回答
0

我有一个类似的要求,保护我的 Ajax 资源 - 不是从浏览器地址栏调用,而是通过 AJAX 请求,基本上是 XMLHTTPRequest。

编写了一个 AjaxOnlyFilter,它在字符串数组中查找 URL 映射,如果匹配,则检查是否存在“X-Requested-With”标头。

如果标头不存在或值与值“XMLHttpRequest”不匹配,则在 requestDispatcher 上调用转发到错误页面或设置 400 状态。

private String[] mappings = { "/model", "/records" , "/update" , "/insert", "/delete"};

public boolean urlContainsMappingsFromAJAXList(String url)
{
    for(int i =0; i < mappings.length; i++)
    {
        if(url.contains(mappings[i]))
        {
            return true;
        }
    }
    return false;
}

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain filterChain) throws IOException, ServletException {

    HttpServletRequest httpServletRequest = (HttpServletRequest) request;    

    StringBuffer requestURL = httpServletRequest.getRequestURL();

    if(urlContainsMappingsFromAJAXList(requestURL.toString())){

        String requestedWithHeader = httpServletRequest.getHeader("X-Requested-With");

        //if X-Requested-With header is not XMLHttpRequest
        if(requestedWithHeader==null || (!requestedWithHeader.equalsIgnoreCase("xmlhttprequest"))){
            LOGGER.debug("Not a AJAX request, redirection to error page");
            httpServletRequest.getRequestDispatcher("error404.jsp").forward(request, response);
            return;
        }
        //else continue with filter chain
    }
    //else continue with filter chain

    // pass the request along the filter chain
    filterChain.doFilter(request, response);
}
于 2014-08-13T15:13:27.937 回答