<input type="file" id="fileUpload" onchange="checkFileType(this)">
<script>
function checkFileType(input) {
const allowedExtensions = ['jpg', 'jpeg', 'png'];
const file = input.files[0];
const fileName = file.name.toLowerCase();
const fileExtension = fileName.split('.').pop();
if (!allowedExtensions.includes(fileExtension)) {
alert('文件类型不被允许!');
input.value = ''; // 清空上传字段
}
}
</script>
document.getElementById('fileUpload').removeAttribute('onchange');
curl -X POST -F "file=@malicious.jpg;type=image/png" http://example.com/upload
白名单验证:只允许上传特定类型的文件,使用文件的MIME类型而不是文件后缀来验证。
文件名重命名:将上传的文件重命名为随机生成的名称,不要使用原始文件名。
文件存储在非Web根目录:确保上传的文件不可执行,并存储在Web根目录之外。
限制文件大小:限制上传文件的大小,以防止上传过大的文件。
使用安全库:使用安全的上传库和框架,如Express.js的multer中间件,它包含了一些内置的安全性。
服务器端验证:除了客户端验证,一定要在服务器端再次验证上传的文件。
const file = req.file;
if (!file) {
return res.status(400).send('未选择文件。');
}
// 进一步验证文件类型和大小
if (!allowedExtensions.includes(fileExtension) || file.size > maxSize) {
return res.status(400).send('文件不符合要求。');
}
// 保存文件
// ...
关 注 有 礼
欢迎关注公众号:咸鱼不太咸
获取包邮送书抽奖码
原文始发于微信公众号(Web安全工具库):文件上传漏洞与安全绕过技术
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论