黑客可以在发出 API 请求时更改他们的域名吗?
Can hackers change their domain when making an API request?
如果我在 public 互联网上发布了一个 API,但它仅供我的应用程序使用,我可以创建一个接受域的白名单,这样其他域就不能使用它。
但我一直在想,难道黑客在向我的 API 发出 HTTP 请求时不能编辑他们的 "from domain" 吗?他们不能模仿其他域来欺骗我 API 他们是可信的吗?
并非每个 HTTP 请求都指定其域,因此您最多可以尝试将源 IP 映射到域。
如果您接受的域具有固定的 IP 范围,您可以将这些域列入白名单并阻止其他所有内容。
如果攻击者在通向您的主机站点的网络层中有内部人员,则 IP 欺骗通常是可能的。没有它,攻击者可以尝试对您的 API 进行 DoS,但他们需要 a lot of work 才能发送 HTTP 请求。
如果您使用 HTTP headers 声明域,那么攻击者绝对可以欺骗他们。
如果您的 API 仅服务于您的应用程序,最简单的解决方案是使用 HTTPS 并签署 and/or 验证每个请求(查看 JWT,这几天很流行)。
也有基于识别 "unexpected" 请求的解决方案,这些解决方案也不要求您的应用具有固定的 IP 范围,并且将您的 API 开放给您不拥有的应用也更安全。这些是 Web Application Firewall (WAF) solutions,有些有免费套餐。
要记住的关键是,有大量 "basic" 黑客和少数 "master" 黑客,安全就是从底层中剔除尽可能多的黑客这个金字塔。一个强大、足智多谋的 well-funded 攻击者最终会攻击你,但更多时候,你只是希望攻击者想要赚钱去攻击一个更容易的目标。
起源 Http Header
But I always wonder, can't hackers edit their "from domain" when making an HTTP request to my APIs?
您指的是 Origin that according to the 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 方法。
伪造来源Header
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"
}
}
看看使用您的应用程序的真实域重播请求是多么容易;)。您可以在我针对 How to secure REST API from replay attacks with parameter manipulation?
.
问题给出的 other answer 中阅读有关重放攻击的更多信息
所以试图根据 Origin
header 来保护你的 API 是不可行的,因为首先 RFC 不允许它在所有请求方法中发送,第二个是很容易伪造的。
捍卫 API 服务器
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 客户端?
为了让您了解如何开始应用多层防御,您需要首先了解 who 与 what[=88= 之间的区别] 正在访问您的 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.
如果以上两句话不够清楚,请花几秒钟阅读 linked 文章中的整个部分。
现在您了解了 who 和 what 之间的区别正在访问您的 API 服务器,您开始应用尽可能多的层您负担得起且法律要求的防御措施。
对于 API 仅提供移动应用程序的服务,您将希望以这种类型的架构结束:
是的,没有 API 密钥或存储在移动应用程序中的任何其他类型的秘密,您可以在这个 other answer 我为问题 How to secure an API REST for mobile app? (if sniffing requests gives you the “key”)
提供的内容中阅读更多信息,更详细地解释了图形。
对于 Web 应用程序,如果您已经阅读了之前的 link 重放攻击答案,那么您可能已经涵盖了,但如果没有,这里又是 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.
如果我在 public 互联网上发布了一个 API,但它仅供我的应用程序使用,我可以创建一个接受域的白名单,这样其他域就不能使用它。
但我一直在想,难道黑客在向我的 API 发出 HTTP 请求时不能编辑他们的 "from domain" 吗?他们不能模仿其他域来欺骗我 API 他们是可信的吗?
并非每个 HTTP 请求都指定其域,因此您最多可以尝试将源 IP 映射到域。
如果您接受的域具有固定的 IP 范围,您可以将这些域列入白名单并阻止其他所有内容。
如果攻击者在通向您的主机站点的网络层中有内部人员,则 IP 欺骗通常是可能的。没有它,攻击者可以尝试对您的 API 进行 DoS,但他们需要 a lot of work 才能发送 HTTP 请求。
如果您使用 HTTP headers 声明域,那么攻击者绝对可以欺骗他们。
如果您的 API 仅服务于您的应用程序,最简单的解决方案是使用 HTTPS 并签署 and/or 验证每个请求(查看 JWT,这几天很流行)。
也有基于识别 "unexpected" 请求的解决方案,这些解决方案也不要求您的应用具有固定的 IP 范围,并且将您的 API 开放给您不拥有的应用也更安全。这些是 Web Application Firewall (WAF) solutions,有些有免费套餐。
要记住的关键是,有大量 "basic" 黑客和少数 "master" 黑客,安全就是从底层中剔除尽可能多的黑客这个金字塔。一个强大、足智多谋的 well-funded 攻击者最终会攻击你,但更多时候,你只是希望攻击者想要赚钱去攻击一个更容易的目标。
起源 Http Header
But I always wonder, can't hackers edit their "from domain" when making an HTTP request to my APIs?
您指的是 Origin that according to the 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 方法。
伪造来源Header
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"
}
}
看看使用您的应用程序的真实域重播请求是多么容易;)。您可以在我针对 How to secure REST API from replay attacks with parameter manipulation?
.
所以试图根据 Origin
header 来保护你的 API 是不可行的,因为首先 RFC 不允许它在所有请求方法中发送,第二个是很容易伪造的。
捍卫 API 服务器
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 客户端?
为了让您了解如何开始应用多层防御,您需要首先了解 who 与 what[=88= 之间的区别] 正在访问您的 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.
如果以上两句话不够清楚,请花几秒钟阅读 linked 文章中的整个部分。
现在您了解了 who 和 what 之间的区别正在访问您的 API 服务器,您开始应用尽可能多的层您负担得起且法律要求的防御措施。
对于 API 仅提供移动应用程序的服务,您将希望以这种类型的架构结束:
是的,没有 API 密钥或存储在移动应用程序中的任何其他类型的秘密,您可以在这个 other answer 我为问题 How to secure an API REST for mobile app? (if sniffing requests gives you the “key”)
提供的内容中阅读更多信息,更详细地解释了图形。
对于 Web 应用程序,如果您已经阅读了之前的 link 重放攻击答案,那么您可能已经涵盖了,但如果没有,这里又是 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.