限制网站图片的访问,仅通过我自己的HTML访问
在我的网站上,我以简单的方式存储用户的图片,比如: "image/user_1.jpg"。
我不希望访问者通过猜测用户ID就能查看我服务器上的图片。(例如:www.mydomain.com/images/user_2.jpg,www.mydomain.com/images/user_3.jpg,等等…)
到目前为止,我想到三种解决方案:
我尝试使用 .htaccess 来给 "images" 文件夹加上密码保护。这在某种程度上帮了我,但有些图片在我的网页上弹出了用户名和密码的请求(而且奇怪的是,有些图片却没有),所以这似乎是个不太可靠的方法。
我可以把我的用户ID转换成带有盐值的 md5 哈希。这样图片的命名就会变成:/image/user_e4d909c290d0fb1ca068ffaddf22cbd0.jpg。我不喜欢这个方案,因为这让文件系统变得很复杂。
或者我可以使用 PHP 的 readfile() 函数,或者在 Perl 或 Python 中找类似的功能。例如,我可以通过一个 md5 字符串传递密码来验证访问者是否是有权限查看该图片的登录用户。
我倾向于选择第三种方案,但想用 Perl 或 Python 来实现(假设它们比 PHP 更快)。不过,我也想看看其他的想法。也许有简单的 .htaccess 技巧可以解决这个问题?
基本上,我想确保没有人能查看我网站上的图片,除非这些图片是直接从我网站上托管的 HTML 中调用的。
非常感谢,
Haluk
5 个回答
你可以通过htaccess查找“防止热链接”的方法,我觉得这应该是你需要的保护方式,比较简单。不过,这并不是绝对安全的,有些人如果真的想要那些图片,还是会找到办法,比如伪造来源地址。
你用来判断请求来源的任何方法,可靠性都取决于用户浏览器发送的HTTP_REFERER信息,但这个信息并不是很可靠。要保护内容,最好的办法就是要求用户进行身份验证。
方法#1不太可行,因为每次请求图片时都会要求输入用户名和密码。你可能会发现有些图片会弹出提示,而有些则不会,这可能是因为缓存的问题。
方法#2对我来说看起来最吸引人,因为它对处理器的要求最低。不过,仅仅用用户ID通过md5函数生成的文件名还是比较容易猜到的。为了更好的安全性,你应该使用md5('我的秘密字符串'.$user_id)来生成文件名。
为什么你选择用Perl或Python的方式呢?PHP的速度有什么问题吗?其实如果你是用这种方式来保护图片,最好把它们移到网站根目录之外,这样只有通过你的脚本才能访问,脚本会先检查用户是否已登录,然后再读取并输出头像。或者,你也可以用htaccess文件来保护这个目录,写上deny from all
。
另外,你还应该通过PHP或者.htaccess来设置HTTP_REFERER的安全性。
祝你好运!