繁体   English   中英

PHP驱动的API如何验证真正的客户端(referer)跨域(知道标头可以被欺骗)?

[英]How can PHP driven API authenticate genuine client (referer) cross-domain (knowing that headers can be spoofed)?

使用PHP,您如何使用以下标准安全地验证 API调用跨域

  1. 必须从给定的域名/页面调用(没有其他域名)
  2. 必须有一个给定的密钥

一些背景:请在回答之前仔细阅读......

我的Web应用程序将通过下面的调用在客户端的网站上显示一个javascript小部件。 因此,我们讨论的是对要提供的脚本进行跨域身份验证,但仅针对真正的客户端和仅针对给定的URL!

目前,CLIENT的网站可以通过单行javascript包含小部件。

示例client-website.com/page/with/my-widget

<head>
...
<script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script>
...
</head>

现在,实际上这不是直接调用javascript而是在我的远程服务器上的PHP脚本,它位于实际的javascript前面,用于进行一些身份验证。

上面调用背后的PHP脚本首先执行此操作:

  1. 检查API密钥($ _REQUEST [“key”])是否与数据库中的用户记录匹配。
  2. 检查引用者的URL($ _SERVER ['HTTP_REFERER'])对数据库***中的记录。

这是简化的,但实质上服务器看起来像

if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget")
  && $_REQUEST["Key"] == "the_long_api_key") {
    header("Content-type: application/x-javascript");
    echo file_get_contents($thewidgetJS_in_secret_location_on_server);
} else {
  //pretend to be a 404 page not found or some funky thing like that
}

***小部件只允许在某些网站/页面上运行

现在,问题出在这里:

  1. 关键是在客户端,所以任何人都可以查看源和获取密钥
  2. 例如,引用者可以被欺骗(通过cURL)

还有一点障碍:我无法告诉客户将密钥粘贴在服务器上的php脚本中,因为它们可以运行任何服务器端语言!

那么如何才能使我的Web服务安全并且只能由给定的域/页访问?

任何帮助将非常感激!

ps:小部件上传到一种下拉框 - 所以安全性在这里是关键!

我建议使用白名单方法解决这个问题,我不完全确定这会解决问题,但是我使用类似的技术来支付处理器需要你将服务器ips列入白名单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM