如果url包含特定的查询字符串,则仅检查HTTP Referer

时间:2016-12-12 17:02:30

标签: php .htaccess

我广泛搜索了这个答案,但没有任何运气。 我想知道是否可以(通过PHP或.htaccess)检查HTTP引用是否来自我自己的域, ONLY 如果访问者试图访问的URL包含特定的查询字符串。

一个例子: 对于提供下载的网站,最好不要让其他网站“直接链接到文件的下载链接”,因此请尝试阻止它。

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

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

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

编辑1:

由于我没有意识到我的初步问题的范围在这里提供了更多信息:

我目前正在使用Wordpress,有了它,我有一个名为Delightful Downloads的下载管理插件。该插件的工作方式是,在页面的加载/启动时,它创建通过php匹配文件的特定下载链接。这样的下载链接可能如下所示:www.mysite.com/?download=123。正如所指出的,这些链接是在启动/加载期间创建的,也放在网站的第一页上。由于下载链接不会以.jpg或类似方式结束,因此阻止基于HTTP引用对这些扩展的访问不起作用(至少在我尝试时)。

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

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

2 个答案:

答案 0 :(得分:1)

HTTP Referer代理很容易被任何人欺骗。如Chris85所述。我注意到的更多是浏览器代理现在通常根本不提供引用内容,它们通常只是空字符串。

如果您尝试跟踪用户正在从您网站上的其他网页访问您网站上的网页,则可以在PHP $_SESSION数据中记录相关信息,因此请参阅第1页,使用页面地址( PHP_SELF)和可能的某种形式的时间戳设置会话,然后在目标页面上比较这些值。

第1页(来自)

session_start();
$_SESSION['visitTime'] = time();
$_SESSION['visitAddress'] = __FILE__ //or some othe random yet checkable data

第2页(至)

 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. 
 }

阅读您的问题似乎更像是在尝试阻止热链接,现在大多数服务器都会提供各种设施来自动执行此操作。如果你只是在我上面的例子中使用变体,那么使用$_SESSION s就可以达到这个目的。

.Htaccess prevent hotlinking(图像特定但可以适用于其他文件类型)

(Slghtly) broader details for .htaccess file hotlink prevention

答案 1 :(得分:0)

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]