【问题标题】:Performance hit of using php versus html with 'img src'使用 php 与 html 与 'img src' 的性能损失
【发布时间】:2012-02-05 06:31:47
【问题描述】:

为了安全起见,我正在显示一个存储在根目录下的图片库。每个 jpeg 都有缩略图。显示图库的时候,我已经设置成功了

<img src='./php/getfile.php?file=xyz-thumb.jpg'></a>

getfile.php 使用以下代码处理每个缩略图。单击缩略图时,相同的代码会加载更大版本的图像。

我已经可以看出这段代码比 html 慢,并且一个页面上可能有 20-30 个缩略图,我正在讨论是否需要保持缩略图对 public_html 可见以提高性能。有没有更快的方法来显示缩略图?出于其他原因,fpassthru() 是否更快或更理想?

        // File Exists?
    if( file_exists($fullfilename)){

        // Parse Info / Get Extension
        $fsize = filesize($fullfilename);
        $path_parts = pathinfo($fullfilename);
        $ext = strtolower($path_parts["extension"]);

        // Determine Content Type
        switch ($ext) {
            case "pdf": $ctype="application/pdf"; break;
            case "exe": $ctype="application/octet-stream"; break;
            case "zip": $ctype="application/zip"; break;
            case "doc": $ctype="application/msword"; break;
            case "xls": $ctype="application/vnd.ms-excel"; break;
            case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
            case "gif": $ctype="image/gif"; break;
            case "png": $ctype="image/png"; break;
            case "jpeg":
            case "jpg": $ctype="image/jpg"; break;
            default: $ctype="application/force-download";
        }

        header("Pragma: public"); // required
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: private",false); // required for certain browsers
        header("Content-Type: $ctype");

        if ($mode == "view"){
            // View file
            header('Content-Disposition: inline; filename='.basename($fullfilename));
        } 
        else {
            // Download file
            header('Content-Disposition: attachment; filename='.basename($fullfilename));
        }

        header("Content-Transfer-Encoding: binary");
        header("Content-Length: ".$fsize);
        ob_clean();
        flush();
        readfile( $fullfilename );

    } else
        die('File Not Found:' . $fullfilename);

【问题讨论】:

  • 将缩略图存储在 Web 根目录下并使用 php 提供什么安全性?
  • 安全性适用于全尺寸图像。将缩略图保留在根目录下的唯一原因是将它们保留在同一目录中很方便。否则我必须为完整尺寸的图像复制一个复杂的目录结构。我将数百张图片分组到许多目录中。
  • php coder,你可以将图片返回给你想要的用户,它不会阻止复制只是未经授权的查看,为了改善这种查看方式你可以添加缓存
  • 我假设必须一次查看一个图像,右键单击并保存。如果它们完全可见,我担心有人能够自动复制它们。如果这过于偏执或无效,我很高兴听到不值得付出努力或影响性能。
  • 正常的、未经授权的用户是否能够简单地单击一个链接,该链接将在任何时候向他们显示全尺寸图像?如果是,那么通过 PHP 为它们提供服务绝对没有意义,因为它们是可公开访问的。无论您在幕后挥手多少次,如果一个可公开访问的 URL 指向完整尺寸的图像,这就是所有客户所关心的。

标签: php performance image src


【解决方案1】:

任何涉及 PHP 的东西都会对性能造成明显影响,尤其是当您检查数据库以验证登录凭据等时。

您可以通过设置正确的缓存头等来改进您的代码。但实际上最好的解决方案是让 apache 将图像作为静态文件提供。 Apache 非常擅长处理静态文件,你永远无法编写出与 Apache 一样好用的 PHP 脚本。

为静态文件提供合理安全性的一种方法是在 URL 中放置一个非常长且随机的字符串。所以而不是:

./php/getfile.php?file=xyz-thumb.jpg

使用这个作为 URL:

./files/usBmN5CssIL47qRroC77n90juaQoREThBbFZUddGneEH5jOuX6JpU5cH6zH1Xa5-thumb.jpg

并确保禁止使用目录索引(这样用户就不能只访问./files/

有了这么长的随机文件名,即使黑客能够每秒猜出 十亿个 URL,在他们猜出每一个可能的 URL 之前,宇宙仍然会早早结束。

如果您担心搜索引擎/等会在其他一些安全漏洞之后以某种方式索引文件 URL,您可以将所有文件放在另一个随机名称的目录中 - 并定期更改该目录的名称(可能每天,可能每 10 分钟一次)。在这种情况下,您应该在重命名旧 URL 后将其保留一小段时间(可能带有指向新目录名称的符号链接?)。

乍一看,这听起来可能不如检查用户的登录凭据安全。但实际上,像这样的随机文件名比任何用户名/密码都安全得多

【讨论】:

  • " 任何涉及 PHP 的东西都会对性能造成明显影响。 "。这不是真的,尤其是“引人注目”的部分。当然,性能会受到影响,但不必很明显。
  • +1 表示性能部分,-1 表示随机 URL。如果任何页面上的任何地方都有指向图像的链接,即如果它实际上显示在任何地方,那么随机 URL 对任何试图抓取图像的人来说几乎没有任何区别。是的,它稍微复杂一些,但绝不是任何形式的“安全性”。
  • 感谢您提供有关禁止目录索引的信息。这对我来说是一个重要的新难题。
  • @Nanne 我们在我工作的网络编程公司尝试了很多次,以使 PHP 像静态 apache 文件一样高效运行。它从未成功过,尤其是在涉及数据库的任何事情时。静态文件的延迟总是少得多,即使在非高峰流量下配置良好的约 50,000 美元的服务器也是如此。
  • @deceze 大概任何有权访问带有指向图像的&lt;img&gt; 标记的页面的人,也将有权查看实际图像本身。此时让 php 验证用户的身份验证凭据可能比对页面上的每个图像执行一次要快一个数量级。
【解决方案2】:

根据您上面的 cmets,我会说这听起来是一种非常低效的方法,主要是因为它会停止正常缓存。如果有人可能会自动抓取您的全尺寸图像,那么他们会找到解决方法(例如 Selenium RC)。

如果您只担心有人在抓取图像,请使用其他解决方案。以下是一些其他解决方案:

蜜罐是一种非常常见的实现方式。

【讨论】:

  • 感谢您的链接(和蜜罐建议) - 它有助于将其置于透视图中。我是网络编码的新手,所以我什至不知道抓取内容的所有方式。听起来屏幕抓取是主要方法 - 你是对的,隐藏文件无济于事。
  • 没问题。 Selenium RC 是最难防御的一种,因为它看起来像一个真正的浏览器,你可以放慢它的速度,这样流量就不会显得可疑。实际上,如果您的内容足够吸引人,可以被抓取,那么它就会发生——您所能做的就是处理这个现实。水印图像(可以使用 Image Magick 完成)、使用 Apache、蜜罐和 tineye.com 进行节流都可以提供帮助。
猜你喜欢
  • 1970-01-01
  • 2014-08-22
  • 2015-07-19
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2014-04-25
  • 2013-10-10
  • 1970-01-01
相关资源
最近更新 更多