javascript - Express.js - 请求者域/IP 可靠性
问题描述
我最近看到这篇关于获取请求域的 SO 帖子。我想知道这些信息是否可靠(即攻击者可以“伪造”这些信息吗?)。具体来说,域和请求类型(GET、POST 等)。我问的原因是因为我不确定是否可以使用它来保护我的应用程序的后端。我认为我应该只允许来自我自己域的 POST 请求。
解决方案
客户端(如浏览器)发送的请求并非来自特定域。它们来自客户端的 IP 地址。该客户端可能正在运行来自特定站点的网页,但是请求中包含的任何信息都不能被信任,并且可能被欺骗为客户端想要的任何信息。再想想这个。客户端请求不是来自域。它们来自客户端,该客户端在发出 API 请求之前可能已经收到或未收到来自特定域的网页。
因此,不,您不能使用客户端提供的页面域信息来实现任何合理的安全性。如果请求确实包含有关请求代码来自哪个网页的信息,那么该信息很容易被流氓客户端欺骗。
从浏览器使用的 API 可能需要与登录用户结合使用(通过登录 cookie 或登录后获得的某种安全令牌),但除此之外不能“安全”。为了让浏览器能够访问您的 API,任何其他客户端(包括恶意客户端)也可以访问 API。
像谷歌这样的人对他们在浏览器中使用的 API 提供的保护类型是:
- API 令牌允许他们跟踪特定令牌的使用情况和/或撤销滥用服务的令牌
- 等级限制以防止特定 API 用户或 IP 地址滥用 API 服务
- 许可使用许可,然后服务器端跟踪似乎是或不允许使用的内容
- 监控登录用户的使用情况以撤销滥用服务 API 的登录
- 在网页中动态生成并定期更改的短期 API 令牌。
因此,在允许访问您的服务之前,您可以要求 API 帐户或用户登录。除此之外,人们通常只会保护 API 不被滥用,同时也意识到确定的自定义客户端仍然可以访问 API。
我认为我应该只允许来自我自己域的 POST 请求。
您应该只允许来自有效的登录用户的 POST 请求(每个 API 请求都需要登录凭据),并且您应该只允许它们影响该特定用户有权修改的数据。您无法控制请求的来源或执行请求的客户端类型。
推荐阅读
- c# - 修复背景粉碎 C# winforms
- python - 如何从电子邮件 Python 中删除多余的语法?
- php - 带有ajax jQuery的405(不允许的方法)(POST)方法
- material-ui - material-ui tab conpment 切换太慢
- android - 如何使 AQuery 在 API 28 上的 Android 库中工作?
- c# - 所有打开的实例上的消息弹出窗口
- c++ - 在创建自定义迭代器时如何获得 std::pair 的第一个和第二个?
- python - 为什么在 django.utils.deprecation.py 中声明中间件 mixin
- javascript - JS access variable from script tag
- c++ - 触发时无法将 QAction 链接到函数(Qt 5)