繁体   English   中英

如何防止用户猜测上传的文件URL?

[英]How can I prevent users from guessing uploaded file URLs?

我有一个简单的上载/检索脚本,用于从数据库中检索图像。 当我上传文件时,脚本会将它们存储在upoadsFolder/ 如果要显示检索图像,请使用以下代码:

<?php

include('./dbconn.php');
$q=$dbconnection->query('SELECT * FROM img_table WHERE id=7');
$row=$q->fetch();
$row['imgpath'];

echo "<img src=uploadsFolder/$row['imgpath'] />";

但是,如果用户知道或可以预测我的任何图像名称,例如nameX.png他将通过修改HTML <img>标签: <img src=uploadsFolder/nameX.png />轻松查看这些图像。

如何保护uploadsFolder/以防止这种情况?

MOREOVER :如果只有用户在自己的浏览器中URL: " localhost/uploadimages/uploads/ "该用户还可以查看'uploadsFolder/'内容的全部内容! 见附件!

在此处输入图片说明

“更多:如果只有他/他在这里/浏览器中输入URL,用户也将能够查看我的'uploadsFolder /'内容的全部内容:“ localhost / uploadimages / uploads /” !!!请参阅附件!“

如果您不希望这种情况发生,则应在您的站点上创建一个.htaccess文件,并在其中包含以下内容:

RewriteEngine on

<ifModule mod_rewrite.c>

Options -Indexes

</IfModule>

这会限制您对网站上任何文件夹的访问,而没有指向文档/文件/图像等的完整链接,它们将收到403 Forbidden错误消息。

只需将文件另存为.htaccess

同样,不要将图像保存在数据库中,只需保存文件名,然后将图像上传到上载文件夹中,然后执行以下操作:
<img src="uploads/<?php echo $row['image_name']; ?>">这样,如果用户可以访问您的数据库(那将是您的错,顺便说一句),是文件名,而不是实际图像。

您也可以尝试@heXer所说的内容。 创建一个仅在用户登录后才能查看图像的系统,否则他们将显示错误消息或将他们重定向到另一个页面。

执行以下操作将解决您的问题:

  • 将图像文件存储在晦涩的地方,例如public_html区域中的目录文件夹结构。 在此文件的父文件夹中,您可以防止与htaccess进行热链接,而只是拒绝对文件的所有访问 (在公共html区域内而不是外部公共区域存储更安全)。

      # htaccess full file: Options -Indexes Deny from all 
  • 使用PHP文件引用您要显示的图像; 如 :

     echo "<img src='uploadsFolder/showImage.php?img=".$row['imghash']."' />"; 
  • 上面引用的PHP文件-“ showImage.php ”-然后可以在数据库中搜索此唯一的哈希列。 找到后,PHP文件将使用file_get_contents()加载图像,然后将该图像输出到带有适当标头的<img>链接

  • 将哈希列添加到现有数据中并填充( 生成随机字符串 )。 确保将其索引为唯一

结果

图像文件应该被保存在同一文件夹作为PHP图像显示文件 此文件夹将不仅包含您的PHP文件。 显然,为方便/imageToucher/showImage.php?img=".$row['imghash']."您可以更改此文件夹的位置(例如: /imageToucher/showImage.php?img=".$row['imghash']."等),也可以使用以下命令更新MySQL中的图像文件路径: 快速通用查找和替换

现在,每次您要加载任何受保护的文件时; 您只需调用PHP文件,然后让它执行以下工作:检查数据库中的哈希值,获取关联的文件路径,从该路径中获取文件,进行加载,解析然后将其作为PHP文件的输出输出本身。

这种方法的好处

  • 您的源文件路径永远不会泄露。
  • 您可以使用PHP中的sleep()语句快速限制(延迟)尝试查找不存在的文件的人员,因此循环使用不同$_GET['img']值的人员会很快变慢(可以使用会话或IP跟踪器等,以记录加载图片URL失败的尝试次数)
  • PHP文件可以处理找到的任何有效图像,因此您可以按缩略图大小显示图像,也可以根据需要设置其他输出条件。

较小的缺点是此文件夹中的数据需要通过网站另一部分中的代码进行解析才能显示,因为.htaccess拒绝所有直接访问,这包括网页中的引用,因此访问必须通过PHP和数据库收集有效的URL。 在繁忙的情况下,这会使缩略图列表等变得更加繁重,效率降低。

由于要显示它们,因此需要将它们公开。 但是,您可以使用散列(id + timestamp的md5)将它们存储在数据库中。 这样,名称就无法预测。 基本上,唯一的方法是使其不可预测。 您可以将它们另存为md5(id),但是如果有人了解了该算法,那仍然会使它们有些可预测。

如果用户可以列出目录,则显然您已经迷路了。

通常,依靠秘密名称和/或链接而不是实施访问控制是一种不好的做法。 这些秘密往往以各种方式泄漏。 例如, 看看DropBox发生了什么

当人们尝试这样的事情时,安全性通常会失败的另一种方式是使用可预测的随机性而不是密码随机性来得出秘密。 PHP Mersenne Twister随机数生成器是可预测的:知道一些输出(即从允许用户知道的图像)将允许用户导出将来的输出(未来的图像链接)和先前的输出(已经存在的图像链接) 。 PHP的lcg_value也是如此。

底线:没有什么可以替代适当的访问控制。 否则,您将违反完整的中介安全性原则 ,这会使您容易受到直接对象引用漏洞的攻击

暂无
暂无

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

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