用ORM框架就真的不会SQL注入了吗?

迷人的晨旭 阅读 21

我最近在Vue项目里用TypeORM做后端数据查询,听说ORM能防SQL注入,但心里还是没底。比如下面这种写法安全吗?

<script setup>
import { getRepository } from 'typeorm';
import { User } from '@/entity/User';

const searchUser = async (username) => {
  const user = await getRepository(User)
    .createQueryBuilder('user')
    .where(user.name = ${username}) // 这样拼接会不会有风险?
    .getOne();
};
</script>

我试过改成参数化写法 .where("user.name = :name", { name: username }),确实更安心,但不确定第一种是不是已经被ORM自动转义了?有点纠结。

我来解答 赞 7 收藏
二维码
手机扫码查看
1 条解答
月怡~
月怡~ Lv1
用ORM框架确实可以大大减少SQL注入的风险,但并不是说完全不会有风险。在你的例子中,第一种写法是有问题的,存在SQL注入的风险。你提到的拼接方式 user.name = ${username} 直接将用户输入插入到查询字符串中,这样是非常危险的。

更好的写法是使用参数化查询,就像你已经尝试过的那样:

const searchUser = async (username) => {
const user = await getRepository(User)
.createQueryBuilder('user')
.where("user.name = :name", { name: username })
.getOne();
};


这种方式下,ORM框架会自动处理参数转义,从而避免SQL注入。虽然有时候看起来稍微复杂一点,但为了安全,这是值得的。别担心,习惯了之后会觉得挺自然的。
点赞
2026-03-24 17:00