使用 enctype="multipart/form-data" 时出现 CSRF 错误

2024-05-22

每当我将 enctype="multipart/form-data" 添加到我的 html 表单中时,我得到ForbiddenError: invalid csrf token

如果我删除 enctype,它就可以工作

我发送的 csrf 代码如下:input(type="hidden" name="_csrf" value= csrf_token)

我的快递文件:

var express = require('express');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var cookieSession = require('cookie-session');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var csrf = require('csurf');


var env = process.env.NODE_ENV || 'development';

module.exports = function (app, passport) {

  // Static files middleware

  // set views path and default layout
  app.set('views', config.root + '/app/views');
  app.set('view engine', 'jade');

  // bodyParser should be above methodOverride
  app.use(bodyParser.urlencoded({
    extended: true
  }));
  app.use(bodyParser.json());
  app.use(methodOverride(function (req, res) {
    if (req.body && typeof req.body === 'object' && '_method' in req.body) {
      // look in urlencoded POST bodies and delete it
      var method = req.body._method;
      delete req.body._method;
      return method;
    }
  }));

  // cookieParser should be above session
  app.use(cookieParser());
  app.use(cookieSession({ secret: 'secret' }));

  // use passport session
  app.use(passport.initialize());
  app.use(passport.session());

  // connect flash for flash messages - should be declared after sessions

  // adds CSRF support
  if (process.env.NODE_ENV !== 'test') {
    app.use(csrf());

    app.use(function(req, res, next){
      res.locals.csrf_token = req.csrfToken();
      next();
    });
  }
};

My form:

form(action="/adminfruta/criarproduto" enctype="multipart/form-data" method="post")
        input(type="hidden" name="_csrf" value= csrf_token)
        .tipo Tipo do Produto
        
        input(type="radio", value="cesta", name="type", id="cesta", checked="checked")
        label.radio(for="cesta") Cesta
        input(type="radio", value="avulso", name="type", id="avulso")
        label.radio(for="avulso") Avulso
        
        label(for="name") Nome do Produto:
        input(type="text" name="name" id="name")
        label(for="code") Código da Cesta no sistema
        input(type="text" name="code" id="code")
        label(for="inventory") Estoque:
        input(type="number" name="inventory")
        label(for="description") Descrição:
        select(multiple="multiple" name="description" id="descricao")
            for item in itens
                option(value= item.id)= item.name

        label(for="quantities") Quantidade de cada item, de acordo com a ordem da lista (não da ordem que você selecionou) separado por virgulas
        input(type="text" name="quantities" id="quantities" placeholder="Exemplo: 3,1,1,4,2,6")

        .fotos
            .half
                .choose Escolha foto 1 (tamanho 250x250 px):
                input(type="file" name="foto1")
            .half
                .choose Escolha foto 2 (tamanho 250x250 px):
                input(type="file" name="foto2")
        
        .fotos
            .half
                label(for="price") Preço(em centavos):  
                input(type="number" name="price" placeholder="R$86,00  ficaria  8600")
            .half
                label(for="discount") Desconto (opcional): 
                input(type="number" name="discount")


        .tipo Categorias:
        ul.categories
            for category in categories
                li 
                    input(type="radio" value= category.id id= category.name name="category")
                    label(for= category.name) #{category.name}
        
        .tipo Produtos Relacionados:
        .relations
            select(id="related_products" name="related_products" multiple="multiple")
                for product in products
                    option(value= product.id)= product.name


        .tipo Adicionais:
        .relations

            select(id="addons" name="addons" multiple="multiple")
                for item in itens
                    option(value= item.id) #{item.name}
    
        button.button.save(type="submit") Criar Novo

我的路线文件

var aws = require('aws-sdk');
var multer= require('multer');
var multerS3 = require('multer-s3');

var s3 = new aws.S3({/*params: {Bucket: 'frutacor'}*/});

// var upload = multer({ dest: 'public/img/users/' });
var upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'frutacor',
    acl: 'public-read',
    key: function (req, file, cb) {
      cb(null, Date.now().toString());
    }
  })
});

module.exports = function (app, passport) {
    app.post('/adminfruta/criarproduto', admin.verifyAdmin, upload.fields([
    {name: 'foto1', maxCount: 1},
    {name: 'foto2', maxCount: 1}]), admin.createProduct);
}

最后是 admin.js 文件

exports.createProduct = function(req, res){
  var product = new Product(makeProduct(req.body, req.files));
  product.save();
  return res.render('admin/index');
};

var makeProduct = function(product, photos){
  product.photos.push(photos.foto1[0].location);
  product.photos.push(photos.foto2[0].location);
  return product;
};

另外,对于依赖关系:

"dependencies": {
"async": "1.3.0",
"aws-sdk": "^2.4.2",
"body-parser": "1.13.2",
"compression": "1.5.1",
"connect-flash": "0.1.1",
"connect-mongo": "0.8.1",
"cookie-parser": "1.3.5",
"cookie-session": "1.2.0",
"csurf": "1.9.0",
"easyimage": "^2.1.0",
"express": "4.13.1",
"express-session": "1.11.3",
"jade": "^1.11.0",
"method-override": "2.3.3",
"morgan": "1.6.1",
"multer": "^1.1.0",
"multer-s3": "^2.3.2",
"passport": "0.2.2",
"passport-local": "1.0.0",
"sha1": "^1.1.1",
"underscore": "^1.8.3",
"view-helpers": "0.1.5",
}

我以为原因是 multer,但后来我更改了 multer 版本并停止将其用作全局中间件,但仍然收到此错误。

注意:如果我更改操作以在 URL 后包含“?_csrf=#{csrfToken}”,则它可以工作,但我想要一个更清晰的解决方案(如果有)。


制作这样的表格

<form method="post" action="/?_csrf=<%=csrfToken%>"

并删除这个

input(type="hidden" name="_csrf" value= csrf_token)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 enctype="multipart/form-data" 时出现 CSRF 错误 的相关文章

随机推荐

  • Java 9 中 java.se 模块的意义是什么?

    为什么 java 9 模块系统有 java se 模块 它对其他模块具有传递依赖关系 这与 Java 9 之前的世界中依赖整个 rt jar 不一样吗 module java se requires transitive java desk
  • npm 错误!遵循 Angular 2 快速入门时出现无效名称:“@angular/core”

    我正在尝试遵循Angular 2 快速入门 https angular io docs ts latest quickstart html 第一步是设置环境 我对 npm 并不是完全陌生 我设法安装并尝试了 Ember 但仅此而已 下面是我
  • 使用 Code Assist (org.eclipse.mylyn.java.ui.javaAllCompletionProposalComputer) 时 Eclipse 非常慢

    你能猜出会发生什么吗 我使用 Eclipse WTP Axis2 生成了一个客户端存根 并在工作时 一个客户 当我尝试使用 Code Assist 时 Eclipse 运行速度非常慢 也就是说 按一个点即可获取方法列表 工作台有长达 30
  • WSDL PHP 函数返回 null,而其他函数返回预期结果

    Summary 在这里 我将列出我解决此问题所采取的所有步骤 以供其他人参考 1 PHP 很愚蠢地 监听 函数的输入消息来定义它应该使用哪个函数 因此 为每个函数提供不同的输入消息 即使它使用相同的类型或元素 您可能认为这对您来说是一项艰巨
  • 如何在 Facebook SDK for iOS 中定义“GeoPoint”属性

    我试图通过创建一个继承预定义 地点 对象的开放图对象来对开放图故事进行地理标记 但是 我不知道如何在 iOS 中定义 GeoPoint 属性 place location 这里有一个类似问题的答案 https stackoverflow c
  • C++ 中的 Anderson Darling 测试

    我正在尝试计算发现的安德森 达林测试here https en wikipedia org wiki Anderson E2 80 93Darling test 我按照维基百科上的步骤进行操作 并确保当我计算我正在测试的数据的平均值和标准差
  • Android Surface 与 Canvas 的关系

    Surface 和 Canvas 之间到底是什么关系 请解释 表面是一个缓冲区 画布保存绘图 视图未附加到画布 也不是表面 窗户被绑在 Surface 和 ViewRoot 询问 随后使用的画布表面 通过要绘制的视图 详细答案你可以阅读这篇
  • IBOutlet、实例变量和属性:最佳实践

    今天 我对有关声明 IBOutlet 和实例变量 管理它们 使用正确的访问器以及正确释放它们的最佳实践进行了各种研究 我已经差不多了 但我有一些小问题 我希望有人能够就最佳实践提出建议 我会将它们格式化为代码并注释问题 以便更容易理解 我排
  • Git checkout 不会丢弃我的更改

    我在 Windows XP 上使用 git 1 7 1 和 cygwin 这个问题可以通过例子得到最好的说明 git status On branch master Changed but not updated use git add
  • Three20中的TTSpeechBubbleShape仅绘制“语音”三角形顶部和底部

    因此 我将 Three20 库用于 iPhone 应用程序 并希望将 TTSpeechBubbleShape 样式用于视图 但三角形似乎不想画在左边或右边 我在源代码中看到它有很多几何图形 并且想知道是否有人解决了这个问题或知道如何解决它
  • python 中的泛型方法

    是否有可能在Python中实现通用方法处理程序 允许调用不存在的函数 像这样的东西 class FooBar def generic method handler methodName print methodName fb FooBar
  • 如何在java中以编程方式访问网页

    有一个网页 我想从中检索某个字符串 为此 我需要登录 单击一些按钮 填充文本框 单击另一个按钮 然后就会出现字符串 我怎样才能编写一个java程序来自动执行此操作 是否有任何有用的库用于此目的 Thanks Try HtmlUnit htt
  • django过滤器查询集在模板上显示变量[重复]

    这个问题在这里已经有答案了 下面是我的统计页面的views py 此页面有大量基于我的模型对象的计算 效果很好 然而当我申请时Django 过滤器 https django filter readthedocs io en stable 数
  • Robolectric 1.2:“警告:无法找到 Android SDK 的路径”

    I used Robolectric 1 1 jar 与依赖项 在我的项目中并成功使其工作 但是当我将罐子更改为 1 2 SNAPSHOT jar 与依赖项 我收到以下警告 警告 无法找到 Android SDK 的路径 两个jar包都下载
  • 是否有必要将 using 与 IDisposable 对象嵌套?

    我必须把我所有的包裹起来吗IDisposable对象在using 声明 即使我只是将一个声明传递给另一个声明 例如 在以下方法中 public static string ReadResponse HttpWebResponse respo
  • iOS8beta5中无法使用UIWebView打开PDF文件

    I have 工作项目我在其中显示UIWebView 中的 pdf 文件在测试我的应用程序时iOS8beta5 与 XCode5 它不起作用 In log它显示failed to find PDF header PDF not found
  • ASP.NET HTTP 请求是否会转换为 1 个线程?

    可以安全地假设当用户通过 HTTP 请求 aspx 页面时 ASP NET 至少为其创建 1 个线程吗 如果是这样 持续多久 如果 1000 人向同一个 aspx 页面发出 HTTP 请求 是否会涉及一些线程回收 因此不会产生不同的 100
  • Pycharm 中的 Traitlets.traitlets.TraitError

    我是Python的初学者 我面临以下问题 每当我启动 pycharm 社区版 版本 5 0 3 时 Python 控制台无法启动并显示以下错误 usr bin python2 7 usr lib pycharm community help
  • 为什么我会收到此 Javascript 错误“连接未定义”?

    我不确定为什么会收到此错误 connection is not defined document getElementById flashTest sendValFromHtml connection value 这是我的代码 functi
  • 使用 enctype="multipart/form-data" 时出现 CSRF 错误

    每当我将 enctype multipart form data 添加到我的 html 表单中时 我得到ForbiddenError invalid csrf token 如果我删除 enctype 它就可以工作 我发送的 csrf 代码如