【发布时间】:2020-10-10 13:49:56
【问题描述】:
出于安全原因,我决定将用户个人资料图片上传到数据库,而不仅仅是一个文件夹并上传图片地址,这将是一个好主意。
我以前从未在后端处理过文件上传问题,但从各种来源了解了这一点,我相信我做的一切都是正确的。但是没有上传有用的二进制数据。
在 php.ini 中
file_uploads=开启
在前端
<form enctype="multipart/form-data" method="post" autocomplete="on" action="upload/">
<p>
<input type="file" id="avatar" name="avatar" accept="image/png, image/jpeg" required />
<label for="avatar">*Profile photo</label>
</p>
<p class="submitter two-thirds columns">
<input type="submit" value="Apply" />
</p>
</form>
在后台
if(isset($_SESSION['id']))
$UserID = $_SESSION['id'];
else exit(1);
if (!empty($_FILES['avatar'])){
$photo = fopen($_FILES['avatar']["tmp_name"], 'rb');
$photo_mime = $_FILES['avatar']["type"];
}
else exit(1);
$values_data = array(
$UserID,
$photo,
$photo_mime,
);
$sql = "INSERT INTO `user`
(
UserID,
photo,
photo_mime
)
VALUES
(
:UserID,
:photo,
:photo_mime
)
ON DUPLICATE KEY UPDATE
photo = :photo,
photo_mime = :photo_mime
";
$sth = $dbh->prepare($sql);
$sth->bindValue(':UserID', $values_data[0]);
$sth->bindValue(':photo', $values_data[1]);
$sth->bindValue(':photo_mime', $values_data[2]);
$sth->execute();
并且数据库确实获得了一些信息
但是,这些图像二进制文件都是 1KB。看看他们里面有这样的数据
资源 ID #13
所以二进制文件会被弄乱或丢弃在某个地方......但是在哪里?
【问题讨论】:
-
出于好奇,将图像存储在数据库中解决了哪些安全问题?
-
@MagnusEriksson 我的第一个选择是带有图像地址的公共文件夹。即使我停止此文件夹可导航或可索引,也可以通过操作 URL 轻松浏览用户照片,除非我的所有图像名称都有大量随机字符......而且我不确定这有多安全将是 tbh
-
您可以将图像保留在文档根目录之外,并拥有一个充当代理的 PHP 文件:
image.php?name=foo.jpg,并让image.php文件从图像文件夹读取并输出图像数据。然后您还可以在输出图像之前添加检查以查看用户是否已登录。它将就像您的数据库解决方案一样,但不需要将 files 存储在数据库中,而不是存储在 file 系统(它们所属的位置)中。.. -
@MagnusEriksson 哦,好吧。 file_get_contents 看起来更有希望。 var_dump 为此输出大量明显随机的 unicode,因此看起来是正确的。上传到数据库失败,但很快就会检查
-
如果下面的答案有帮助,请告诉我。如果是,请随时接受它,让其他用户知道它已解决。