我一直在使用backticks编写查询
const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where(`user.id = '${id}'`)
.getOne();但是在typeorm文档中,示例是用冒号编写的。
const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();所以我想知道用后排和冒号是否有什么区别。
任何见解都将不胜感激。
谢谢。
发布于 2021-10-25 06:11:37
不使用字符串内插将值插入SQL语句中。
很抱歉大喊大叫,但这很重要。
当你这样做时:
.where(`user.id = '${id}'`)然后首先创建字符串,然后将其传递给where()函数。这意味着,如果id是123,那么它与以下内容相同:
.where(`user.id = '123'`)这似乎很好。但如果id是123' OR 1=1--'呢
你现在明白了:
.where(`user.id = '123' OR 1=1--'`) // Now returns ALL users!这叫做SQL注入,这是一个很大的安全问题。非常糟糕。攻击者可以更改您的查询,并访问他们不应该访问的数据,或者更改记录以给自己提供管理权限,或者其他各种非常糟糕的事情。它非常接近于让每个人都能对您的数据库进行完整的读写访问。
这就引出了这一点:
.where("user.id = :id", { id: 1 })为了解决这一问题,您要求TypeORM为您输入值,这将正确地转义攻击者可能添加的任何值,这样输入就没有可执行指令。
如果id是一种邪恶的东西,那么它就会变成这样的东西:
.where(`user.id = '123\' OR 1=1--'`) // note the backslash
// (actual query may vary based on different databases)在这里,TypeORM通过转义攻击者插入的关闭引号,确保将id作为值处理。这使得获得用户提供的值并在查询中使用它们是安全的。
总之,永远不要将用户提供的值直接插入到查询中(实际上应该是所有值,只是为了安全起见),并且始终使用查询参数来确保值正确地升级。
https://stackoverflow.com/questions/69702580
复制相似问题