Express Handlebars 不会渲染数据

2024-02-13

我正在使用 Express-Handlebars 模板引擎来使用 NodeJS 和 Express。

Handlebars 在尝试渲染模板时抛出以下错误:

车把:访问已被拒绝解析属性“用户名” 因为它不是其父级的“自己的财产”。您可以添加一个 运行时选项禁用检查或此警告:请参阅https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access欲了解详情

根据上面的链接:

从4.6.0版本开始,Handlebars默认禁止访问上下文对象的原型属性和方法。原因是这种可能性引起的各种安全问题。

我的 app.js 包含以下内容:

const exphbs = require('express-handlebars');
const express = require('express');
// Init Express
const app = express();
// VIEW ENGINE
app.engine('handlebars', exphbs({
  defaultLayout: 'main'
}));
app.set('view engine', 'handlebars');

我的路由文件通过 Mongoose 从 MongoDB 获取:

//@GET - View
router.get('/', authMiddleware, (req, res, next) => {
  // Mongoose
  Model.find({ user: req.user._id })
    .sort({ date: -1 })
    .then(model => {
      res.render('/overview', { model: model })
    })
    .catch(err => {
      if (err) throw err;
      req.flash('error_msg', 'No Model Found');
    })

})

模型是对象的数组

这个问题是在我开始尝试添加车把助手之后才开始发生的。我已删除助手并恢复到原始配置设置(上面),但无济于事。我尝试删除node_modules文件夹并重新安装npm。

发送的是一个对象数组,我尝试使用 {{#each model}} 帮助器循环对象的属性,并通过每个中的 {{prop1}} 引用各个属性。

根据 Handlebars 的说法,默认情况下禁用 proto 属性是 false,并且此更改不应破坏任何内容。

我的问题:

  1. 我是否错误地将数据发送到车把?如果是这样,将数据发送到express-handlebars模板进行渲染的正确方法是什么(不让我的服务器暴露于安全漏洞)?

先感谢您。


当我升级车把套件时,我遇到了同样的问题。为了尽快让您的系统恢复在线状态,请删除 package.json 中的 handbars 条目,然后在其位置插入此行。

"handlebars": "4.5.3",

从版本 4.6.0 开始,Handlebars 默认禁止访问上下文对象的原型属性和方法。这与此处描述的安全问题有关:https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html https://mahmoudsec.blogspot.com/2019/04/handlebars-template-injection-and-rce.html

参考https://github.com/wycats/handlebars.js/issues/1642 https://github.com/wycats/handlebars.js/issues/1642

上面 URL 中的示例显示了 Mongoose 响应转换为 JSON 的情况:

app.get('/test', function (_req, res) {
    Kitten.find({}).then(kittens => {
        res.render('test.hbs', {
            kittens: kittens.map(kitten => kitten.toJSON())
        })
    })
});

如果您确定只有受信任的开发人员并且没有最终用户有权访问车把模板,则可以通过安装以下软件包来允许原型访问:

npm install @handlebars/allow-prototype-access

这是它的使用示例:

const express = require('express');
const Handlebars = require('handlebars')
const expressHandlebars = require('express-handlebars');
const {allowInsecurePrototypeAccess} = require('@handlebars/allow-prototype-access')

const app = express();

app.engine('handlebars', expressHandlebars({
    handlebars: allowInsecurePrototypeAccess(Handlebars)
}));
app.set('view engine', 'handlebars');
...

另一种选择是使用 mongoose .lean() 函数。这样做的好处是比传统的猫鼬查询快得多。但它也有一些缺点。默认情况下,Mongoose 查询返回 Mongoose Document 类的实例。这些对象包含大量用于更改跟踪的内部状态,并具有其他方法,例如 .save()。启用精简选项告诉 Mongoose 跳过实例化完整的 Mongoose 文档,只返回纯 JavaScript 对象。

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

Express Handlebars 不会渲染数据 的相关文章

随机推荐

  • Angular2 ng-bootstrap:使用不同的数据重用模态模板

    我正在构建一个类似仪表板的界面 其中包含一组包含可比数据的实体 这些实体中的每一个都有一个编辑按钮 我想用它来打开一个显示相应数据的模式 我想重用相同的模式模板 并显示来自单击编辑按钮的实体的数据 我在用Angular2 with ng 引
  • 检查 Java 中的内存布局

    我正在尝试继承 出于教育目的 我想检查为各种对象分配的地址以及对象内的字段 有没有一个工具可以让我查看 JVM 正在使用哪些内存以及它的用途 例如 如果我有两个课程 class A int i j int f class B extends
  • 在 cap 部署时预编译资产时收到“警告:已初始化常量”

    目前 我在通过 capistrano 进行生产部署时遇到了关于部署 资产 预编译的奇怪警告消息 当我第一次部署演示 Rails 项目时运行 cap 生产部署时 收到以下警告消息 并且部署失败 cap 中止
  • 如何通过创建React应用程序启用JIT(即时模式)?

    我尝试自己在 create react app 中设置 JIT 但它似乎不起作用 因为样式没有更新 我正在使用 craco 来构建带有 tailwind css 的应用程序 并且还添加了 TAILWIND mode WATCH 因为他们建议
  • 如何自动装配 Spring 环境对象

    我正在尝试从应用程序对象内的 properties 文件获取属性 我对如何做到这一点的唯一了解是通过Environment object 它在我的配置中运行得很好 Configuration ComponentScan basePackag
  • 使用基于 Spark 数据集的 ML API 时初始化逻辑回归系数?

    默认情况下 逻辑回归训练将系数初始化为全零 但是 我想自己初始化系数 这将很有用 例如 如果之前的训练运行在几次迭代后崩溃了 我可以简单地使用最后一组已知的系数重新开始训练 这对于任何基于数据集 数据帧的 API 最好是 Scala 是否可
  • div 真的可以覆盖布局上所有内容的 table 吗?

    也许已经有一个关于这个主题的问题 但我找不到它 我的问题很简单 我可以在页面布局上仅使用 div 吗 例如 我在创建一个带有角的 div 时遇到了麻烦 A B C D E F G H I 将所有字母作为带有一些背景的div 而字母E是放置内
  • Kubernetes:获取容器内的实际资源限制

    有没有办法获取容器内的实际资源 CPU 和内存 约束 假设节点有 4 个核心 但我的容器通过资源请求 限制仅配置了 1 个核心 因此它实际上使用 1 个核心 但它仍然从 proc cpuinfo 看到 4 个核心 我想根据应用程序实际可以使
  • 查询线程(不是进程)处理器关联性?

    在 Windows 上 您可以为进程调用 SetProcessAffinityMask 为线程调用 SetThreadAffinityMask 然而 Windows 似乎只公开 GetProcessAffinityMask 而不是针对进程的
  • 部署到 OS X 10.6 和“使用旧版运行时的平台不支持 -fobj-arc”

    背景 我正在为 OS X 构建一个应用程序 部署目标为 10 6 我还没有将我的应用程序完全转换为 ARC 但我添加了一些将从 ARC 中受益的新类 因此我设置了 fobj arc这些类的编译器标志 编译失败通用 32 64 位英特尔架构
  • 更改 scanf() 分隔符

    我的目标是改变分隔符scanf to n 我尝试使用scanf n s sen 并且对于单一输入工作得很好 但是当我将同一条线放入for循环多个句子它给了我垃圾值 有谁知道为什么 这是我的代码 char sen 20 for i 0 i l
  • 如何在laravel上使用dd()而不停止程序

    我正在用 laravel 构建一个网站 我想调试我的程序 但很难使用 dd 因为它会立即停止程序 我想让它每次执行时逐行显示 知道吗 任何帮助将不胜感激 谢谢 在不输出到页面的情况下获取结果的另一种方法 有时对生产很有用 是将其记录到文件中
  • Spring Data Rest:如何通过另一个对象的键进行搜索?

    在 Spring Data Rest 中 对象的 ID 是随对象返回的 URI 例如 如果我有一个用户 它可能有一个如下 URI http example com users 1 在真实的 REST api 中 此 URI 是对象的 id
  • 使用 ElementTree 修改 XML

  • 从字符串中删除最后一个字符。斯威夫特语言

    如何使用 Swift 从 String 变量中删除最后一个字符 在文档中找不到它 这是完整的示例 var expression 45 22 expression expression substringToIndex countElemen
  • 如何修复 iOS 上 Cordova 3.1 的键盘问题?

    我刚刚测试过科尔多瓦3 1使用示例 iOS 应用程序并遇到了几个键盘问题 应用程序设置 Xcode 5 状态栏被隐藏 横向模式 配置文件 Issues 所有版本 当焦点位于输入字段时 整个视图都会向上推 包括导航栏 iOS5 6 点击输入字
  • 检查某个元素在屏幕上是否可见

    我正在使用这个插件 在屏幕上 https github com moagrius isOnScreen检查某个元素在视口上是否可见 检查帖子是否已被查看 但是是否可以进行某种回调 以便在相应元素可见时触发回调 而不是使用 setTimeOu
  • SHA512Managed 是否被认为是 .NET 3.5 中用于安全性的最佳单向哈希?

    三个 SHA512Managed 相关问题 SHA512Managed 是否被认为是 NET 3 5 中用于安全性的最佳单向哈希 SHA512Managed 应该使用什么盐大小 该应用程序适用于至少 8 个字符的强密码 对于小弦来说 512
  • 如何使用“excelpackage”设置颜色或背景

    我使用这个包 Excel包 http excelpackage codeplex com 虽然我不知道如何设置单元格的背景颜色 我尝试使用这个 ws Cells A1 Style Fill PatternType OfficeOpenXml
  • Express Handlebars 不会渲染数据

    我正在使用 Express Handlebars 模板引擎来使用 NodeJS 和 Express Handlebars 在尝试渲染模板时抛出以下错误 车把 访问已被拒绝解析属性 用户名 因为它不是其父级的 自己的财产 您可以添加一个 运行