C# mysql where in 查询时参数化的问题
大家都知道写代码查询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
public List<T> GetListInIds(IList<string> ids) { return DapperDAL.Query<T>("select * from table where id in ?ids;", new { ids }); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~