【问题标题】:Protect direct access of AJAX based URL保护基于 AJAX 的 URL 的直接访问
【发布时间】:2013-09-05 03:26:29
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ajax spring model-view-controller


    【解决方案1】:

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

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

    如果是 DDOS,则需要在网络路由级别进行处理。

    【讨论】:

    • 假设攻击者在每个请求上都在欺骗 IP(可能是 DDOS 的情况),那么我该如何防止呢?
    • 如果他们期望得到响应,他们就不能欺骗他们的 IP —— IP 不能那样工作。如果他们不期望得到响应(例如:DDOS),那么您在 Web 服务级别就无能为力了。 (您需要通过日志记录识别流量并通过路由将其转移)。如果他们使用的是僵尸网络,并且他们的流量不容易以其他方式识别......那么你就完蛋了)。
    • 我知道这需要在网络级别完成。但我很想知道可以在网络级别应用什么来避免 DDOS?
    • 如果流量可以通过来源识别,那么您将它们设为空路由(或让您的 ISP 在上游进行)。如果没有,那么您几乎无能为力。
    【解决方案2】:

    我有一个类似的要求,保护我的 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-03
      • 2017-05-29
      相关资源
      最近更新 更多