Dapper防sql注入,同一条SQL支持多种数据库

前言

防SQL注入,常用的方案是使用Dapper执行SQL的参数化查询。例如:

using (IDbConnection conn = CreateConnection())
{string sqlCommandText = @"SELECT * FROM USERS WHERE ID=@ID";Users user = conn.Query<Users>(sqlCommandText, new { ID = 2 }).FirstOrDefault();Console.WriteLine(user.Name);
}

但是,不同数据库支持不同的sql参数格式,例如,ORACLE必须使用:ID,否则上述代码会报错:

225fd15571562f95c82d4f94ca980c6d.png

Pseudo-Positional Parameters

查看Dapper的源代码[1],发现有这样一段:

cmd.CommandText = pseudoPositional.Replace(cmd.CommandText, match =>
{string key = match.Groups[1].Value;if (!consumed.Add(key)){throw new InvalidOperationException("When passing parameters by position, each parameter can only be referenced once");}else if (parameters.TryGetValue(key, out IDbDataParameter param)){if (firstMatch){firstMatch = false;cmd.Parameters.Clear(); // only clear if we are pretty positive that we've found this pattern successfully}// if found, return the anonymous token "?"if (Settings.UseIncrementalPseudoPositionalParameterNames){param.ParameterName = (++index).ToString();}cmd.Parameters.Add(param);parameters.Remove(key);consumed.Add(key);return "?";}else{// otherwise, leave alone for simple debuggingreturn match.Value;}
});

通过查看Dapper教程[2],原来,这是实现被称为Pseudo-Positional Parameters(伪位置参数)的代码,作用是为了不支持命名参数的数据库提供者能够使用参数化SQL,例如OleDB:

//代码
var docs = conn.Query<Document>(@"select * from Documentswhere Region = ?region?and OwnerId in ?users?", new { region, users }).AsList();//SQL
select * from Documentswhere Region = ?and OwnerId in (?,?,?)

自定义Pseudo-Positional Parameters

依葫芦画瓢,我们可以实现自己的Pseudo-Positional Parameters,以便支持更多的数据提供者:

private static readonly Regex pseudoRegex = new Regex(@"\$([\p{L}_][\p{L}\p{N}_]*)\$", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled);public static string ReplacePseudoParameter(IDbConnection conn, string cmdText)
{return pseudoRegex.Replace(cmdText, match => {var key = match.Groups[1].Value;if (conn is OleDbConnection){return "?" + key + "?";}return (conn is OracleConnection ? ":" : "@") + key;});
}

使用方式是在参数名称两边加上$:

string sqlCommandText = @"SELECT * FROM USERS WHERE ID=$ID$";Users user = conn.Query<Users>(ReplacePseudoParameter(conn, sqlCommandText), new { ID = 2 }).FirstOrDefault();

结论

通过实现Pseudo-Positional Parameters功能,我们让Dapper防sql注入支持了多种数据库。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

参考资料

[1]

源代码: https://github.com/DapperLib/Dapper/blob/main/Dapper/SqlMapper.cs#L1783

[2]

Dapper教程: https://riptutorial.com/Dapper/example/13835/pseudo-positional-parameters--for-providers-that-don-t-support-named-parameters-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于css3的鼠标滑动按钮动画之CSS--续

2019独角兽企业重金招聘Python工程师标准>>> btn2 /*--按钮1--*/ .container1 {width:200px;display:block;margin:20px auto;position:relative;font-family:droid arabic kufi; } .con_down1 {display:block;cursor:pointer;background-color:#F6EB96;width:190px…

rabbitmq入门_Rabbit MQ 入门

Rabbit MQ是一个通用的消息中间件&#xff0c;支持AMQP&#xff0c;STOMP&#xff0c;MQTT等多种协议安装#在OSX下可以使用如下命令来安装 rabbitmqbrew install rabbitmq基本命令#ls -al ~/rabbitmq/3.7.14/sbin/total 1104drwxr-xr-x 10 jet admin 320 May 19 14:35 .d…

94年出生,她们如今都是985高校博士生导师!

全世界只有3.14 % 的人关注了爆炸吧知识鱼羊 萧萧 发自 凹非寺量子位 报道 | 公众号 QbitAI94年出生、博士研究方向与材料相关、目前都成了985重点高校的博士生导师。拥有相同经历的两个女生&#xff0c;概率有多大&#xff1f;就在今年&#xff0c;26岁的夏娟和李晟曼&#xf…

IBM沃森为存储系统开发人员带来的启发

前一段时间&#xff0c;IBM 沃森参加了CBS的益智节目《危险边缘》(Jeopardy)&#xff0c;这是他在全国观众面前首次亮相。确切地说&#xff0c;站在中央舞台选手答题台后面的IBM沃森实际上 是不断闪烁的虚拟头像。尽管如此&#xff0c;摆在沃森面前的答题按钮却是如假包换的&am…

01Prism WPF 入门实战 - 项目准备

1.概要这一系列将进行PrismWPF技术的实战讲解。实战项目内容选型为Email邮件收发的客户端&#xff08;WeMail&#xff09;&#xff0c;项目结构简单方便大家理解。相关技术&#xff1a;C#、WPF、Prism软件开发环境&#xff1a;VS2019 、 .NET5 、 windows11需掌握技能&#xf…

redis查看key的过期时间_面试官:你在Redis中设置过带过期时间的Key吗?

点击上方小伟后端笔记关注公众号每天阅读Java干货文章熟悉Redis的同学应该知道&#xff0c;Redis的每个Key都可以设置一个过期时间&#xff0c;当达到过期时间的时候&#xff0c;这个key就会被自动删除。在为key设置过期时间需要注意的事项1、 DEL/SET/GETSET等命令会清除过期时…

Hadoop学习系列之PageRank

昨晚上不想做其他的事&#xff0c;突然想起来好久都没更新博客了&#xff0c;shell也差不多学完了&#xff0c;只不过学习的时候都是只带着书出去了&#xff0c;改天总结总结。Hadoop么&#xff0c;黄宜华老师讲完了&#xff0c;自己也马马虎虎快学完了&#xff0c;也是没总结&…

您的屁股发热严重,请降温后使用。

▲ 点击查看不是坐在办公椅上的屁股都渴望自由&#xff0c;而是——最近天越来越热&#xff0c;屁股捂在椅子上&#xff0c;既不散热也不排汗&#xff0c;比戴口罩闷出痱子还难受&#xff0c;实在是坐不住。。最尴尬的就是站起来裤子时常黏在屁股缝里&#xff0c;难不成每次还要…

C# 正则表达式编写及验证方法

01—前言正则表达式应用很广泛&#xff0c;应该大多人都接触过了&#xff0c;这个语法规则既多又凌乱&#xff0c;每次用的时候都得重新看一遍语法&#xff0c;真的是让人头疼啊&#xff01;但是实际上我们并不要掌握很多的符号用法规则&#xff0c;牢记最常用的几个就能应付很…

Domino Web开发规则之二:DOMINO与开发相关的管理规范

1.服务器HTTP优化设置 调整活动线程数&#xff0c;HTTP服务器可以同时处理的请求数&#xff0c;而非连接数、会话数 单CPU服务器<64 多CPU服务器<80 并发运行Web代理 确保Web代理是线程安全的情况下&#xff0c;可以启用来提高性能。 服务器文档-> Internet协议 ->…

老师一定没有教!9个数学速算技巧!看到第1个就跪了!

全世界只有3.14 % 的人关注了寄语 与世界上的其他学科一样&#xff0c;数学也有自己的奇妙之处。由于各种各样的原因&#xff0c;老师没有将这些秘密告诉我们。下面就是一些有趣的数学技巧&#xff0c;看完后你也许会爱上这门学科。▼不管是几个1的平方&#xff0c;都是有规律…

愚蠢的领导才会用程序员祭天!!

“人非圣贤&#xff0c;孰能无过网络上频频流出程序员误删线上数据库&#xff0c;造成XX公司XX万损失的新闻&#xff0c;进而牵扯出“杀一个程序员祭天”的妙语&#xff0c;虽然杀一个程序员比杀一个进程要难很多&#xff0c;但也充满着讽刺的味道。程序员每天都往返于代码和服…

一般将来时语法课教案_速看,如何在考场写出一篇脱颖而出的教案

面试最重要的考试环节就是试讲&#xff0c;而想要进行一次优秀的表演&#xff08;试讲&#xff09;&#xff0c;则需要一个过硬的剧本&#xff08;教案&#xff09;&#xff0c;那我们如何写出一篇完美教案呢&#xff1f;今天上元教师就教给大家10分钟速写一份教案的方法&#…

你的感情路不顺么?

1 你的感情路不顺么&#xff1f;2 扎心了&#xff01;3 哈哈哈哈没毛病&#xff0c;差一点就信了&#xff01;4 这个反杀&#xff0c;满分&#xff01;5 一只认认真真学揉面的猫咪6 当你妈说你该出门运动下的时候。。 你点的每个赞&#xff0c;我都认真当成了喜欢

在zabbix中添加监控主机及Items

在http://ly36843.blog.51cto.com/3120113/1640289我们学习了zabbix的server和agent的编译安装方法 这里我们添加监控主机和监控一、添加一个主机填写监控主机的相关选项主要填写&#xff1a;主机名称&#xff0c;选择哪个组即可查看添加后的结果二、添加Items从上面的结果中我…

WPF实现聚光灯效果

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 前言效果仿照 CSS聚光灯效果 https://www.jianshu.com/p/6eae322e8e3801—效果预览更多效果请下载源码体验一、SpotLight.cs 代码如下using Syst…

托管PE文件

文/玄魂 中间语言 在.NET框架中&#xff0c;公共语言基础结构使用CLS来绑定不同的语言。通过要求不同的语言至少要实现CTS包含在CLS中的部分&#xff0c;公共语言基础结构允许不同的语言使用.NET框架。因此&#xff0c;在.NET框架中&#xff0c;所有的语言&#xff08;C#、VB.N…

带你见识不一样的世界,这5部豆瓣纪录片不可错过!

全世界只有3.14 % 的人关注了爆炸吧知识纪录片一直都是增长见识又带给你力量的东西&#xff0c;你可能忙于学业、生活、工作而不能行万里路&#xff0c;但至少你还可以看纪录片&#xff0c;从一方屏幕看到整个世界。今天就为大家整理了5部高分纪录片&#xff0c;文末附领取方式…

客户要求ASP.NET Core API返回特定格式,怎么办?(续)

前言上次&#xff0c;我们用客户就要求API的返回值属性名必须是PascalCase&#xff08;如UserName&#xff09;&#xff0c;但是这些API需要同时提供给内部系统使用&#xff0c;默认都是CamelCase&#xff08;如userName&#xff09;。其实&#xff0c;返回的都是JSON格式&…

网吧也用VDI?

升级360以后&#xff0c;挨个菜单都点了一遍&#xff0c;虽然没啥用处&#xff0c;清清垃圾&#xff0c;升级下软件&#xff0c;清理下启动项还是很不错滴。 清理启动项的时候就搞笑了&#xff0c;发现Citrix联机插件居然被360识别为网吧无盘工作站连接中心。ICA Client我想了好…