如何保护Ajax链接请求?
如何保护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+ "]" + "" + "