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

标签 javascript php jquery rest

我创建了一个 API,它接受主机 key 或 API_KEY,然后验证并返回 JWT token 。一切正常,没有 Hostkey,我无法访问受限路线。
问题
主要问题是如果有人将此主机 key 提供给其他人会发生什么,因为它将不再受到保护或将被滥用。所以我想做的不仅是验证主机 key ,还要验证请求来自的域。这是一种付费服务,我真正想限制的是特定域。就像谷歌对 MAP Api 所做的那样,就好像我们将该映射键添加到其他域一样,它会引发错误。

最佳答案

这样做的唯一方法是检查来源和引荐来源 header 。
不幸的是,服务器到服务器这不能可靠地完成,因为引用者和源头将由编码器设置,因此很容易被欺骗。对于服务器到服务器的调用,最好将允许调用 APIS 的 IP 地址列入白名单。在这种情况下,使用类似 How to get Real IP from Visitor?获取服务器的真实 IP 并根据白名单 IP 对其进行验证。
假设这是浏览器中的 JS 调用,而不是服务器到服务器,并且您信任浏览器,那么真正做到这一点的唯一方法是验证引荐来源网址和来源 header 。这仍然可以被浏览器插件甚至像 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.');     
}
正如@ADyson Cross-Origin Request Headers(CORS) with PHP headers 所评论的那样,CORS header 也可以选择。

关于javascript - 限制保存在我的数据库中的特定域的 PHP API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66303784/

相关文章:

php - 无法创建非静态方法 - fatal error

javascript - 以编程方式设置选择(多个)元素值

jquery - 处理ajax jquery数据库查询的最佳实践?

javascript - 浏览器刷新时的随机全屏背景图片

javascript - angularjs监听dom事件

javascript - jquery Ready 函数未执行

php - base64 编码的字符串可以包含空格吗?

javascript - 在 JavaScript 中使用动态(可变)字符串作为正则表达式模式

php - 如何在 PHP 中通过 ODBC 为普适数据库设置编码?

jquery - 进度条宽度