前言

现在的项目,在操作数据库的时候,我都喜欢用ORM框架,其中EF是一直以来用的比较多的;EF 的封装的确让小伙伴一心注重业务逻辑就行了,不用过多的关注操作数据库的具体细节。但是在某些场景会选择执行SQL语句,比如一些复杂的插入或报表查询等,其实不管用什么方式执行SQL语句,防止SQL注入是必须的,所以就有了下面的讨论。

正文

1. 先来个EF Core执行SQL演示

1.1 准备一个EF Core的项目

关于EF Core在项目中的使用,之前分享了一篇很详细的文章,这里就不重复说了,详细内容请看这里《跟我一起学.NetCore之EF Core 实战入门,一看就会

1.2 执行原生SQL

前提,已经生成数据库,并且有对应的表(以下只是模拟演示,并不是真实场景):

在操作数据库时,执行如下SQL:

有很多小伙伴看到这时,应该也会怀疑这里会有SQL注入的风险,因为这里的SQL语句看上去就是一个拼接的字符串,只是用了插值运算符的形式,好像没什么特别。

1.2 打印日志查看真正执行的SQL

表面看上去的确会有风险,既然说没有,那就拿出证据证明,直接把EF执行过程的日志打印出来,看看真正执行的SQL语句是什么样子;

EF Core好像在5.0之后就提供了一个便捷的配置,可以方便的打印对应的SQL记录,所以先来开启日志打印功能:

开启日志之后,执行一下程序,看看执行的真正SQL是什么样的,控制台可以看到如下日志:

可以看到,SQL语句已经参数化了,所以是没有注入风险的。那到底是为什么呢?因为ExecuteSqlInterpolatedAsync中的SQL语句参数的类型是FormattableString,EF Core内部根据FormattableString结果,将对应的字符串生成参数化的SQL语句。

2. FormattableString有点料

为了看看FormattableString的作用,建一个简单的控制台程序,看看情况,如下:

可以看到,FormattableString中包含拼接的字符串和对应的参数,拿到这些结果,就可以构造成想要的结果了。

2.1 var使用时还是要稍微注意一下

之前一个项目,因为var的使用,线上出现一个bug,挨个看了代码感觉都没问题,而且开发和测试环境正常,但在线上就是有问题,最后通过模拟线上数据调试才搞定。大概使用如下:

之所以开发和测试环境没有问题,是没有模拟全线上环境,所以让这个bug漏掉了;对于开发来说,var用起来的确很是方便,但对于类似于上面的场景,使用具体的类型会避免一些不必要的Bug;

代码比较简单,就不提交了~~~

总结

在开发过程中,稍微一个小细节的改动,可能效果就不一样;同样,一个小细节的忽视,就可能带来一个很不好排查的Bug,所以小伙伴开发过程中,一定要注意哦!!!

关注“Code综艺圈”,和我一起学习吧。

同事都说有SQL注入风险,我非说没有的更多相关文章

  1. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  2. 浅谈SQL注入风险 - 一个Login拿下Server(转)

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  3. 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  4. MySQL防范SQL注入风险

    MySQL防范SQL注入风险 0.导读 在MySQL里,如何识别并且避免发生SQL注入风险 1.关于SQL注入 互联网很危险,信息及数据安全很重要,SQL注入是最常见的入侵手段之一,其技术门槛低.成本 ...

  5. sql 注入风险

    目录 sql 注入风险 什么是sql注入呢? 查看sql注入风险 如何避免 sql 注入风险 pymysql 简单规避注入风险示列 sql 注入风险 什么是sql注入呢? 参考百度 查看sql注入风险 ...

  6. JDBC之Statement 接口的测试(存在sql注入风险)

    实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...

  7. Statement 接口的应用(存在sql语句的注入风险)

    实现简单的登录功能 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; impo ...

  8. SQL注入技术

    TalkTalk的信息泄漏事件导致约15万人的敏感信息被暴露,涉嫌造成这一事件的其中一名黑客使用的并不是很新的技术.事实上,该技术的「年纪」比这名15岁黑客还要大两岁. [译注:TalkTalk是英国 ...

  9. SQL 注入,永不过时的黑客技术

    SQL 注入,永不过时的黑客技术 TalkTalk的信息泄漏事件导致约15万人的敏感信息被暴露,涉嫌造成这一事件的其中一名黑客使用的并不是很新的技术.事实上,该技术的「年纪」比这名15岁黑客还要大两岁 ...

随机推荐

  1. Idea中新建package包,却变成了Directory

    问题描述 今天在IdeaJava工程src下新建了一个名字叫包implements的包,右键在里面新建类时,却发现根本就没有Class这个选项,然后发现implements这个包的图标也和其他包的图标 ...

  2. 直播媒体流red5

    第一步下载 安装setup-Red5-1.0.1-java6.exe 安装教程网上有很多 显示如下页面说明安装成功 第二步 下载oflaDemo的 解压放在 第三步  打开 然后 ok了 注意:下面的 ...

  3. vue中的钩子函数

    什么是vue的钩子函数? Vue 实例在被创建时,会经过一系列的初始化过程,初始化过程中会运行一些函数,叫做生命周期钩子函数,通过运用钩子函数,用户在可以在Vue实例初始化的不同阶段添加自己的代码,以 ...

  4. 第11、12章等待方法和alter框处理

    11.等待方法 time sleep webdriver implicitly_wait() 设置浏览器等待时间 WebDriverWait 等待条件满足或超时后退出   12.alter对话框处理 ...

  5. like使用索引如何避免失效

    1 准备数据 1.1 建表 DROP TABLE IF EXISTS staff; CREATE TABLE IF NOT EXISTS staff ( id INT PRIMARY KEY auto ...

  6. Pytorch技法:继承Subset类完成自定义数据拆分

    我们在<torch.utils.data.DataLoader与迭代器转换>中介绍了如何使用Pytorch内置的数据集进行论文实现,如torchvision.datasets.下面是加载内 ...

  7. Solution -「ARC 058C」「AT 1975」Iroha and Haiku

    \(\mathcal{Description}\)   Link.   称一个正整数序列为"俳(pái)句",当且仅当序列中存在连续一段和为 \(x\),紧接着连续一段和为 \(y ...

  8. figlet 一个在linux生成字符串图案的玩具

    figlet官网 figlet官方字体库 figlet字体样例 安装方法 centos/redhat/fedora 发行版 yum install -y figlet debian/ubuntu 发行 ...

  9. springBoot-启动原理

    注:SpringBoot版本 2.6.2 SpringBoot的入口是从SpringApplication.run()传入我们的主启动类开始 @SpringBootApplication public ...

  10. 《SelfClass》——Docker

    <SelfClass>--Docker 根据我的个人计划,我需要先了解一下Docker,并且能够使用起来. 目的:在我Mac上搭建一个Docker,在Docker上搭建一个MySQL数据库 ...