Php 安全图像下载

Php 安全图像下载,php,security,file,Php,Security,File,我一直在研究安全地上传图像,很明显,实际上为图像提供服务是恶意PHP文件的主要风险所在,这些文件可能会危害服务器 许多人建议使用一个图像处理脚本,例如getimage.php?i=575748,它将在数据库575748中查找并实际返回myphoto.jpg,而用户不知道原始图像的位置,这样会更加安全 有没有人能告诉我应该在脚本中实现什么样的东西?我知道设置内容类型头是必须的,但这足以停止代码执行吗 谢谢 将上载文件夹放在根文件夹之外,例如在/www/或/htdocs/或/httpdocs/文件夹

我一直在研究安全地上传图像,很明显,实际上为图像提供服务是恶意PHP文件的主要风险所在,这些文件可能会危害服务器

许多人建议使用一个图像处理脚本,例如getimage.php?i=575748,它将在数据库575748中查找并实际返回myphoto.jpg,而用户不知道原始图像的位置,这样会更加安全

有没有人能告诉我应该在脚本中实现什么样的东西?我知道设置内容类型头是必须的,但这足以停止代码执行吗


谢谢

将上载文件夹放在根文件夹之外,例如在/www/或/htdocs/或/httpdocs/文件夹之外。设置文件夹的权限,以便只有本地用户才能对其进行写入

至于数据库的想法,您完全可以结合上述想法来实现,这将有助于提供相当安全的图像上传服务


所涉及的唯一风险是,您没有对要上载到的文件夹设置正确的权限,这确实会危及服务器。

首先,将上载文件夹放在根文件夹之外,即/www/或/htdocs/或/httpdocs/文件夹之外。设置文件夹的权限,以便只有本地用户才能对其进行写入

至于数据库的想法,您完全可以结合上述想法来实现,这将有助于提供相当安全的图像上传服务


所涉及的唯一风险是,您没有对要上载到的文件夹设置正确的权限,这确实会危及服务器。

啊,我明白了。如果不希望图像在文件系统中浮动,也可以将其存储在数据库中。不管你喜欢哪种方式。让脚本服务于图像而不是Apache的问题在于,必须将图像加载到内存中。因此,要做好准备,应对性能影响。

啊,我明白了。如果不希望图像在文件系统中浮动,也可以将其存储在数据库中。不管你喜欢哪种方式。让脚本服务于图像而不是Apache的问题在于,必须将图像加载到内存中。因此,要做好准备,应对绩效影响

很明显,真正为图像服务是 大多数风险都是针对可能危害系统安全的恶意PHP文件 服务器

只有在满足两个条件时才会发生这种情况:

您允许上载非图像文件 下载是通过直接链接完成的 阻止其中一个,危险就消失了。当然,两者兼而有之更好

数据库解决方案旨在中断条件2,但您也可以在上载图像时使用getImageSize函数检查它是否确实是图像。或者尝试使用imageCreateFromJPEG或其他适当的函数加载图像

如果加载的对象不是图像,请显示抱歉,图像已损坏。这既可以保护您的用户不上传损坏的图像,也可以防止有人上传恶意PHP文件或受版权保护的视频或破解的可执行文件或

更新:您还可以混淆现有的上载和下载功能:

假设您当前上载了用户图像,为其分配了一个唯一的ID,将其另存为./images/UNIQUEID.jpg,并为用户提供服务http://www.yoursite.com/images/UNIQUEID.jpg 作为URL

应用.htaccess,以便对./images/whatever的访问被重定向到./images/index.php?ID=whatever 您可以创建一个index.php脚本,该脚本接受任何内容,提取图像ID并输出图像。 所有旧的URL都将继续工作,并看起来直接加载图像,但实际上它们所做的是调用一个PHP脚本,检查图像并将其作为ByTestStream发送,而不进行解释

您需要将ETag设置为ID,将上次修改设置为图像文件的file_mtime,将内容长度设置为文件大小。此外,如果修改了,您可能需要检查传入的头,因为如果没有匹配:如果文件的日期对应于IMS或IFN值对应于ID,您可以发送HTTP/304 Not MODIFED应答而不是图像,从而节省大量带宽

很明显,真正为图像服务是 大多数风险都是针对可能危害系统安全的恶意PHP文件 服务器

只有在满足两个条件时才会发生这种情况:

您允许上载非图像文件 下载是通过直接链接完成的 阻止其中一个,危险就消失了。当然,两者兼而有之更好

数据库解决方案旨在中断条件2,但您也可以在上载图像时使用getImageSize函数检查它是否确实是图像。或者尝试使用imageCreateFromJPEG或其他适当的函数加载图像

如果加载的对象不是图像,请显示抱歉,图像已损坏。这既可以保护您的用户不上传损坏的图像,也可以防止有人上传恶意PHP文件或受版权保护的视频或破解的可执行文件或

更新:您还可以混淆现有的上载和下载功能:

假设您当前上载了用户图像,为其分配了一个唯一的ID,将其另存为./images/UNIQUEID.jpg,并为用户提供服务http://www.yoursite.com/images/UNIQUEID.jpg 作为URL

应用.htaccess,以便对./images/whatever的访问被重定向到./images/index.php?ID=whatever 您可以创建一个index.php脚本,该脚本接受任何内容,提取图像ID并输出图像。 所有旧的URL都将继续工作,并看起来直接加载图像,但实际上它们所做的是调用一个PHP脚本,检查图像并将其作为ByTestStream发送,而不进行解释


您需要将ETag设置为ID,将上次修改设置为图像文件的file_mtime,将内容长度设置为文件大小。此外,如果修改了,您可能需要检查传入的头,因为如果没有匹配:如果文件的日期对应于IMS或IFN值对应于ID,您可以发送HTTP/304 Not MODIFED应答而不是图像,从而节省大量带宽。

解决了您最初的安全问题,在图像存储之前对其运行-如果该函数为false,请将其丢弃。如果有人知道一个更好的解决方案来防止坏图像通过,我洗耳恭听


将映像存储在web可访问目录之外的文件系统上。使用键表进行物理定位是一个好主意。存储IMAGETYPE_XXX值,它是getimagesize返回的数组的第二个索引,并打开该索引以使用等方式提供图像。执行此操作时,不要忘记设置内容类型标题。

解决您最初的安全问题,在存储图像之前对其运行-如果该函数出错,请将其丢弃。如果有人知道一个更好的解决方案来防止坏图像通过,我洗耳恭听


将映像存储在web可访问目录之外的文件系统上。使用键表进行物理定位是一个好主意。存储IMAGETYPE_XXX值,它是getimagesize返回的数组的第二个索引,并打开该索引以使用等方式提供图像。这样做时不要忘记设置内容类型标题。

为什么服务器上的图像甚至是可执行的?IE为什么PHP用户nobody或apache最有可能对具有图像扩展名的文件拥有可执行权限?目前没有,但是我想消除用户将文件扩展名更改为say.PHP然后执行的风险。我认为,通过脚本传送图像,他们无法知道文件存储在哪里,因此直接访问文件会变得更加困难?如果您担心坏图像进入系统,请在存储图像之前运行图像。如果文件实际上不是图像,则返回false。@Anjunal的一个问题是,文件可以同时是图像和其他格式。例如,有一个臭名昭著的gif同时也是一个jar。为什么服务器上的图像甚至是可执行的?IE为什么PHP用户nobody或apache最有可能对具有图像扩展名的文件拥有可执行权限?目前没有,但是我想消除用户将文件扩展名更改为say.PHP然后执行的风险。我认为,通过脚本传送图像,他们无法知道文件存储在哪里,因此直接访问文件会变得更加困难?如果您担心坏图像进入系统,请在存储图像之前运行图像。如果文件实际上不是图像,则返回false。@Anjunal的一个问题是,文件可以同时是图像和其他格式。例如,有一个臭名昭著的gif,它同时是一个jar。实际上,他可以用正确的头读取图像文件,不需要再次加载图像。即使这种方法对于以不同分辨率提供图像(缩略图、comp、完整图像等)或应用水印非常有用。实际上,他可以用正确的头读取图像文件,无需再次加载图像。即使这种方法对于以不同分辨率提供图像(缩略图、comp、完整图像等)或应用水印非常有用。将图像存储在数据库中通常是错误的选择。图像不必加载到内存中即可为其服务。@MarcusAdams我的印象是,除非您使用apache的sendfile mod。在数据库中存储图像通常是错误的选择。图像不必被载入内存来为它们服务。@MarcusAdams我的印象是,除非你 使用apache的sendfile mod。