如何保护Ajax链接请求?

10 浏览
0 Comments

如何保护Ajax链接请求?

想象一下下面的场景:用户想要在一个网页上注册并填写表单。在用户填写表单的同时,jQuery通过正则表达式检查字段是否有效等等...

以电子邮件作为用户注册后登录所使用的主键,需要使用Ajax检查电子邮件字段,以让用户知道该电子邮件是否已注册。我想使用Ajax来检查,以避免发送完整的表单、清空表单、刷新页面等操作...

因此,当用户填写完电子邮件字段后,Ajax请求会被发送到服务器,类似于下面的链接:

example.com/[email protected]

当check.php接收到电子邮件时,它会向数据库询问该电子邮件是否存在,并返回如下的消息:如果用户存在,则返回User already exists,如果用户不存在,则返回null

问题是:如果有人深入研究我的.js文件,并发现类似的链接,他们可以使用该链接发送大量的请求,以找出这些随机电子邮件是否存在。这可能会导致数据库的大量使用,甚至在最糟糕的情况下导致崩溃和私人信息泄漏。

某人可以使用循环来检查电子邮件,例如:

//获取下面链接的响应
example.com/[email protected] // 返回null
example.com/[email protected] // 返回null
example.com/[email protected] // 返回null
example.com/c[email protected] // 返回User already exists

------------------------------------------------------------------------------------------------------------------------------------

自从我上次接受答案以来,我一直在调查这个问题,并找到了避免这种行为的解决方案。下面的代码是针对JAVA的,但是这种逻辑可以应用于任何其他服务器端语言。

在向服务器发送任何Ajax请求之前,我向服务器请求一个令牌。这个令牌看起来像这样fmf5p81m6e56n4va3nkfu2ns8n,它由一个简单的方法生成,也可以更复杂,但是这个足够了。

public String getToken() throws UnsupportedEncodingException {
    return new BigInteger(130, new SecureRandom()).toString(32);
}

当请求令牌时,服务器不仅返回令牌,还返回一个小脚本,以防有人使用浏览器检查元素(和浏览器导航栏)等,脚本将运行并清除令牌。Servlet返回类似于这样的内容:

_html += ""
    + ""
    + ""
    + ""
    + "[" + token+ "]"
    + ""
    + "";

首先清空body,然后导航回我们想要的任何地方。然后javascript/jquery会将整个内容作为字符串捕获,然后我只需提取在 [ 和 ] 之间的字符串。这个令牌只在下一次请求可用,因此每个Ajax请求都将有其唯一的令牌。在第二个请求中,刚使用的令牌将被删除。

在获得令牌后,我将其作为参数附加到请求的任何链接上,类似于这样:

ajaxRequestObjet = $.ajax({
    url: "http://localhost:8084/mywebsite.com/servlet", //<-- 本地tomcat服务器
    method: "POST",
    data: "type=AJAX&page=some-article&token=fmf5p81m6e56n4va3nkfu2ns8n"
});

这种方法对手动检查网站并尝试使用链接的人来说效果很好,但是对于自动执行此操作的Java/PHP/IIS服务器呢?

对于这个问题,可以检查header!类似于这样:

boolean isAjax = "XMLHttpRequest".equals(request.getHeader("X-Requested-With")); 

只有当XMLHttpRequest存在时,它才为true...

还有一件事需要记住。确保在您的应用程序中不存在'Access-Control-Allow-Origin' header,以确保您的服务器资源不会被不在您的服务器上的任何javascript获取。如果不存在此标头,则Chrome将返回以下内容:

XMLHttpRequest无法加载http://localhost:8084/mywebsite.com/servlet。所请求的资源上没有'Access-Control-Allow-Origin'标头。因此,不允许访问来源'http://localhost'。

Java服务器在tomcat中,我还有另一个Apache用于进行这些测试,这是Apache中的小html,给出了上面的错误:



    
    




0