繁体   English   中英

为了安全起见,使用php回声/打印jpg图像?

[英]Echo/print a jpg-image with php, for safety?

由于安全(检查用户是否登录),我在显示图像时调用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']));
}

...?>

执行此操作时,我希望用户永远不会知道图像的直接URL,并且在尝试显示图像时,用户必须登录。

我不确定这是最好的方法。 有没有更简单/更好的方法来做到这一点,这是安全的。 当脚本回显时,它有点慢。

  • 我希望图像安全(只有登录用户才能访问图像)
  • 我希望图像尽可能快地显示出来

期待您的所有专家提示。

首先,不是用file_get_contents读取文件,而只是回显它的内容,你可以使用readfile :它将在一次调用中完成两个操作 - 这可能是最快的并且使用的内存少于:

  • 使用file_get_only将完整文件加载到内存中
  • 并且,只有这样,才将该内容发送给外出


然后,如果您只想识别可以访问图像,那么您没有太多选择:如果识别机制基于PHP,则必须通过PHP来限制对文件的访问 - 是的,比使用Apache直接提供内容要慢一些。


另外:在这里,你说:

我希望用户永远不会知道图像的直接网址

读到这个,我想你的图像可以通过Apache直接访问,绕过你的PHP脚本,如果有人知道他们的URL; 默默无闻的安全并不好。

更好的解决方案是,如果您不希望Apache为您的图像提供服务,那么将它们放在Apache不会提供任何服务的目录中:

  • 文档根目录的子目录,受包含“ Deny from all ”的.htaccess文件保护
  • 或者不在您的文档根目录下的目录,因此,Apache永远不会提供服务。

无论哪种方式,这确保只有您的脚本可以访问文件,而不是直接访问Apache - 这意味着不是用户绕过脚本。


关于性能问题的另一个想法可能是指示浏览器可以缓存您的图像 - 至少,如果这是有道理的。

例如,您可能对HTTP标头感兴趣,例如“Etag”和/或“Last-Modified”。

由于您要求只有登录用户才能查看图像,因此我会说您在此方面没有真正的选择。 您将不得不继续这样做,直到您的网站变得非常受欢迎,此时您可以使用比PHP更低级别的访问检查为多个服务器找出更高效的系统(这需要花费很多)。

<?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']));
}

Pascal MARTIN是正确的, readfileechofile_get_contents基本相同。 我怀疑性能有任何显着差异,但使用readfile更清楚。

只允许登录用户查看图像,将图像放在网络目录之外。 使用readfile ,您可以从其他目录中获取该文件。 这样,他们就无法访问它,即使他们确实猜到了网址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM