在 sequelize.js 中使用 build 方法时是不是需要验证、清理或转义数据

Posted

技术标签:

【中文标题】在 sequelize.js 中使用 build 方法时是不是需要验证、清理或转义数据【英文标题】:Do I need to validate, sanitise or escape data when using the build method in sequelize.js在 sequelize.js 中使用 build 方法时是否需要验证、清理或转义数据 【发布时间】:2015-12-24 20:26:28 【问题描述】:

我有一个 node / express / sequelize 应用程序。我正在使用 sequelize 中的 build 方法来创建我的 foo 模型的实例。

Foo 控制器

 exports.create = function(req, res) 
     var foo = db.Foo.build(req.body);
     foo.save().then(function()
         // do stuff
     );
 

Foo 模型

module.exports = function(sequelize, DataTypes) 

var Foo = sequelize.define('Foo', 

  bar: DataTypes.STRING,
  baz: DataTypes.STRING

构建方法是否会检查我保存的数据是否干净,或者我是否需要在这里采取一些额外的预防措施?

【问题讨论】:

只有对底层技术有特殊意义的数据才需要“清理”(“转义”是一个更好的词)。在这种情况下,使用与使用语言相同的代码语法来查询数据库,这与将字符串参数作为查询的 SQL 不同,因此您的数据在使用前不需要转义。 【参考方案1】:

我更喜欢在路由中进行二次验证,因为:

1) 将数据存储在数据库中是您可以使用这些数据执行的众多操作之一。如果您仅在数据库中验证,那么在其他地方您将获得未验证的数据。例如,在将其保存到数据库之前,您可能需要进行一些计算或连接。

2) 或者当您在多条路线中使用一种 sequelize 模型(例如,客户路线和合作伙伴路线中的用户模型)并且您想要制定不同的验证规则时。

我总是在 sequelize 模型中设置验证,但这是使用“最大允许条件”进行验证(例如,用户名字段永远不会大于 200 个字符,它是字符串)。我也进行路由验证。它更加具体和具体(例如,在客户路线中,用户名最大为 100,但在合作伙伴路线中,用户名可能有 150 个字符,并且还检查此字符串的内容)。

最后,严格回答您的问题:sequelize 验证主要用于验证格式。这还不够。看我的回答NodeJS/express - security for public API endpoint 如果您在没有正确验证的情况下保存数据然后提供此数据,那么您将面临 XSS 攻击。

【讨论】:

以上是关于在 sequelize.js 中使用 build 方法时是不是需要验证、清理或转义数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 PostgreSQL 进行一对多设计的 Sequelize.js 最佳实践 [关闭]

使用 Sequelize.js 时在哪里定义关联/关系?

获取由 sequelize.js 生成的原始查询 [重复]

Sequelize.js 外键

DAO vs ORM - 在 Sequelize.js 的上下文中解释的概念

使用 Sequelize.js 进入包含模型