CNode

请问大神,这种操作“骚不骚”?

问答
Nnodejsnewer__legacy_5d6fd461a7474a231a588db0发布于7 年前最后回复7 年前14 回复6847 浏览0 收藏

看到一个关于数据库操作的,各位大神鉴定一下。 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)

W
waitingsong#1·7 年前

自造轮子初级拼字符串模式,有注入风险。 不如用query builder.

Y
yfsoftcom#2·7 年前

自己用没什么问题,给别人用会存在注入的风险;

比如 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 异常,反馈给业务层即可。

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

J
justjavac#3·7 年前

J
junfan#4·7 年前

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

N
nwljy#5·7 年前

mysql format

D
dengnan123#6·7 年前

typeorm

Z
zhuweiyou#7·7 年前

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

J
JsonMa#8·7 年前

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

J
JianmingXia#9·7 年前

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

O
ounana#10·7 年前

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

O
ounana#11·7 年前

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

D
dumplingbao#12·7 年前

还是推荐你用Sequelize框架吧

F
fantasticsoul#13·7 年前

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

Q
qiushijie#14·7 年前

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

参与回复
登录后即可参与回复。登录