保护对基于AJAX的URL的直接访问

时间:2013-09-02 05:19:48

标签: ajax spring model-view-controller

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

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

攻击者可以通过浏览器记录基于AJAX的URL>检查元素,可以通过一些攻击工具阻止我们的服务器多次调用它。

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

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

2 个答案:

答案 0 :(得分:1)

如果是AJAX(XmlHTTPrequest)请求,则无法隐藏Web服务的URL。

您最好在为您的网络服务提供服务的网络服务器上实施服务器端“限制”(google it!)。如果某个特定的IP请求过多,或者传递了一些请求的总阈值 - 您将返回一个Web服务异常,要求用户稍后再试。

对于DDOS,您需要在网络路由级别处理。

答案 1 :(得分:0)

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

写了一个AjaxOnlyFilter,它在一个字符串数组中查找URL映射,如果匹配,则检查" X-Requested-With"的存在。报头中。

如果标头不存在或者值与值#34; XMLHttpRequest"不匹配,则在requestDispatcher上调用forward到错误页面或设置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);
}