【问题标题】:PHP - Referer redirect scriptPHP - 引用重定向脚本
【发布时间】:2010-10-25 20:08:06
【问题描述】:

通常,在搜索答案时,我发现某些网站会允许您阅读他们提供的信息,例如,如果引荐来源是 google.com。但是,如果您直接链接到该信息,它将不可用。

我正在寻找的是最小的 PHP 脚本,它将设置我选择的引用者和目的地,如下所示:

http://example.com/ref_red.php?referer=http://google.com/&end=http://example.net/

注意事项:

  • ref_red.php 是我示例中脚本的名称。
  • refererend 应该接受 httphttpsftp
  • refererend 可以包含任何类型的 URI,简单到 http://end.com 或复杂到: 例如http://example.com/some/rr/print.pl?document=rr

注意:根据回复中的建议,我正在添加此内容。该脚本本身并不是一个完整的代理。 仅代理初始 HTTP 请求(不代理图像等后续请求)唯一目的设置 referer

【问题讨论】:

  • 请使用例如example.comexample.orgexample.net 或任何其他以.example 结尾的域名。请参阅 RFC 2606。

标签: php http-referer


【解决方案1】:

referer 由您的浏览器设置,而不是由任何服务器端机制设置。我猜你可以在 PHP 中构造一个代理来发出远程服务器的请求并适当地设置引用标头。仅使用 Firefox 插件似乎更有用,例如http://www.stardrifter.org/refcontrol/.

编辑:我会改写您的问题,以明确您想要编写一个 PHP 代理,并带有一个自定义的引用标头。我可能只是修改http://sourceforge.net/projects/poxy/ 之类的东西来获取referrer 参数并传递它。

再次编辑:你可能很清楚你在问什么,但要求不可能的事情并不能使它成为可能。浏览器负责设置referer header;它使用导致它重定向到新资源的 URI。你要求一个脚本,上面写着“请访问http://example.net,但当你这样做时假装我实际上是www.foo.com”。服务器没有机制来指示浏览器“撒谎”它来自哪里。

我想这可能是通过一些复杂的 JavaScript 黑客攻击,但它是黑帽意义上的黑客攻击 - 一个能够强制浏览器欺骗引用者的网站将是一个真正的安全漏洞。

【讨论】:

  • 完全明白referer是客户端设置的。我之后的脚本将是 that 客户端,并设置指定的referer。 Firefox 插件不是一个选项,因为我想在公共链接上使用这样的脚本。
  • @Adam,我很清楚我在问什么,以及预期的行为。它可能执行某些代理执行的功能,但它本身不是代理。我正在寻找的只是一个用 PHP 编写的重定向脚本,它还将设置 Referer 标头。
  • @David 我相信你误解了重定向的机制。在这种情况下,当您的脚本在对链接的请求中设置引荐来源网址时,它需要将该信息返回给客户端,因此根本不执行重定向,它将通过自身代理所有信息,或者它将客户端重定向到链接,从而破坏整个引荐来源网址隐藏。即使脚本仅部分代理内容,仍会为图像/CSS/JS 等发送引荐来源网址。
  • @Wesley,我在问题中添加了一条注释,以进一步澄清。谢谢!
【解决方案2】:

您可以使用互联网上允许隐藏引荐来源网址的服务之一(通过设置他们的地址),但您不能强加一个不是实际引荐来源网址的特定引荐来源网址。在将用户重定向到目标网站之前,必须将用户实际重定向到该网站(将显示为引荐来源网址)。

其中一项服务:http://linkanon.com

编辑:

既然你现在改变了你的问题,我关于在 PHP 中编写一个像代理一样的用户代理的评论适用,但这接近于犯罪活动,因为你将向一个用户显示第三方网站可能会认为她在实际网站中,而实际上她会加载您的内容(您传递的内容)。要执行这种近乎犯罪的活动(您距离尝试读取用户名和密码仅一步之遥),您需要使用自己的书面用户代理使用 PHP 加载第三方的网站内容,该用户代理指定虚假的引荐来源并简单地传递输出给您网站的访问者。 PHP 中允许发送 HTTP 标头的函数是 header($header):

header("Referer: http://example.org");

您可以尝试阅读有关 Referer 标头的 HTTP(这是世界转向的协议)规范:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html(参见第 14.36 节),而不是对试图提供帮助的人大喊大叫。

您可能还想阅读http://en.wikipedia.org/wiki/Referrer_spoofing,您可以在其中看到所有关于客户端的信息。 PHP是服务器端。你所能做的就是尝试编写一个由 PHP 生成的客户端代码(Javascript),但如果你运气好,那么你就闯入了用户的世界。

【讨论】:

  • 您的断言不正确。设置引用者是完全可能的,您提供的链接(虽然我不想使用它)只是证明了这一点。
  • 是的,可以使用 Firefox 插件之类的东西,但不像您在网站上存储一个脚本,该脚本会侵入您的访问者的浏览器。您可以在 PHP 中编写一个“浏览器”来执行此操作,但我想您不想这样做。
  • “侵入访问者的浏览器”?你在说什么?严重地。再读一遍我的条目,仔细考虑(如果你真的在乎的话),然后回来。
  • header("Referer: http://example.org") 不起作用。一旦您设置了header('Location: http://whybother.lm/') 之类的内容,就无法从另一侧检索它。 header('Refresh: 0; url=http://whybother.lm/') 将发送 Referer 标头,但该标头已存在(如果有)。换句话说,通过header() 手动设置它不起作用。至于crime(),我觉得你走得太远了。
  • @jimasun header('Refresh: 0; url=http://whybother.lm/') 完美运行!!!谢谢
【解决方案3】:

这个函数应该给你一个起点 它将获取具有指定引荐来源的任何 http url

处理查询参数应该很简单,所以我将把这部分留给你做

<?php

    echo geturl('http://some-url', 'http://referring-url');

    function geturl($url, $referer) { 

        $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg,text/html,application/xhtml+xml'; 
        $headers[] = 'Connection: Keep-Alive'; 
        $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'; 
        $useragent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)'; 

        $process = curl_init($url); 
        curl_setopt($process, CURLOPT_HTTPHEADER, $headers); 
        curl_setopt($process, CURLOPT_HEADER, 0); 
        curl_setopt($process, CURLOPT_USERAGENT, $useragent);
        curl_setopt($process, CURLOPT_REFERER, $referer);
        curl_setopt($process, CURLOPT_TIMEOUT, 30); 
        curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt($process, CURLOPT_FOLLOWLOCATION, 1); 

        $return = curl_exec($process); 
        curl_close($process); 

        return $return; 
    } 

?>

【讨论】:

  • 这个解决方案今天仍然有效吗?看起来我看到(直接)访问,根本没有推荐人。
猜你喜欢
  • 2015-06-08
  • 1970-01-01
  • 2011-08-31
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多