首页 > 解决方案 > 恶意的人可以在 javascript 中做什么?

问题描述

嗯,我对我的项目的安全性有点着迷,我有一个问题不会离开我的脑海。

我有一个恢复密码的页面,除了执行 recaptcha 测试外,用户还需要使用有效数据填写表单。

为了方便用户体验,我通过 ajax 进行检查,如果我没有返回任何错误,我会释放页面。

$.ajax(configAjax).done(data => {

       if(data.result !== "success") {
           sendErrorMessage(data.message);
           grecaptcha.reset();
           event.preventDefault();
       }
       else {
           done = true;
       }

       toggleLoading();

})

好的,一切正常..但我一直听说它不依赖于客户端的任何数据。

例如,如果他们能够将信号从 !== 更改为 ===,则用户将能够执行搜索而无需执行 recaptcha。

我考虑过两次recaptcha 检查,一次在ajax 中,一次在使用POST 请求更新页面时进行,但是API 返回错误,因为两次请求是在很短的时间间隔内发出的。

我的问题是,有人可以这样做吗?

标签: javascriptajax

解决方案


如果应用程序实现正确,则不应允许用户绕过 CAPTCHA 检查。

AJAX 请求验证服务器上的 CAPTCHA 响应。如果成功,服务器应安排验证未来的 API 调用。它可能会返回一个必须包含在未来 API 调用中的令牌、设置一个 cookie,或者它可以设置一个服务器端会话变量。当应用程序对 API 进行额外调用时,服务器应检查此数据;如果它无效,呼叫将被拒绝。

如果您更改!=====,用户将不会收到错误消息。但他们仍然无法使用该应用程序,因为上述身份验证信息尚未设置。服务器仍然知道您没有提供正确的验证码响应。

结果是您永远无法完全在客户端上进行身份验证。您可以进行客户端验证以改善用户体验,但必须在服务器上进行复制。服务器必须对每个请求都执行此操作;您不能假设客户端会按照正常路径浏览应用程序的页面。例如,即使您只链接到application.phpfrom login.phpapplication.php也不能假设用户实际上已经通过了登录检查——没有什么能阻止某人将application.phpURL 放在浏览器的地址栏中。login.php必须做一些客户端不能欺骗的事情,并且application.php必须验证这已经在当前会话中完成。


推荐阅读