使用哈希阻止热链接到文件?

时间:2012-02-28 04:44:35

标签: php html security

我希望我的PHP网站上有我的文件

http://mysite.com/files/file.exe?auth=qwe1245efmkrkn% $!e12< - 一些生成的哈希......

我没有编写任何代码,但我想知道如何实现auth变量以直接链接到文件..任何想法?谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用.htaccess

更好地执行此操作
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]

复制并粘贴此代码,使用.htaccess重命名并保存在根目录中。

正如Gumbo所提到的,除非您在自己的网站上应用CSRF保护,否则一些浏览器不会发送任何请求标头并伪造请求是非常容易的。 所以更新的.htaccess允许这个

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain\.com/ [NC]
#Redirect to an image
RewriteCond %{REQUEST_URI} !hotlink\.(gif|png) [NC]
RewriteRule .*\.(gif|jpg|png)$ http://yourdomain.com/images/hotlink.png [NC] 

并添加

Header set X-Frame-Options DENY

确保网站即使来自同一网站也可以被框起来。可能对CSRF有点帮助。

替代方案,可能是将图像请求重定向到页面来处理它。

答案 1 :(得分:2)

你需要使用过期来散列路径,作为链接的一部分传递,

HASH =路径+秘密+到期

链接看起来像?hash = [结果哈希]& expiration = 192009345< - 时间链接从unix epoc开始以毫秒为单位。

然后在提供文件时,您将使用您从入站链接获得的秘密+路径+操作进行哈希处理,如果哈希匹配且未到期,则提供文件,如果没有抛出403

您可以通过htaccess重写资产以使用散列脚本并将实际资产保存在非公共文件夹中,然后使用内容类型的标头通过php脚本为其提供服务,并在文件读取操作中将二进制文件转储出来。 / p>

注意:永远不要将您的秘密放在仅在您的服务器端代码

的链接中

如下所示:

RewriteEngine on

RewriteRule \(.*)(\.jpg|\.gif|\.png)$ hashChecker.php?file=$1$2 [QSA]