接入层上传问题
上传来自用户,会马上被用户访问
如果文件被当做文件解析,可能会造成问题。
如果是可以被执行的文件,可能会直接执行一些非法的操作。
上传问题:
- 上传文件
- 再次访问上传的文件
- 上传的文件被当成程序解析
const bodyParser = require('koa-body');
app.use(bodyParser({
multipart: true
}))
防御:
- 限制上传后缀
if(data.files) {
let file = data.files.img;
let ext = path.extname(file.name);
if(ext === 'js') {
throw new Error('别传js');
}
let filename = Date.now() + ext;
fs.readnameSync(file.path, './static/upload' + filename);
data.fields.content += '<img src="/uploadFile/" + filename/>'
data = data.fields;
}
- 文件类型检查
if(file.type != 'images/png') {
throw new Error('只允许png')
}
- 文件内容检查
每一种文件前面的几个buffer的内容都是固定的
var fileBuffer = fs.readFileSync(file.path);
fileBuffer[0] == 0x5b;
- 程序输出
- 权限控制-可写可执行互斥