我开发了一个 API 来获取所有数据。
该站点没有用户注册系统或任何可以识别调用 API 的用户的东西。如果我能识别拨打电话的用户,那么每当有人滥用或攻击 API 时,我什至可以禁止他的 IP。
我正在考虑根据用户 IP 或 MAC 地址生成 API 密钥,但这样做安全吗?还有其他建议吗?
首先,您不会获得最终用户的 MAC 地址。即使您读取传入数据包的 MAC 地址,您也只会获得路由器的 MAC 地址(您绝对不想禁止它!)
用户 IP 很容易更改和/或欺骗(例如,恶意软件或混淆的代理 Javascript)。阻止那些发出错误请求的人仍然是一个好主意,但您绝对不想将它们用于身份验证。
您应该考虑攻击者控制的 HTTP 请求(路径、标头等)输入中的几乎所有内容,并且绝对不能仅根据其中包含的信息做出身份验证决定。
你提到你有一个 PHP 后端。为什么不构建一个系统来通过它生成 API 密钥呢?
绝对错误,无法获取用户的MAC地址,JS/PHP没有办法
NAT 后面的许多用户将为您拥有相同的 IP 地址,因此您将无法区分它们
你说没有用户注册系统,那你为什么要生成API key?
你不能拥有两个世界。请求是匿名的,或者用户注册,在这种情况下,您可以提供 API 密钥(最好使用 HTTPS,以免密钥被盗),并可能根据您的用例进一步限制 IP 地址范围。
正如其他人所回答的那样,MAC 地址仅在同一物理网络上可用。它们不通过路由器,因此它们不通过 Internet。您无法访问物理网络之外的任何人的 MAC 地址,除非您编写了一个自定义应用程序来收集它(并且那些可以被欺骗)。
IP 地址可以是动态的,有些人会根据地理位置、ISP、运营商或业务共享 IP 地址。此外,我们中的许多人都可以轻松更改我们的 IP 地址,因此很难通过 IP 地址管理访问。
有一些陷阱,管理公共 API 需要额外的时间。您必须愿意关闭 IP 地址或 IP 地址范围,尽管您可能会在阻止滥用者的同时阻止无辜和正直的用户。如果您的应用程序是免费的,它可能会给您更多的自由,因为没有预期的服务水平和合同,但您可能希望通过法律协议保护自己。
许多公共 API 仍然通过 IP 地址进行跟踪并实施 tarpit,以简单地减慢来自任何似乎滥用系统的 IP 地址的请求。这样,来自同一 IP 地址的合法用户仍然可以继续,尽管速度较慢。
一般来说,如果你的服务足够受欢迎以至于有人想要攻击它,这通常是一个好兆头,所以不要太早担心它,但要保持领先。您不希望应用程序失败的原因是用户厌倦了在缓慢的服务器上等待。
您的另一个选择是让用户注册,这样当您发现滥用行为时,您可以通过凭据而不是 IP 地址来阻止。
出于多种原因,禁止 IP 地址不是一个好主意。无论如何,黑客可以欺骗 IP 地址,所以这种技术是无用的。
您可以做的是根据 IP 限制 API 调用。即限制每秒每个IP 的呼叫数。
您可能会发现这很有帮助:http ://blog.programmableweb.com/2007/04/02/12-ways-to-limit-an-api/