2017-03-09 15 views
0

CSRFトークンのサポートを追加して送信を安全に保つために、マルチパートフォームで問題が発生しました。私はapp.jsファイルのreqオブジェクトにCSRFの世代をグローバルに設定しており、マルチパート以外の他のタイプのWebフォームには問題がありません。私はこれがmulterの一般的な問題のどこにあるのかを読んで、CSRFの配置とmulterの設定のどちらに関連するのか、またはそれを送信時の問い合わせとして添付してください。私はセキュリティ上の理由からクエリを添付するというアプローチに慣れておらず、他のフォームのように実行するようにセットアップを修正する方法を見たいと思っています。CSRFとMulter - 無効な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> 

答えて

0

:)こんにちは、これは少し遅れているが、あなたはどんな文法を参照するか、エラーの使用に

{try(){understand()}catch(e){/*do nothing :)*/}} 
をspelingので、もし(最初の私はすべての良い英語話者ではないかもしれません ))私は先月、あなたの問題を持っていたし、私が良い答え

を見つけることができなかったことをとても悪かったけど、ここであなたが:)です

方法:))

(正直私は非常に良好ではありませんよ他人のコードを読むときに私の答えを読んでコードを編集する方法を理解してください)

普通の投稿フォームの方法を使いたいなら正直言っていい答えはありません。ファイルを保存してから、私が実際にあまり好きではないcsrfを確認してください)、ちょっとしたフロントエンドのjavascriptをやりたいなら、あなたは良い日です:

全体のアイデアはヘッダーを設定することですフォームのため、その後(すべてAJAXjQueryのを使用して)それを送信します。ここ

は、あなたがよかの小さな例です。それを行う必要があります:

$.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) 
    } 
}) 
関連する問題