当我添加对CSRF令牌的支持以确保提交的安全性时,我的多部分表单遇到了问题。我已经将CSRF生成设置为我的req
文件中的app.js
对象,除了多部件之外,其他任何类型的web表单都没有问题。我已经阅读了这是常见的问题与穆特,并与安置CSRF结合穆特设置或附加它作为一个查询提交。出于安全原因,我不愿意使用附加查询的方法,我更希望看到如何修复我的设置,以像我的其他表单一样运行。
错误消息:
ForbiddenError: invalid csrf token
at csrf (/Users/user/Desktop/Projects/node/test-app/node_modules/csurf/index.js:112:19)
app.js:
var csrf = require('csurf');
....
//Set CSRF for Form Tokens
app.use(csrf());
app.use(function(req, res, next){
res.locals._csrf = req.csrfToken();
next();
});
路线:
var upload = multer({
storage: multerS3({
s3: s3,
bucket: options.Bucket,
contentType: multerS3.AUTO_CONTENT_TYPE,
acl: options.ACL,
key: function(req, file, cb){
var fileNameFormatted = file.originalname.replace(/\s+/g, '-').toLowerCase();
cb(null, req.user.organizationId + '/' + uploadDate + '/' + fileNameFormatted);
}
}),
fileFilter: function(req, file, cb){
if(!file.originalname.match(/\.(jpg|jpeg|png|gif|csv|xls|xlsb|xlsm|xlsx)$/)){
return cb('One of your selected files is not supported', false);
}
cb(null, true);
}
}).array('fileUpload', 5);
appRoutes.route('/blog/create')
.get(function(req, res){
res.render('pages/app/blog-create.hbs',{
errorMessage: req.flash('error'),
csrfToken: req.csrfToken()
});
})
.post(function(req, res){
upload(req, res, function(err){
if(err){
req.flash('error', err);
res.redirect(req.get('referer'));
return;
}
models.Blog.create({
date: req.body.date,
title: req.body.title,
content: req.body.content,
userId: req.user.userId
}).then(function(){
req.flash('info', 'Blog was successfully created.');
res.redirect('/app');
});
})
});
视图:
<form action="/app/blog/create" method="post" enctype="multipart/form-data" id="blogSubmission">
<input type="hidden" name="_csrf" value="{{csrfToken}}">
....
</form>
发布于 2020-01-19 18:28:50
只是需要在冲浪前加上穆特-
app.use(multer().single('image-field-name'));
app.use(csurf());
并确保在后置期间传递_csrf
值-
<input type="hidden" name="_csrf" value="<%= csrfToken %>">
如果上面的解决方案不起作用,那么只需在POST操作-上添加"_csrf“值即可。
<form action="/admin/?_csrf=<%=csrfToken%>" method="POST" enctype="multipart/form-data">
</form>
发布于 2017-10-12 12:50:26
嗨:这有点晚了,但是(首先,我可能不是一个很好的讲英语的人,所以如果你看到任何语法或拼写错误的话
{try(){understand()}catch(e){/*do nothing :)*/}}
方法:)
上个月我遇到了你的问题,太糟了,我找不到一个好的答案
(老实说,我不太擅长阅读别人的代码,所以读读我的答案,找出如何编辑你的代码。)
老实说,如果你想使用通常的投递表单方法(有一种方法建议你先获取并保存文件,然后检查它是csrf,我真的不太喜欢它),那就没有好的答案了。但是如果你愿意做一些比较硬的前端javascript,那么你会过得很好:
整个想法是为您的表单设置一个标头,然后发送它(全部使用AJAX和JQuery):
下面是你应该如何做的一个小例子:
$.ajax({
cache: false,
type: 'POST',
url: 'the URL you want to post to',
contentType: "what ever you want",
headers: {"X-CSRF-TOKEN": csrfToken},
data: your data,
success: function (res) {
some code after you get a response from server
console.log(res)
}
})
https://stackoverflow.com/questions/42685940
复制相似问题