由于安全性(检查用户是否已登录),我在显示图像时调用php文档。
<html>...
<img src="showImage.php?id=455" />
...</html>
showImage.php:
<?php...
if($_SESSION['user']){
//Get the src to the image
$_GET[$id] = mysql_real_escape_string($_GET['id']);
$result = mysql_query("
SELECT src
FROM Media
WHERE id = '".$_GET['id']."'
");
$data = mysql_fetch_assoc($resultat);
// Output the image
header('Content-Type: image/jpeg');
echo(file_get_contents("media/".$data['src']));
}
...?>
执行此操作时,我希望用户永远不会知道图像的直接网址,并且在尝试显示图像时,用户必须登录。
我不确定这是最好的方法。有没有更简单/更好的方法来做到这一点,这是安全的。当脚本回显时,它有点慢。
期待所有专家提示。
答案 0 :(得分:10)
首先,不是用file_get_contents
读取文件,而只是回显它的内容,你可以使用readfile
:它将在一次调用中完成两个操作 - 这可能是最快,使用的内存少于:
file_get_only
然后,如果您只想识别可以访问图像,那么您没有太多选择:如果识别机制基于PHP,则必须通过PHP来限制对文件的访问 - ,是的,比使用Apache直接提供内容要慢一些。
另外:在这里,你说:
我希望用户永远不会知道 直接将url添加到图像
读到这个,我想如果有人知道他们的URL,你可以通过Apache直接访问你的图像,绕过你的PHP脚本;默默无闻的安全感并不好。
更好的解决方案,如果您不希望Apache为您的图像提供服务,那就是将它们放在Apache不会提供任何服务的目录中:
Deny from all
”的.htaccess文件保护无论哪种方式,这只能确保您的脚本只能访问文件,而不能直接访问Apache - 这意味着用户不会绕过脚本。
关于性能问题的另一个想法可能是指示浏览器可以缓存您的图像 - 至少,如果这是有意义的。
例如,您可能会对HTTP标题感兴趣,例如“Etag”和/或“Last-Modified”。
答案 1 :(得分:2)
由于您要求只有登录用户才能查看图像,因此我会说您在此方面没有真正的选择。您将不得不继续这样做,直到您的网站变得非常受欢迎,此时您可以使用比PHP更低级别的访问检查为多个服务器找到更高效的系统(这需要花费很多)。 p>
<?php
if($_SESSION['user']){
$result = mysql_query("SELECT src FROM Media WHERE id = '"
. mysql_real_escape_string($_GET['id']) ."'");
$data = mysql_fetch_assoc($resultat);
// Output the image
header('Content-Type: image/jpeg');
readfile("media/". $data['src']));
}
答案 2 :(得分:0)
Pascal MARTIN是正确的readfile
与echo
和file_get_contents
基本相同。我怀疑性能有任何显着差异,但使用readfile
更清楚。
只允许登录用户查看图像,将图像放在网络目录之外。使用readfile
,您可以从其他目录中获取文件。这样,他们就无法访问它,即使他们确实猜到了网址。