我们有一个页面,用户可以来创建他的ID。因此,任何未经授权的用户都可以来创建他的ID。
问题是这个页面有一些用于验证的AJAX调用,它检查用户在屏幕上输入的ID格式是否正确。
攻击者可以通过浏览器记录基于AJAX的URL>检查元素,可以通过一些攻击工具阻止我们的服务器多次调用它。
请注意基于AJAX的URL正在访问一个我认为正在进行资源密集型操作的Web服务(即域是否正确,用户是否已经存在?)。
我使用Spring MVC作为Web应用程序框架。我可以保护未经授权的用户直接访问URL(ajax)吗?
答案 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);
}