12:文件上传
安全459 字
■ 合法性校验
场景:允许用户自定义上传文件的场景比如:用户头像上传,各种图片、文件、文档等资料上传。
说明:进行文件上传时,在服务端对文件属性进行合法性校验,白名单形式检查文档类型(如文件的后缀名、文件头信息校验等)和大小(图片校验长、宽和像素等)。
PHP 示例:通过白名单限制上传的文件类型,文件大小限制防止DDoS攻击。
<?php
if ($_FILES['myfile']['error'] > 0) {
echo "文件上传出现错误";
exit();
}
$file_type = $_FILES['myfile']['type'];
if ($file_type != "image/jpeg" && $file_type != 'image/pjpeg') {
echo "文件类型只能为jpg格式";
exit();
}
$file_size = $_FILES['myfile']['size'];
if ($file_size > 2*1024*1024) {
echo "文件过大,不能上传大于2M的文件";
exit();
}
if (is_uploaded_file($_FILES['myfile']['tmp_name'])) {
$uploaded_file = $_FILES['myfile']['tmp_name'];
$file_true_name = $_FILES['myfile']['name'];
$move_to_file = $_SERVER['DOCUMENT_ROOT']."/upload/".time().rand(1, 1000).substr($file_true_name, strrpos($file_true_name, "."));
if (move_uploaded_file($uploaded_file, iconv("utf-8", "gb2312", $move_to_file))) {
echo "文件上传成功";
}
}
echo "文件上传失败";
exit();
?>
■ 存储环境设置
场景:同上
说明:进行文件保存时,保存在与应用环境独立的文档服务器中(配置独立域名),保存的目录为web启动用户所属,设置为不可同时有写和执行权限。
配置示例:
[root~ ]# chmod 755 /data/xxx.100tal.com/upload -Rf
■ 隐藏文件路径
场景:允许用户自定义上传文件的场景比如:用户头像上传,各种图片、文件、文档等资料上传。
说明:进行文件保存时,成功上传的文件需要进行随机化重命名,禁止给客户端返回保存的路径信息。
PHP示例:白名单检测文件后缀名,然后随机数重写文件名
<?php
//coding
■ 文件访问设置
场景:允许用户上传文件,并提供文件下载功能的场景,比如下载课件知识资料等
说明:进行文件下载时,应以二进制附件形式下载,建议不提供直接访问(防止木马文件直接执行)。
PHP 示例:
<?php
$filename = $_GET['filename'];
$download_path = $_SERVER['DOCUMENT_ROOT']."/upload/";
if (eregi("\.\.", $filename)) {
echo "抱歉,你不能下载该文件!";
exit();
}
$file = str_replace("..", "", $filename);
if (!eregi("\.jpeg$", $file)) {
echo "抱歉,你不能下载该文件!";
exit();
}
$file = "$download_path$file";
if (!file_exists($file)) {
echo "抱歉,文件不存在!";
exit();
}
$type = filetype($file);
header("Content-type: $type");
header("Content-Disposition: attachment;filename=$filename");
header("Content-Transfer-Encoding: binary");
header('Pragma: no-cache');
header('Expires: 0');
set_time_limit(180);
readfile($file);
?>