【问题标题】:PHP - Source (hostname) of a GET requestPHP - GET 请求的源(主机名)
【发布时间】:2009-07-20 14:35:14
【问题描述】:

我有一个 Javascript 小部件,人们可以将它嵌入到他们的网站上。

我想使用一个简单的跨域获取请求来提取哈希。

但是,我需要我的 PHP 脚本只允许来自我存储在数组中的一系列域的跨域请求。

我可以在我的 PHP 脚本中(不是在 .htaccess或 iptables 中)做些什么来找出 get 请求的来源(主机名)?

【问题讨论】:

  • $_SERVER['REMOTE_HOST'] 不起作用,因为它返回客户端(网络用户)详细信息,而不是发出 GET 请求的网站的详细信息 - 这是我需要的。

标签: php


【解决方案1】:

考虑到客户端(用户的浏览器)可以向您发送它想要的任何内容,我想说没有办法确定您的脚本是从哪个网站调用的:

  • 由于您想知道嵌入您的小部件的网站的 URL,而不是用户的地址,$_SERVER['REMOTE_HOST'] 将无济于事
  • $_SERVER['HTTP_REFERER'] 看起来不错,但实际上不是:
    • 客户端不必发送它(并不总是这样做)
    • 由于它是由客户端发送的,因此可以很容易地伪造/伪造

所以,我想说这个问题没有真正的解决方案,至少在你的服务器端(如果我错了,我有兴趣知道!)

但也许你可以在客户端做点什么:在写这一切的时候,我想到了谷歌地图,它是 API Key 系统:

  • 您的域有一个(唯一)API 密钥
  • 当您从 google 加载 JS 脚本时,您发送此密钥
  • 如果该密钥未在您尝试显示地图的域中注册,则会出现 alert 消息,显示“Google Maps API 服务器拒绝了您的请求。这可能是因为 API此站点上使用的密钥已为其他网站注册。"
    • 但地图似乎仍然显示 - 至少在我的测试服务器上
  • alert对最终用户来说真的很烦人,我认为没有人会希望在他们的网站上显示警报,因为他们在未经授权的情况下使用您的服务...

也许你可以看看谷歌地图是如何做到的:-)

【讨论】:

    【解决方案2】:

    您可以使用$_SERVER 变量。特别是 $_SERVER['REMOTE_HOST'] 但请参阅下面的警告:

    但是,您的网络服务器必须是 配置为创建此变量。 例如在 Apache 你需要 HostnameLookups 在 httpd.conf 中 让它存在。也可以看看 gethostbyaddr().

    【讨论】:

    • $_SERVER['REMOTE_HOST'] 包含发出请求的 客户端 的地址(dns 查找)。我不确定这是不是答案......
    • 感谢您的回答,但问题在于 Volker 所说的内容,它返回的是客户端地址,而不是发出请求的站点的主机或 IP。
    【解决方案3】:

    如果请求来自 JavaScript,您可以检查 HTTP 引用标头 ($_SERVER['HTTP_REFERER'])。但是,它是可选的 - 一些代理或安全程序会从 HTTP 请求中去除引荐来源网址。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2019-05-10
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多