请问大神,这种操作“骚不骚”?
发布于 15 天前 作者 nodejsnewer 1401 次浏览 最后一次编辑是 12 天前 来自 问答

看到一个关于数据库操作的,各位大神鉴定一下。 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注入了,你的 OrderUser 表中的数据就没了。


这就是一中非常简单的注入方式,可有很多办法来解决,比如:

  • 通过字符串的匹配把 TRUNCATEDELETE 等关键字做过滤,出现这些关键字就 throw 异常,反馈给业务层即可。

自己造轮子挺好的,思考和实现过程中会遇到问题,带着问题去看看别人的轮子还能学到更多。

有 sql 注入风险。 要么用 orm 要么 query builder。

直接orm框架啊,不推荐直接操作数据库

除了 SQL 注入之外,复杂 SQL 场景的应用也是一个潜在问题,建议先用一些 ORM 试试

你应该判定 fields 必须为CustNo, CustName, CustAddr, CustPhone 中的一个,这样就没有注入风险了

字符串字面量联合类型,了解一哈

还是推荐你用Sequelize框架吧

确实很骚… 占位符了解下?

lz你说的这个想法是和什么对比, 然后你觉得你这种做法的好处在什么地方?

楼主看一下我这个typeorm-query,这样来拿字段Customer: {CustNo, CustName, CustAddr, CustPhone},不止单表多表也可以,站在typeorm巨人的肩膀上做的查询dsl

回到顶部