【发布时间】:2014-06-23 21:21:34
【问题描述】:
我将所有图像保存在普通用户无法访问的根目录中。我随机生成所有文件名,所以我不希望他们知道文件的路径或名称。目前,我有 img 元素:
<img src="get_image.php?id=1">
我的get_image.php 页面是这样的:
<?php
include_once 'includes/db_connect.php';
include_once 'includes/functions.php';
$uploaddir = '/root/......./uploads/'; //Direct path from root to folder holding files
$id = $_GET['id'];
if(!is_numeric($id)) {
die("File id must be numeric");
}
// A QUICK QUERY ON A FAKE USER TABLE
$stmt = $mysqli->prepare("SELECT `name`, `mime` FROM `uploads` WHERE `filmId`=?");
$stmt->bind_param("i", $id);
$stmt->execute();
$stmt->bind_result($name, $mime);
// GOING THROUGH THE DATA
while($stmt->fetch()) {
header("Content-Type: " . $mime);
readfile($uploaddir.$name);
}
?>
如果有办法我可以做到这一点?我不想像这样直接调用图像文件src:
<img src="../../../uploads/file.jpg"> <!-- I don't want to do this -->
这样做会让用户(或攻击者)知道我将上传的文件保存在哪里。这些图片是用户上传的,所以如果攻击者上传带有恶意代码的图片(即使我有很多代码检查和验证文件),他们也不知道该文件的保存位置。
另外,我是 Web 开发和保持安全的新手。如果您有任何提示或指针可以添加到我必须使我的网页更安全的内容上,请随意。谢谢!
我正在使用this link 来确保此功能的安全性。
解决方案:
代替:
header("Content-Type: " . $mime);
readfile($uploaddir.$name);
我把这个:
header("Content-Type: " . $mime);
$contents = file_get_contents($uploaddir . $name);
echo $contents;
它有效。
【问题讨论】:
-
为什么暴露文件路径是一个安全问题?
-
@rpax 我猜如果他们能够以某种方式访问根目录,他们将确切地去哪里。更不用说我给我的图像随机命名,所以像这样“硬编码”可以帮助他们知道哪个文件是哪个文件。我只是偏执,希望我的网站尽可能安全。
-
那么有什么办法可以阻止某人尝试
get_image?id=1到get_image?id=99999999并抓取您的所有图像呢?您在“安全”方面一无所获。最多你已经阻止他们知道图像的“真实”名称是什么,所以id=1->boobies.jpg和id=50->kittens.jpg。 -
@RobAveryIV 您当前的代码有什么问题?见stackoverflow.com/questions/1851849/output-an-image-in-php。除此之外,隐藏图像名称并没有安全优势。如果 atacker 设法上传了恶意代码,如果他无法执行,知道它存储在哪里有什么帮助?如果他可以在你的系统上执行代码,他为什么还要费心找出“真实”的图像路径?
-
@webnoob:互联网还有什么用?