首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询中的TypeORM,Backticks和Colon

查询中的TypeORM,Backticks和Colon
EN

Stack Overflow用户
提问于 2021-10-25 03:31:16
回答 1查看 333关注 0票数 1

我一直在使用backticks编写查询

代码语言:javascript
复制
const firstUser = await connection
    .getRepository(User)
    .createQueryBuilder("user")
    .where(`user.id = '${id}'`)
    .getOne();

但是在typeorm文档中,示例是用冒号编写的。

代码语言:javascript
复制
const firstUser = await connection
    .getRepository(User)
    .createQueryBuilder("user")
    .where("user.id = :id", { id: 1 })
    .getOne();

所以我想知道用后排和冒号是否有什么区别。

任何见解都将不胜感激。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-25 06:11:37

不使用字符串内插将值插入SQL语句中。

很抱歉大喊大叫,但这很重要。

当你这样做时:

代码语言:javascript
复制
.where(`user.id = '${id}'`)

然后首先创建字符串,然后将其传递给where()函数。这意味着,如果id123,那么它与以下内容相同:

代码语言:javascript
复制
.where(`user.id = '123'`)

这似乎很好。但如果id123' OR 1=1--'

你现在明白了:

代码语言:javascript
复制
.where(`user.id = '123' OR 1=1--'`) // Now returns ALL users!

这叫做SQL注入,这是一个很大的安全问题。非常糟糕。攻击者可以更改您的查询,并访问他们不应该访问的数据,或者更改记录以给自己提供管理权限,或者其他各种非常糟糕的事情。它非常接近于让每个人都能对您的数据库进行完整的读写访问。

这就引出了这一点:

代码语言:javascript
复制
.where("user.id = :id", { id: 1 })

为了解决这一问题,您要求TypeORM为您输入值,这将正确地转义攻击者可能添加的任何值,这样输入就没有可执行指令。

如果id是一种邪恶的东西,那么它就会变成这样的东西:

代码语言:javascript
复制
.where(`user.id = '123\' OR 1=1--'`) // note the backslash
// (actual query may vary based on different databases)

在这里,TypeORM通过转义攻击者插入的关闭引号,确保将id作为值处理。这使得获得用户提供的值并在查询中使用它们是安全的。

总之,永远不要将用户提供的值直接插入到查询中(实际上应该是所有值,只是为了安全起见),并且始终使用查询参数来确保值正确地升级。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69702580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档