Php 仅当url包含特定的查询字符串时才检查HTTP引用

Php 仅当url包含特定的查询字符串时才检查HTTP引用,php,.htaccess,Php,.htaccess,我已经到处寻找这个问题的答案,但没有任何运气。 我想知道是否有可能(通过PHP或.htaccess)检查HTTP referer是否来自我自己的域,ONLY如果访问者试图访问的URL包含特定的查询字符串 例如: 对于一个提供下载的网站来说,最好不要让其他网站“直接链接到文件的下载链接”,从而试图阻止它 直接下载链接可以是这样的:www.mysite.com/?download=123,其中?download=123的查询启动文件下载 然而,阻止所有HTTP引用并不理想,应该只在下载时发生;或者更

我已经到处寻找这个问题的答案,但没有任何运气。 我想知道是否有可能(通过PHP或.htaccess)检查HTTP referer是否来自我自己的域,ONLY如果访问者试图访问的URL包含特定的查询字符串

例如: 对于一个提供下载的网站来说,最好不要让其他网站“直接链接到文件的下载链接”,从而试图阻止它

直接下载链接可以是这样的:
www.mysite.com/?download=123
,其中
?download=123
的查询启动文件下载

然而,阻止所有HTTP引用并不理想,应该只在下载时发生;或者更具体地说,如果url包含字符串
?download=

我知道依赖HTTP referer的注意事项,因为它很容易被欺骗,但在这种情况下,100%的安全性不是目标


编辑1:

由于我没有意识到我最初问题的范围,这里有一些更多的信息:

我目前正在使用Wordpress,我有一个下载管理插件叫做“愉悦下载”。插件的工作方式是,在加载/启动页面时,它通过php创建与文件匹配的特定下载链接。这样的下载链接可以如下所示:
www.mysite.com/?download=123
。如前所述,这些链接是在启动/加载期间创建的,并且也放置在网站的第一页上。因为下载链接不是以
.jpg
或类似的方式结束的,所以基于HTTP referer阻止对这些扩展的访问是行不通的(至少在我尝试时是这样)

这种“下载流”也导致我找不到“下载启动器/调用/函数”,因为它在访问包含查询字符串的页面时被激活


问题在于访问者或其他网站可以直接链接到包含查询字符串的链接,从而导致“直接下载”。这很麻烦,因为下载的人在能够下载之前应该同意一套“使用条款”。

HTTP Referer代理很容易被任何人欺骗。正如克里斯85提到的。我注意到更多的是,浏览器代理现在通常根本不提供参考内容,它们通常只是空字符串

如果您试图跟踪一个用户从您站点上的另一个页面访问您站点上的某个页面,您可以在PHP
$\u SESSION
数据中记录相关信息,因此在第1页上,使用页面地址(而不是
PHP\u SELF
)和可能的某种形式的时间戳设置一个会话,然后在目标页面上比较这些值

第1页(摘自) 第2页(至) 阅读您的问题似乎更像是试图阻止热链接,而大多数服务器现在确实提供了各种自动执行此操作的工具。如果您只需在上面的示例中使用一个变体,那么使用
$\u SESSION
s就可以实现这一点

(图像特定,但可适用于其他文件类型)

htaccess解决方案:

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://example.com/.* [OR]
RewriteCond %{HTTP_REFERER} ^$ 
RewriteCond %{QUERY_STRING} ^download=([0-9]+)$
# redirect to another page
# ? at the end creates new query string and discards the old
RewriteRule .* http://example.com/? [R=302,L]

您可以通过
.htaccess
实现这一点。看看url重写,互联网上有足够多的指南。它可能被欺骗,合法用户的浏览器/软件可能不会发送它。是的,你可以查一下。@CharlotteDunois我诚实地试着搜索我认为符合这些条件的每一个可能的短语,但是我没有找到任何显示/讨论的主题。。我猜我可能是瞎子或者不擅长使用谷歌:)实际上我只是认为你提供的最后一个链接是我的解决方案,但后来我意识到,不幸的是,它没有提供阻止使用特定查询字符串热链接到url的解决方案。实际上我已经尝试过session&time()解决方案,但是下载链接是在页面加载时创建的(通过插件),并且也放在第一页。这意味着我不能基于时间来阻止对该链接的访问,因为它们已经在php启动期间加载。然后,您可以使用某种形式的CSRF密钥,在您的站点上生成一个密钥,该密钥将被使用(更像是使用了会话id)并进行比较,只需在会话变量中设置一个值(例如时间,等等)然后在下载时检查该值,如果该值(时间)为空或一个多小时前,您可以假设该链接是直接链接,或者他们正在使用缓存链接(即不是新链接)。@Chri.s给出了您在评论中概述的详细信息,我想如果您对您的问题进行编辑并添加更广泛的解释,可能会对我们有所帮助。干杯我想了解更多关于你的“插件”的详细信息,以及人们目前下载你的内容的路径/路线,以及你想如何过滤这些内容。谢谢,我马上会给你一个更新,希望这会更有意义;)除此之外,我希望重写规则只是删除查询字符串/重定向到我的frontpage(由于我缺少信息),这实际上是我正在寻找的解决方案:)哦,并允许空白/未设置的引用,由于这些被其他方式阻止,我已更改我的答案,使其成为重定向,并使blak referer成为可能。出于某种原因,即使尝试从我自己的域访问页面/从自己的域重定向页面,这也会阻止页面。我的网站似乎没有设置引用者。。不知道为什么。给出了“无参考/隐藏”的响应,类似的网站也是如此。“空白引用器”重写条件似乎没有捕捉到这一点?
 session_start();
 //example checking criteria only
 if($_SESSION['visitTime'] > (time() - 300) 
    && !empty($_SESSION['visitAddress'])){
     //do stuff, as another page on your site has been visited
     // by this user within the last 5 minutes. 
 }
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://example.com/.* [OR]
RewriteCond %{HTTP_REFERER} ^$ 
RewriteCond %{QUERY_STRING} ^download=([0-9]+)$
# redirect to another page
# ? at the end creates new query string and discards the old
RewriteRule .* http://example.com/? [R=302,L]