用ORM框架就真的不会SQL注入了吗?
我最近在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自动转义了?有点纠结。
user.name = ${username}直接将用户输入插入到查询字符串中,这样是非常危险的。更好的写法是使用参数化查询,就像你已经尝试过的那样:
这种方式下,ORM框架会自动处理参数转义,从而避免SQL注入。虽然有时候看起来稍微复杂一点,但为了安全,这是值得的。别担心,习惯了之后会觉得挺自然的。