限制PHP API仅适用于保存在我的数据库中的特定域名

13 浏览
0 Comments

限制PHP API仅适用于保存在我的数据库中的特定域名

我创建了一个API,它接收hostkey或API_KEY,然后对其进行验证,并返回JWT令牌。一切都运行正常,我无法在没有Hostkey的情况下访问受限路由。

问题

主要问题是,如果有人将此hostkey提供给其他人,它将不再受到保护或被滥用。所以我想要做的不仅是验证hostkey,还要验证请求来自的域名。这是一种付费服务,我真的想将其限制在特定域名上。就像谷歌对MAP API所做的那样,如果我们将该地图密钥添加到其他域名上,它会抛出错误。

0
0 Comments

限制特定域名使用PHP API,这些域名保存在我的数据库中。这样做的原因是为了避免付费API被滥用。目前的解决方法是设置一个请求次数的限制,当付费API的请求次数达到100次时,API密钥将停止工作,这样付费用户就不会将密钥分享给其他人。虽然这不是完美的解决方案,但是可以借鉴其他API服务的做法。这个想法很好,是一个不错的创举。

0
0 Comments

限制特定域名对保存在我的数据库中的PHP API的访问

在进行服务器到服务器的调用时,无法可靠地检查引用来源(referrer)和源(origin)头文件,因为引用来源和源头头文件可以由编码人员设置,因此容易被伪造。在服务器到服务器的调用中,最好的做法是将被允许调用您的API的IP地址列入白名单。在这种情况下,可以使用类似于如下链接中所示的方法获取服务器的真实IP,并与白名单中的IP进行验证。

如下是在浏览器中进行的JS调用的示例,假设您信任浏览器。这种情况下,唯一可行的方法是通过验证引用来源和源头头文件来实现。尽管仍然可以使用浏览器插件或者像Postman这样的工具来伪造,所以不建议在高安全性要求的场景中使用。以下是一个PHP示例,用于验证源头或引用来源。

$origin_url = $_SERVER['HTTP_ORIGIN'] ?? $_SERVER['HTTP_REFERER'];
$allowed_origins = ['example.com', 'gagh.biz']; // 替换为查询域名的代码。
$request_host = parse_url($origin_url, PHP_URL_HOST);
$host_domain = implode('.', array_slice(explode('.', $request_host), -2));
if (! in_array($host_domain, $allowed_origins, false)) {
    header('HTTP/1.0 403 Forbidden');
    die('You are not allowed to access this.');     
}

还可以选择使用CORS头文件,如下链接中所述。

然后,其他API是如何实现这一点的呢?他们使用了上述方法的组合。他们可以按IP地址进行白名单设置,使用CORS,对于更有价值的数据使用更强的身份验证,采用限制并发使用等方式。我已经解释了谷歌API是如何实现的。你似乎认为我们故意不告诉你某种神奇的答案,但实际上并不存在这样的答案。

如果您的项目非常重要,并且对这个问题有很大担忧,那么您应该聘请一位具有Web应用程序和API经验的安全顾问。当他们在比这里更详细地分析了您的所有要求、限制和用例之后,您可能会得到更多定制的建议和路线图。在这个由志愿者运营的网站上,我们通常只能提供一般建议,我们没有时间详细询问您应用程序的每个细节,以便为您的确切情况提供最佳解决方案。这是您需要做的工作。

此外,还有一些非技术性的减轻措施。设置明确的服务条款,明确提到如果用户不当地与他人共享凭据或API密钥,则可能撤销用户的帐户,并且对于不当使用凭据的人可能会被禁止使用服务。并且根据适当的方式版权/许可您的内容,以便对其不当使用产生法律后果。有关更多详细信息,请咨询具有相关经验的律师。

可能还有其他考虑因素,可以参考以下链接:

[quora.com/...](https://www.quora.com/How-does-Netflix-prevent-users-from-downloading-streamed-video-content)。我怀疑Netflix客户端通过了比简单的主机密钥更复杂的身份验证与服务器进行身份验证。

0