- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我在公共(public)互联网上发布一个 API,但它仅供我的应用程序使用,我可以创建一个接受域的白名单,这样其他域就无法使用它。
但我一直想知道,黑客在向我的 API 发出 HTTP 请求时不能编辑他们的“来自域”吗?他们不能模仿其他域来欺骗我的 API,让他们相信他们是可信的吗?
最佳答案
But I always wonder, can't hackers edit their "from domain" when making an HTTP request to my APIs?
您指的是 Origin根据Fetch Standard不应出现在所有请求中:
3. HTTP extensions
3.1. `Origin` header
The `Origin` request header indicates where a fetch originates from.
The `Origin` header is a version of the `Referer` [sic] header that does not reveal a path.
It is used for all HTTP fetches whose request’s response tainting is "cors", as well as those where request’s method is neither `GET` nor `HEAD`.
Due to compatibility constraints it is not included in all fetches.
让我们测试一下:
$ curl http://httpbin.org/headers
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5e907f49-3b96ed48ef957ff4c8aa435e"
}
}
如您所见,cURL
正确实现了 RFC,并且不会为 GET
请求发送 Origin
header 。
因此,即使攻击者无法欺骗它(他们可以轻而易举地做到),您也不能依赖它,因为任何正确实现 RFC 的浏览器都会被您的 API 列入黑名单,除非您的 API 仅被访问始终实现 Origin
header 的非浏览器客户端,无论使用何种 http 方法。
Can't they mimic some other domain to trick my API that they're trusted?
攻击者可以看到您的正版应用程序如何执行请求并使用正确的 Origin
header 重播它:
$ curl http://httpbin.org/headers -H "Origin: your-genuine.domain.com"
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"Origin": "your-genuine.domain.com",
"User-Agent": "curl/7.58.0",
"X-Amzn-Trace-Id": "Root=1-5e907f9a-4696e1c9ec807a0defdeca54"
}
}
看看用您的应用程序的真实域重放请求是多么容易;)。您可以在此 other answer 中阅读有关重播攻击的更多信息我给出了问题 How to secure REST API from replay attacks with parameter manipulation?
。
因此,尝试根据 Origin
header 保护您的 API 是不可行的,因为首先 RFC 不允许在所有请求方法中发送它,其次伪造它非常简单.
If I release an API on the public internet, but it's only meant to be used by my apps, I can make a white list of accepted domains, so other domains can't use it.
如上所示,依赖域执行请求是不可行的。
现在您可能想知道如何保护您的 API 服务器不被未经授权的客户端使用?
该方法将取决于您的 API 服务器应该服务什么,仅 Web 应用程序,仅移动应用程序,两者,甚至可能是 IOT 客户端?
为了让您了解如何开始应用防御层,您需要首先了解访问您的 API 服务器的谁 与什么 之间的区别。你可以去看this article部分查找此语句:
The what is the thing making the request to the API server. Is it really a genuine instance of your mobile app, or is it a bot, an automated script or an attacker manually poking around your API server with a tool like Postman?
The who is the user of the mobile app that we can authenticate, authorize and identify in several ways, like using OpenID Connect or OAUTH2 flows.
如果以上两句话不够清楚,请花几秒钟阅读链接文章中的整个部分。
既然您了解了访问您的 API 服务器的谁 和什么 之间的区别,您就可以开始应用法律要求的尽可能多的防御层。
对于仅服务于移动应用程序的 API,您将希望以这种类型的架构结束:
是的,没有 API key 或任何其他类型的 secret 存储在移动应用程序中,您可以在此 other answer 中阅读更多相关信息我给出了 How to secure an API REST for mobile app 这个问题? (如果嗅探请求为您提供“ key ”)
,这将更详细地解释图形。
对于 Web 应用程序,如果您已经阅读了重放攻击答案的上一个链接,那么您可能已经被覆盖了,但如果没有,这里又是the link我给出了问题 How to secure REST API from replay attacks with parameter manipulation?
。此答案作为使用 HMAC 对发送到 API 服务器的请求进行签名的代码示例。
如果没有我通常建议访问 OWASP 基金会的出色工作,我无法完成安全答案:
The Web Security Testing Guide :
The OWASP Web Security Testing Guide includes a "best practice" penetration testing framework which users can implement in their own organizations and a "low level" penetration testing guide that describes techniques for testing most common web application and web service security issues.
The Mobile Security Testing Guide :
The Mobile Security Testing Guide (MSTG) is a comprehensive manual for mobile app security development, testing and reverse engineering.
关于api - 黑客可以在发出 API 请求时更改他们的域名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58345912/
我有一个发出值的 Observable 源 source1,如果它没有发出任何东西超过 2 秒,我想切换到后备源 source2。如果 source1 再次发射,我想从中发射。依此类推,无限期。 到目
我正在使用 postfix 发送电子邮件。当我将电子邮件发送到其他域时它工作正常,但是当我将电子邮件发送到配置后修复的同一个域时它不发送电子邮件。 下面是我的配置: myhostname = [FQD
我最近将 ipython 和 pandas 更新为最新的稳定版本。它导致 matplotlib 中出现了一些奇怪的行为,如果我从终端运行(以前的行为)脚本,我将无法显示数字。如果我在 ipython
我的应用程序是一个网络应用程序。它的工作是接收我想将它们作为信号发出的数据包流(QByteArray)。这样做会不会效率低下?我关心复制大缓冲区。 最佳答案 QByteArray 使用 Copy-on
有 QTableWidget。我需要发送带有行列和文本的 cellChanged 信号。我怎样才能做到这一点? —— 我已经用插槽连接了信号。我需要发送 信号。 最佳答案 您必须使用 connect
我编写了一个简单的玩具语言编译器前端,它使用 llvm-sys 生成 LLVM IR (LLVM 的 C library 的 Rust 绑定(bind))。然后我通过创建 LLVMTargetMach
我想知道如何像那里描述的那样发出 HTTP POST 请求 http://code.google.com/apis/documents/docs/3.0/developers_guide_protoc
简单的问题。我需要在 GWT 中发出一个重定向到新页面的 GET 请求,但我找不到正确的 API。 有吗?我应该自己简单地形成 URL 然后做 Window.Location.replace ? (原
我正在使用 paging3我有两个不同的寻呼源。问题是Coroutine Scope只发出第一个寻呼流 在 ViewModel我有两个分页流程 val pagingFlow1 = Pager(Pagi
docker doc 中没有任何解释,也没有 docker 中看似任何内置变量来查找构建图像的原始工作目录。 我想在不同的目录上运行命令,并在某个时候回到我启动 docker build 的位置。 我
我试图使一个puppeteer.js机器人能够暂停并恢复其工作。 总的来说,我有一个带有十几个异步方法的类,事件发射器和一个名为“state”的属性,该属性使用setter进行更改。当我发生事件“停止
这个问题已经有答案了: Is it possible to send custom headers with an XHR ("Ajax" request)? (1 个回答) 已关闭 4 年前。 我想
如果浏览器打开与远程服务器的连接,是否可以通过 Javascript 访问同一连接? 我的网络上有一个小型以太网模块,我的编程有点像这样(伪代码): private var socket while(
尝试发出 HTTP 请求时,出现错误: {-# LANGUAGE OverloadedStrings #-} import Network.HTTP.Conduit -- the main modul
我有这个异步任务: public class likeTheJoke extends AsyncTask{ @Override protected Void doInBa
当进程终止并为其发出 wait() 时会发生什么?当一个子进程终止但没有人为其执行 wait() 时会发生什么?如果对尚未终止的进程执行 wait() 会发生什么情况? 最佳答案 如果我误解了这些问题
我尝试使用以下小部件结构、信号连接和回调将与 GtkTextView 支持的击键相关的信号(CTRL+a、CTRL+x 等)附加到工具栏按钮: typedef struct { GtkWidg
我有以下 base64 编码的字符串,我需要使用 Swift 对它进行 base64 解码: KimHser2RvFf9RPjajWO4K/odT51hTlISwMKNIfPUC+gXYZKNjGDC
我正在使用 Facebook Messenger webview 显示表单,在提交时,我想将消息发送回用户并关闭 webview。我现在的问题是 webview/浏览器没有发送消息就关闭了。我不知道这
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我是一名优秀的程序员,十分优秀!