如何保护Ajax链接请求?

Alp*_*a2k 39 javascript php ajax jquery

想象一下下一个场景:用户想要注册到网页并填写表格.当他填写表单时,如果字段有效,jQuery会继续检查正则表达式等等...

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

因此,当用户结束填写电子邮件字段时,Ajax请求将发送到服务器,类似于下一个链接:

example.com/check.php?email=abcdefg@gmail.com
Run Code Online (Sandbox Code Playgroud)

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

问题是:如果有人通过我的.js挖掘并发现类似的链接,他们可以使用该链接发送大量请求以查明是否存在这些随机电子邮件.这可能导致大量使用数据库,或者在最坏的情况下甚至导致崩溃和私人信息泄露.

有人可以做一个巨大的for循环检查电子邮件,如:

//Getting the response of the next links
example.com/check.php?email=aaaaaaa@gmail.com // Returns null
example.com/check.php?email=aaaaaab@gmail.com // Returns null
example.com/check.php?email=aaaaaac@gmail.com // Returns null
example.com/check.php?email=aaaaaad@gmail.com // Returns User already exists
Run Code Online (Sandbox Code Playgroud)

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

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

在对服务器执行任何ajax请求之前,我向服务器请求令牌.这个令牌看起来像这fmf5p81m6e56n4va3nkfu2ns8n是一个简单的方法,但它可以更复杂,但这很好.

public String getToken() throws UnsupportedEncodingException {
    return new BigInteger(130, new SecureRandom()).toString(32);
}
Run Code Online (Sandbox Code Playgroud)

在请求令牌时,服务器不仅会返回令牌,还会返回一个小脚本,以防万一有人使用浏览器检查元素(和浏览器导航栏),这样的脚本将运行并且令牌将被清除.Servlet返回如下内容:

_html += "<head>"
    + "<script> "
    + "window.onload=function(){\n"
    + "       document.body.innerHTML = \"\";\n"
    + "    }"
    + "window.location.href='http://mywebsite.com' "
    + "</script>"
    + "</head>"
    + "<body>"
    + "[" + token+ "]"
    + "</body>"
    + "</html>";
Run Code Online (Sandbox Code Playgroud)

首先清空身体然后导航回我们想要的任何地方.然而,javascript/jquery将整个内容作为字符串捕获,然后我只是在[和]之间提取字符串.此令牌仅适用于下一个请求,因此每个AJAX请求都将具有其唯一令牌.在第二个请求中,删除刚刚使用的令牌.

获得令牌后,我将其作为参数附加到我请求的任何链接,如下所示:

ajaxRequestObjet = $.ajax({
    url: "http://localhost:8084/mywebsite.com/servlet", //<-- local tomcat server
    method: "POST",
    data: "type=AJAX&page=some-article&token=fmf5p81m6e56n4va3nkfu2ns8n"
});
Run Code Online (Sandbox Code Playgroud)

这种方法适用于手动检查网站并尝试使用链接的人,但是那些自动执行此操作的java/php/IIS服务器呢?

为此请求标题!像这样的东西:

boolean isAjax = "XMLHttpRequest".equals(request.getHeader("X-Requested-With")); 
Run Code Online (Sandbox Code Playgroud)

仅当XMLHttpRequest存在时才会成立....

还有一件事要记住.确保确保'Access-Control-Allow-Origin' header is NOT present in your app服务器中的任何javascript都不会获得服务器资源.如果此标头不存在,则chrome将返回以下内容:

XMLHttpRequest cannot load http://localhost:8084/mywebsite.com/servlet. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)

Java服务器在tomcat中,我有另一个apache用于此测试,这是apache中存在的小html,它给出了上面的错误:

<html>
<head>
    <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>

    <script>
    ajaxRequestObjet = $.ajax({
        url: "http://localhost:8084/mywebsite.com/servlet",
        method: "POST",
        data: "type=AJAX&page=Token"
    });

    ajaxRequestObjet.done(function (msg) { 
        alert(msg);
    });

    </script>

</head>
<body>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

Ang*_* 84 10

虽然你无法控制这100%...有一些选择..

尝试使用人们使用Captcha脚本的相同方法.

基本上当用户加载表单/页面时..你在他们的PHP会话中生成一个随机字符串/ id并存储它..当他们发送ajax请求时,让你的ajax检查还附加字符串/ id并在允许之前需要它检查执行其他返回500或其他什么的标题..

将此方法与会话一起使用,您可以设置允许的检查限制(例如5),一旦用户尝试了超过5次检查,他们需要重新加载页面或执行人工检查(例如Captcha)..然后重置他们的计数..甚至允许在1小时/每个IP或其他东西中总共说30.

同时使用智能事件在ajax检查完成时触发,例如字段/标签更改或按下按钮..或者当检测到有效电子邮件时...但是.com.au会触发两次.

基本上这种方式,即使有人嗅探你的JS文件并试图自动化电子邮件检查器..这将要求他们找到一种方法来追加你生成的字符串/ id,并限制他们执行的请求数量.

除此之外,你可以轻松做到更多......但是还有一些其他的想法.

他们中的大多数人都会使用PHP会话/ cookie.例如,如果他们检查并找到3个电子邮件地址.然后再次将其设置为限制并强制他们要求手动提交或其他内容.

看看上面的建议如何适合您,任何问题都可以随意询问.但是可能需要一两天才能回复周末.还要研究Captcha脚本如何为他们提供大量的源代码..因为他们的工作理念相同.

时间延迟看起来很糟糕/使您的网站看起来很慢/等待用户等待响应.

你需要限制每个会话/ IP地址的查找量.否则总有一种方法可以通过这些检查..基本上一旦达到限制..强制用户/ ip/session等待几分钟/小时并使用Captcha脚本验证它们,因此无法编写脚本...

Javascript安全/隐藏源

虽然你不能真正做到这一点,你可以使用带有JS头的PHP页面来做某些事情生成JS ..所以<script src='myjscode.php'></script>这允许PHP检查有效的会话..所以停止外部请求到一定程度..但这对于允许JS仅在成员资格/登录后面可用时,它非常有用.

在这种情况下,多次检查/如果可能的话

根据您的方法,用户是否可以检查他们是否已拥有帐户?如果是这样..你可以将电子邮件检查与其名称/国家/年龄/ dob等结合起来......所以他们需要选择两个或三个正确的匹配值才能从ajax调用中获得检查/响应?

也许不是你的情况,但只是想也会加上这个.


Joh*_*ter 9

您网站上的JavaScript代码在用户的计算机上执行,因此您无法阻止他挖掘您的代码.即使您使用代码混淆器(例如,https://www.javascriptobfuscator.com/),黑客也可以调试您的应用程序并记录发送到服务器的所有请求.

安全相关的一切都必须在服务器上进行.您可以限制来自特定IP地址的请求数量.

  • +1告诉"一切安全相关必须在服务器上发生",这当然是最重要的事情要记住. (7认同)