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

Akh*_*esh 6 javascript php jquery restapi

我创建了一个 API,它接受主机密钥或 API_KEY,然后它验证并返回 JWT 令牌。一切正常,如果没有 Hostkey,我无法访问受限路由。

问题

主要问题是如果有人将此主机密钥提供给其他人会发生什么,因为它将不再受到保护或被滥用。所以我想要做的不仅是验证主机密钥,还要验证请求来自的域。这是一种付费服务,我真正想限制的是特定域。就像谷歌对 MAP Api 所做的那样,就好像我们将该映射键添加到其他域一样,它会引发错误。

And*_*ter 5

做到这一点的唯一方法是检查来源和引荐来源标头。

不幸的是,服务器到服务器这不能可靠地完成,因为引荐来源和来源标头将由编码器设置,因此很容易被欺骗。对于服务器到服务器的调用,最好将允许调用 APIS 的 IP 地址列入白名单。在这种情况下,请使用诸如如何从访问者那里获取真实 IP 之类的内容?获取服务器的真实 IP 并针对列入白名单的 IP 进行验证。

假设这是浏览器中的 JS 调用,而不是服务器到服务器,并且您信任浏览器,那么真正可以做到的唯一方法是验证引用者和源头。这仍然可以被浏览器插件甚至像 Postman 这样的工具欺骗,所以我不推荐它来保证高安全性。这是用于验证来源或引用者的 PHP 示例。

$origin_url = $_SERVER['HTTP_ORIGIN'] ?? $_SERVER['HTTP_REFERER'];
$allowed_origins = ['example.com', 'gagh.biz']; // replace with query for domains.
$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.');     
}
Run Code Online (Sandbox Code Playgroud)

可选地,CORS 标头也很好,正如@ADyson跨域请求标头(CORS)所评论的那样,带有 PHP 标头

  • @Akhilesh 如果您的项目是一个严肃的项目并且您对此问题非常担忧,那么您应该聘请一位具有 Web 应用程序和 API 经验的安全顾问。然后,当他们比这里更详细地分析了您的所有需求、约束和用例时,您可能会得到一些更多定制的建议和路线图。出于必要,在这个志愿者运营的网站中,您往往会得到一般性建议,我们没有时间询问您应用程序的每一个细节,以便为您的具体场景提出理想的解决方案。这就是你需要做的工作。 (2认同)
  • @Akhilesh PS 当然也有非技术性的缓解措施。设置服务条款,明确规定如果用户与他人不当共享凭据或 API 密钥,则其帐户可能会被撤销,并且不当使用它们的人可能会被禁止使用服务。并以适当的方式对您的内容进行版权/许可,这样误用就会产生法律后果。这不会阻止所有人,但可能会有所帮助。更多详情请咨询有相关经验的律师。 (2认同)