C# mysql where in 查询时参数化的问题

发布时间 2023-12-11 11:28:57作者: WmW

大家都知道写代码查询sql的时候是需要对传入的变量参数化的,否则就会有sql注入的风险

具体的原因是拼接传入的字符串会被当做sql语句进行解析,如果在传入的参数上做点手脚,就会导致sql的执行超出预期,具有很大的安全隐患,

比如当登陆时传入的sql语句是 select count(*) from table where id=9527 and pwd=xxx,如果传入的xxx=123 or 1=1就会直接饶过密码的判定直接登陆成功

而当使用参数化后实际上传入的sql语句是select count(*) from table where id=?id and pwd=?pwd,具体的数值9527和123 or 1=1则当成参数进行传递,不会影响sql语句的解析,就从根本上避免了sql注入

但是,sql中有一些特殊的语句,比如in,就没办法很方便直接的使用参数化,因为in的语句格式是这样的 select * from table where id in (value1,value2,value3,...)

于是我就研究了下,发现

1,如果写成 select * from table where id in (?ids),除非只有一个值(因为它把?ids当作value1了),否则不会返回有效数据

2,当然咱们也可以为每一个参数都参数化select * from table where id in (?id1,?id2,?id3,...),但是这样又很笨重,让人不爽

3,还可以select * from table where FIND_IN_SET(id,?ids),但是这样会进行全表扫描,肯定也不行

4,有个使用exec动态执行SQL的方法,但是我看见有人说这本质上还是sql拼接,并不能防止sql注入

5,以及使用临时表,具体是将ids作为一个参数传递进去,然后用sql代码分割后存到临时表中,最后联合表查询,因此这个太复杂了,不过当参数比较大的时候不失为一个好办法

6,不用ado了,那玩意太老了,直接用orm框架,比如Dapper,人家都给处理好了,性能也进行了优化,代码还简单

最终我选择了Dapper