请问大神,这种操作“骚不骚”?
发布于 2 年前 作者 nodejsnewer 4148 次浏览 来自 问答

看到一个关于数据库操作的,各位大神鉴定一下。 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你说的这个想法是和什么对比, 然后你觉得你这种做法的好处在什么地方?

mysql format

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

回到顶部