0

我有一个网页……有点像 api……基本上它以 json 的形式打印出一些数据。

其他网站可以通过 php 使用这些数据,只需使用file_get_contents

或者

javascript/jquery ajax request(jsonp)

无论如何,我希望能够将一些不需要的网站列入黑名单,所以我必须知道这个请求来自哪里

我试过了

 $url     = $_SERVER['HTTP_REFERER']; 
 $domain  = parse_url($url, PHP_URL_HOST);

但我明白了

Undefined index: HTTP_REFERER

所以除非我弄错了,这是一个奇怪的例外,HTTP_REFERER在这里不起作用。

file_get_contents那么在页面请求的情况下如何获得裁判?

4

5 回答 5

1

请注意,Ajax 请求通常通过客户端的浏览器发送,而服务器通常会调用file_get_contents()或类似工具来获取您的页面。

因此,在服务器的情况下,您可以根据黑名单检查REMOTE_ADDR HTTP 标头(其中包含调用者的 IP)。

在 Ajax 请求的情况下,可能来自用户代理,您无法真正说出该请求来自哪个网站。

虽然我不确定,但HTTP_REFERER标题可能包含确切的内容,但我再次没有检查它。

更新(Ajax 请求)
查了一下,我发现浏览器不会通过 XHR 请求发送引荐来源数据,因此您只能将您不想访问的服务器的 IP 列入黑名单。

于 2013-09-30T19:15:28.917 回答
0

如果服务器直接请求它,那么您可以使用 $_SERVER 'REMOTE_ADDR' 和 'REMOTE_HOST'。

如果他们使用 javascript,那么您将只能获得客户端 IP。您可以使用 strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 来禁止 jquery 请求。

于 2013-09-30T19:09:26.910 回答
0

不是你要找的$_SERVER['REMOTE_ADDR']吗?AJAX 调用可能没有 Referer 标头,这就是您收到该错误的原因。

于 2013-09-30T19:09:58.100 回答
0

HTTP Referrer 由浏览器发送,可能不是由 file_get_contents()!

您可以使用$_SERVER['REMOTE_ADDR']. 这将为您提供 TCP 堆栈中的原始 IP 地址。

在服务器端 API 调用的情况下,您将获得服务器的 IP(假设客户端不使用任何代理)。

但是,如果客户端是 AJAX 请求,您将获得查看该页面的用户的 IP 地址。

于 2013-09-30T19:10:12.110 回答
0

HTTP_REFERER 不可靠。您可能会尝试$_SERVER['REMOTE_ADDR']检查远程客户端的 IP 地址。

但是,我认为将批准的客户端列入白名单而不是列入黑名单会更好,因为攻击者可以轻松地代理请求以绕过基于 IP/主机的黑名单。

白名单有多种方法:

  • 将已知 IP 列入白名单
  • HTTP 身份验证
  • 您自己的自定义 API 密钥
  • 第三方认证(即 OAuth)

等等。

于 2013-09-30T19:10:21.520 回答