javascript - 恶意的人可以在 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 返回错误,因为两次请求是在很短的时间间隔内发出的。
我的问题是,有人可以这样做吗?
解决方案
如果应用程序实现正确,则不应允许用户绕过 CAPTCHA 检查。
AJAX 请求验证服务器上的 CAPTCHA 响应。如果成功,服务器应安排验证未来的 API 调用。它可能会返回一个必须包含在未来 API 调用中的令牌、设置一个 cookie,或者它可以设置一个服务器端会话变量。当应用程序对 API 进行额外调用时,服务器应检查此数据;如果它无效,呼叫将被拒绝。
如果您更改!==
为===
,用户将不会收到错误消息。但他们仍然无法使用该应用程序,因为上述身份验证信息尚未设置。服务器仍然知道您没有提供正确的验证码响应。
结果是您永远无法完全在客户端上进行身份验证。您可以进行客户端验证以改善用户体验,但必须在服务器上进行复制。服务器必须对每个请求都执行此操作;您不能假设客户端会按照正常路径浏览应用程序的页面。例如,即使您只链接到application.php
from login.php
,application.php
也不能假设用户实际上已经通过了登录检查——没有什么能阻止某人将application.php
URL 放在浏览器的地址栏中。login.php
必须做一些客户端不能欺骗的事情,并且application.php
必须验证这已经在当前会话中完成。
推荐阅读
- java - Active Directory:查询父级 AD 组的子域用户成员
- applescript - Applescript 在大苏尔莫名其妙地失败了
- java - 什么是替换只返回 false 的 if 语句墙的干净方法?
- vue.js - Vue - 强制更新 URL 中的新 id
- reactjs - InteliJ:Typescript 根据接口自动检查 {} 对象?
- amazon-web-services - 如何在不删除现有堆栈的情况下从 cloudformation 迁移到 CDK?
- tcl - 如何将 2 个列表合并为 TCL 中的键值对?
- jenkins - 在 Jenkinsfile 中的远程主机上执行 shell 命令
- ruby - 为什么我不能运行这个 ruby 文件?
- sumo - 回答命令 0xa4 错误:获取车辆变量:指定不支持的变量 0x32