当用户单击带有PHP的链接时,如何安全地下载图像


How do I download a image securely when the user click on a link with PHP?

想要一个将图像(*.png、*.jpg、*.gif)下载到用户计算机的链接。

测试了文档中的以下代码以下载文件 http://php.net/manual/en/function.readfile.php

索引.php

<html>
<head></head>
<body>
    <a href="download.php?file=nintendo.png">Download</a>
</body>
</html>

下载.php

<?php
$file = $_GET['file'];
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    readfile($file);
    exit;
} else {
  echo "Ingen fil hittades";
}
?>

注意到您可以编辑链接,以便如果您知道文件名,甚至可以下载所有内容,甚至是 php 文件。

例如:.../download.php?file=download.php将下载文件下载.php

是否可以更改以便只能下载图像?当用户单击链接时,如何安全下载图像?

你可以简单地使用属性下载,这是HTML5的新功能,像这样被Firefox和Chrome支持,但不了解IE浏览器

<a id="download" href="img/Chrysanthemum.jpg" download="a.jpg">Download</a>

编辑:为了使图像易于下载,这一行就足够了。

 Content-Disposition: attachment;

如果您不限制每个用户可以下载的内容,那么我会让人们很难阻止他们猜测文件名。您可以尝试对文件名进行哈希处理,以便file=1be98be84d040d99ca85f5a1786821bf7f4fd37a而不是file=nintendo.png,然后脚本可以通过搜索该哈希来签入数据库以查找正确的文件。

这可以阻止人们

猜测文件名,但它不能阻止人们弄清楚你在做什么,有人可能会尝试不同的哈希,例如 SHA-1 和 MD5 与他们当前知道的任何文件名,系统将允许他们下载文件。在这种情况下,最好使用盐,这将使加密更难破解。

使用盐非常简单,当您从文件名生成哈希时,您将另一个变量添加到组合中,这可能是一个只有您知道的特殊密码,即文件添加到系统的日期。任何只有你会知道的事情。

这是一个例子;

当前链接: file=nintendo.png

SHA1 哈希:file=1be98be84d040d99ca85f5a1786821bf7f4fd37a

SHA1 哈希 + "s3cr3tp4ssw0rd" 盐: file=184649ed65127047f80a46509d0b7447a837b692

你可以看到盐再次改变了哈希。我希望这能给你一些关于混淆和散列网址的想法。