Jon*_*ona 7 node.js cors express
我有一个带有一些 API 路由的 Express 服务器,如下所示:
server.post("/api/send-email", (req, res) => {
});
});
Run Code Online (Sandbox Code Playgroud)
您不需要身份验证令牌即可访问 API,但我只希望我的网站mydomain.com能够使用它。我尝试过启用限制访问,如下所示:
function restrictAccess(req, res, next) {
if (req.headers['origin'] !== 'http://localhost:3000') {
res.sendStatus(403);
} else {
next();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将限制访问作为中间件传递到我的路由中。当我使用邮递员发出 POST 请求时,我无法再使用 API,但我只需更改原始标头即可再次访问它。
我怎样才能只允许来自 的请求mydomain.com?我已经在互联网上搜索了很长时间,但找不到任何东西。有可能吗?
jfr*_*d00 12
如何仅允许来自 mydomain.com 中我自己的网页的请求?
简而言之,你不能。任何工具,如 postman 或任何脚本(例如 node.js、PHP、Perl 等)都可以发送它想要的任何标头或其他请求参数,因此标头本身对于限制仅访问您域中的网页是没有用的。
这就是网络的运作方式。
限制访问通常需要用户登录或类似的凭据(可能设置一个您可以检查的 cookie),然后如果您发现您的 API 被滥用,您可以禁止/删除正在执行此操作的特定用户帐户。
还有其他技术可能会使脚本或工具使用您的 API 变得更加困难,但即使它们也无法免受想要投入工作的黑客的攻击。例如,您的服务器可以生成一个令牌,将其嵌入到您的网页中,然后每当您从网页发出 API 请求时,您都会包含来自网页的令牌。然后,您的服务器检查是否存在有效令牌。您确保令牌在合理的时间内过期,这样黑客就无法获得一个令牌并长期使用它。
坚定的黑客仍然可以在他们想要使用令牌时从您的网页中刮取令牌,因此这只是一个障碍,而不是阻止坚定的黑客的东西。
这里唯一真正的解决方案以及像 Google 这样的人用于其 API 的方法是每次 API 调用都需要某种凭证,然后检测您的服务器是否滥用 API(速率限制、意外使用等),然后撤销如果该凭证被滥用。该凭证可以是开发人员令牌(如某些 Google API),也可以是来自用户登录的某种身份验证凭证(例如 cookie)。
我之前见过一些其他技巧,其中 API 仅当一系列请求(通常来自您的网页)之前出现时才能正常工作。实现和维护需要做很多工作,但是如果您的网页通常会发出对该网页的请求,然后进行两个 ajax 调用,然后请求五个图像,然后调用 API,您可以以某种方式让您的服务器跟踪此情况来自特定浏览器的事件序列,并且仅当您看到看起来像是来自真实浏览器网页的预期事件序列时,才允许 API 调用工作。同样,这是一项大量的工作,但仍然不是绝对正确的,因为坚定的黑客可以使用像 puppeteer 这样的东西来自动化实际的浏览器。
| 归档时间: |
|
| 查看次数: |
8105 次 |
| 最近记录: |