看到一个关于数据库操作的,各位大神鉴定一下。 1,首先是file 定义。 File Customer, 有几个fields, 比如,CustNo, CustName, CustAddr, CustPhone,
2,然后,定义一个model,
Class Customer {
....
async getData(custNo, Fields){
let SQL = "SELECT " + Fields +" FROM Customer where CustNo ='" + custNo +"'";
return await Dbpool.RunSQLQuery(SQL);
...
}
}
3,使用 model,
let customer = new Customer();
let customerName = await customer.getData(CustNo, "CustName");
...
这样我就可以想访问哪个fields就访问哪个,多方便啊。 有大神来指点一下优缺点吗?请无视各种语法错误,主要是这个思路好不好?
回复 (14)
自造轮子初级拼字符串模式,有注入风险。 不如用query builder.
自己用没什么问题,给别人用会存在注入的风险;
比如 Fields 是 : 1 from dual; delete from Customer; select *;
那么生成出来之后会变成: SELECT 1 from dual; TRUNCATE Order User; select * FROM Customer where CustNo ='${custNo}';
这就被sql注入了,你的 Order, User 表中的数据就没了。
这就是一中非常简单的注入方式,可有很多办法来解决,比如:
- 通过字符串的匹配把
TRUNCATE,DELETE等关键字做过滤,出现这些关键字就 throw 异常,反馈给业务层即可。
自己造轮子挺好的,思考和实现过程中会遇到问题,带着问题去看看别人的轮子还能学到更多。
lz你说的这个想法是和什么对比, 然后你觉得你这种做法的好处在什么地方?
mysql format
typeorm
有 sql 注入风险。 要么用 orm 要么 query builder。
直接orm框架啊,不推荐直接操作数据库
除了 SQL 注入之外,复杂 SQL 场景的应用也是一个潜在问题,建议先用一些 ORM 试试
你应该判定 fields 必须为CustNo, CustName, CustAddr, CustPhone 中的一个,这样就没有注入风险了
字符串字面量联合类型,了解一哈
还是推荐你用Sequelize框架吧
确实很骚...... 占位符了解下?
楼主看一下我这个typeorm-query,这样来拿字段Customer: {CustNo, CustName, CustAddr, CustPhone},不止单表多表也可以,站在typeorm巨人的肩膀上做的查询dsl