完整安全图像上载脚本我不知道这是否会发生,但我会尝试一下。过去一小时,我研究了图像上传安全性。我了解到有很多功能可以测试上传。在我的项目中,我需要保证上传的图像。也可能有相当大的数量,并且可能需要大量带宽,因此购买API不是一种选择。所以我决定获得一个完整的PHP脚本,用于真正的安全图像上传。我也认为这对许多人有帮助,因为找不到真正安全的人是不可能的。但我不是php的专家,所以添加一些功能对我来说真的很头疼,所以我会请求这个社区帮助来创建一个真正安全图像上传的完整脚本。关于它的真正伟大的话题在这里(但是,它们只是告诉我们需要做什么,但不是如何做到这一点,正如我所说我不是PHP的高手,所以我无法做到这一切我自己): PHP图像上传安全检查列表https://security.stackexchange.com/questions/32852/risks-of-a-php-image-upload-form总之,他们告诉这是安全图像上传所需要的(我将从上面的页面引用):使用.httaccess禁止PHP在上传文件夹中运行。如果文件名包含字符串“php”,则不允许上传。仅允许扩展名:jpg,jpeg,gif和png。仅允许图像文件类型。禁止具有两种文件类型的图像。更改图像名称。上传到子目录而不是根目录。也:使用GD(或Imagick)重新处理图像并保存处理后的图像。所有其他人都对黑客来说很有趣“正如rr指出的那样,使用move_uploaded_file()进行任何上传“顺便说一句,你想要对你的上传文件夹非常严格。那些地方是许多漏洞发生的黑暗角落之一。这适用于任何类型的上载和任何编程语言/服务器。检查https://www.owasp.org/index.php/Unrestricted_File_Upload第1级:检查扩展名(扩展名文件以)结尾第2级:检查MIME类型($ file_info = getimagesize($ _ FILES ['image_file']; $ file_mime = $ file_info ['mime'];)级别3:读取前100个字节并检查它们是否具有以下范围内的任何字节:ASCII 0-8,12-31(十进制)。级别4:检查标题中的幻数(文件的前10-20个字节)。你可以在这里找到一些文件头字节:http://en.wikipedia.org/wiki/Magic_number_%28programming%29#Examples您可能还想在$ _FILES ['my_files'] ['tmp_name']上运行“is_uploaded_file”。请参见http://php.net/manual/en/function.is-uploaded-file.php这是它的重要组成部分,但仍然不是全部。(如果您知道更多可能有助于使上传更安全的内容,请分享。)这就是我们现在所做的事情所以,我要问的是通过发布代码片段来帮助我(以及其他所有人)使这个图像上传脚本变得超级安全。或者通过共享/创建添加了所有片段的完整脚本。
2 回答
![?](http://img1.sycdn.imooc.com/54584ee0000179f302200220-100-100.jpg)
隔江千里
TA贡献1906条经验 获得超10个赞
使用PHP上传文件既简单又安全。我建议学习一下:
pathinfo - 返回有关文件路径的信息
move_uploaded_file - 将上传的文件移动到新位置
copy - 复制文件
finfo_open - 创建新
fileinfo
资源
要在PHP中上传文件,您有两种方法:PUT
和POST
。要将该POST
方法与HTML一起使用,您需要enctype
在表单上启用如下:
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"></form>
然后在你的PHP中你需要得到你上传的文件,$_FILES
如下所示:
$_FILES['file']
然后你需要从temp(“upload”)移动文件move_uploaded_file
:
if (move_uploaded_file($_FILES['file']['tmp_name'], YOUR_PATH)) { // ...}
上传文件后,您需要检查文件的扩展名。最好的方法是这样使用pathinfo
:
$extension = pathinfo($_FILES['file']['tmp_name'], PATHINFO_EXTENSION);
但是扩展程序并不安全,因为您可以上传带扩展名.jpg
但带有mimetype 的文件,text/php
这是一个后门程序。所以,我建议finfo_open
像这样检查真正的mimetype :
$mime = finfo_file(finfo_open(FILEINFO_MIME_TYPE), $_FILES['file']['tmp_name']);
并且不要使用,$_FILES['file']['type']
因为有时,根据您的浏览器和客户端操作系统,您可能会收到, application/octet-stream
并且此mimetype不是您上传文件的真实mimetype。
我认为您可以使用此方案安全地上传文件。
对不起我的英文,再见!
- 2 回答
- 0 关注
- 371 浏览
添加回答
举报
0/150
提交
取消