php图像存储 - 安全

时间:2011-10-07 22:17:41

标签: php image security upload

我想我有两种方法可以在php应用程序中存储图像:要么将它们存储在数据库中,要么存储到具有唯一名称的文件夹中。考虑到我想最小化数据库连接,如何保护包含用户上传图像的文件夹?

所以基本上,每个用户都会有一个个人资料,并将他们的照片上传到网站,与他们想要的任何人分享。我打算按如下方式存储它们:

/root/somefolder/{userid}{uniquenumber}.jpg

如果我配置htaccess以防止访问当前文件夹,它就足够了吗?或者我应该采取其他一些安全措施吗?

干杯

3 个答案:

答案 0 :(得分:5)

  

将它们存储在数据库或具有唯一名称

的文件夹中

数据库针对存储小块数据而非大块数据进行了优化。如果让普通的操作系统和Web服务器处理文件传递,您将获得更好的性能。使用普通文件可以使您不必重新实现HTTP缓存头和范围请求的处理。

但无论哪种方式,这些资源都需要网址,因此问题的第二部分仍然相关。

  

如果我配置htaccess以阻止访问当前文件夹,它就足够了吗?

我认为这就足够了。只要唯一部分很长(例如,“somefolder / 738b3093b898654bd3bbb9e3770e7fc0.jpg”)并且不遵循模式就无法猜测它。

但除非你真的需要文件名中的userid,否则请避开它。 Facebook包含用户个人资料ID是照片文件名的一部分,因此当人们在其他地方共享照片文件时,它允许发现他们的Facebook个人资料和真实姓名。我看到它导致多个在线社区中的跟踪和骚扰。这不是用户的错 - 他们不知道他们是通过在某处张贴照片来泄露他们的真名或朋友的真实姓名。

另一个考虑因素是,随着这样一个系统的增长并且它获得了大量的文件,如果它们只在一个文件夹中,那么它对文件系统来说是一个可怕的负担。您可以通过在子文件夹中重复或拆分部分名称来轻松防止这种情况。例如,“somefolder / 7e / 7e8b3093b898654bd3bbb9e3770e7fc0.jpg”。

答案 1 :(得分:1)

如果您确实需要一些额外的安全性,可以将文件存储在网站公共路径之外的文件夹中。构建一个页面,例如http://example.com/get_photo/?id=12345,其中该页面验证用户是否已登录并具有照片的权限,然后查找实际文件名并在响应中包含该文件。请记住,您需要为图像格式发出正确的MIME类型标头。

答案 2 :(得分:1)

实际上,许多数据库引擎无论如何都会将BLOB数据存储为单独的文件,因此只需将图像存储为文件。它将使您的数据库更小,更易于管理,更易于备份,并且在紧急情况下更容易恢复。

相关问题