同事都说有SQL注入风险,我非说没有

前言

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

正文

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

1.1 准备一个EF Core的项目

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

1.2 执行原生SQL

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

c7cdacdc54e47f564a59b7d63399ef75.png

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

16dcefbd677e050dac7257519f7a0bed.png

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

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

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

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

ab895c0113d269b786d80973f49b3865.png

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

749b1a9900fe243107b83cddbc3efc56.png

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

2. FormattableString有点料

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

44dcbab2b27ddc71982d9708e714f721.png

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

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

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

cb16970b64120c9351f858333a65133a.png
image-20220314232802714

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

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

总结

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

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

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

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

相关文章

​【v2.x OGE-example 第二节】 实体参数

【v2.x OGE-example 第二节】 实体参数1. 位置:Drawing_example --> SpriteParameters2. 类名:SpriteParameters(1)旋转精灵:sprite.setRotation(float pRotation) 设置旋转角度sprite.setRotationCenter(float pRotationCenterX, float p…

王道408数据结构——第七章 查找

文章目录一、基本概念二、顺序查找(线性查找)一般线性表的顺序查找有序表的顺序查找二、折半查找(二分查找)三、分块查找(索引顺序查找)四、B树五、B树六、散列表构造散列函数1. 直接定址法2. 除留取余法3.…

L1-004.计算摄氏温度

给定一个华氏温度F,本题要求编写程序,计算对应的摄氏温度C。计算公式:C 5*(F-32)/9。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出一个华氏温度。 输出格式: 在一行中按照格式“Celsius C”输出对…

C和指针之函数之可变参数

1、可变参数如何实现 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,这个头文件声明了一个类型va_list和三个宏,va_start、va_arg、va_end,一般我们声明一个类型为va_list的变量,和这个几个宏配合使用,访问参数的值。 2、实现一个函数多个参数求均值 比…

hadoop:could only be replicated to 0 nodes, instead of 1

在Hadoop的环境搭建过程中,常常会遇到类似这样的错误信息提示:“could only be replicated to 0 nodes, instead of 1 ”,产生这样的错误原因有多种,这里列举出以下四种常用的解决方法以供参考: 确保master&#xff08…

System.Type类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace ConsoleApplication1 {class Program{static void Main(string[] args){//System.Type类//获取指向任何给定的类型…

.NET6之MiniAPI(二十三):Refit

本篇是与上篇HttpClient有关联的,有前篇中,我们是直接使用HttpClient来发出请求的,所有的请求信息都是我们根据需要自己来填充的。那Refit是什么呢?它是一个让我们调用API就像调用一个对象的方法一样简单,是通过把http…

设置utf8编码问题

注意:乱码和request的具体实现类有关,现在已经查到的是RequestDispatcher.forward调用前使用的是org.apache.catalina.connector.RequestFacade类而RequestDispatcher.forward调用后使用的是org.apache.catalina.core.ApplicationHttpRequest&#xff0c…

王道408数据结构——第八章 排序

文章目录一、排序定义二、插入排序——直接插入排序1. 描述2. 代码和示例3. 空间效率4. 时间效率5. 稳定性6. 适用性三、插入排序——折半插入排序1. 描述2. 时间效率3. 稳定性四、插入排序——希尔排序(缩小增量排序)1. 描述2. 代码和示例3. 空间效率4.…

C和指针之函数之递归实现厄密多项式

1、厄密多项式介绍 /*Hermite Polynomials(厄密多项式)是这样定义的1 ,n < 0Hn(x) 2x ,n 12xHn-1(x) - 2(n-1)Hn-2(x) ,n > 2*/ 2、代码实现 #include <stdio.h>/*Hermite Polynomials(厄密多项式)是这样定义的…

设置状态栏和导航栏

// 初始化导航栏外观效果 - (void)initialNavigationBarStyle { // 1. 获取导航栏的外观代理对象 UINavigationBar *navBar [UINavigationBar appearance]; // 2. 设置背景图片 [navBar setBackgroundImage:[UIImage imageNamed:"NavBar64"] forBarMetrics:UIBarMet…

PHP 长文章分页函数

<?php function ff_page($content,$page) { global $expert_id; $PageLength 2000; //每页字数 $CLength strlen($content); $PageCount floor(($CLength / $PageLength)) 1; //计算页数 $PageArrayarray(); $Seperator array("n","r","。&q…

Avalonia跨平台入门第二十一篇之玩耍CEF

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题;今…

golang实现自定义驱动的Cache

近期在写 ActivedRouter项目的时候需求一个缓存模型&#xff0c;要求缓存模型支持不同驱动,例如:memory、file、redis、mysql&#xff0c;实现思路代码如下: cache.go文件,定义缓存对外接口 //ActivedRouter //Author:usher.yue //Amail:usher.yuegmail.com //TencentQQ:422366…

C和指针之函数之求最大公约数

1、求最大公约数 求公约数的规则如下/*** M % N 0 : N*gcd(M, N) * M % N R, R > 0 : gcd(N, R)*/ 2、代码实现 #include <stdio.h> /*** M % N 0 : N*gcd(M, N) * M % N R, R > 0 : gcd(N, R)*/int gcd(int …

关于c#调用c编译器

这个已经过了好久了具体的实现代码没得&#xff0c;但是大致思路自己整理了一下&#xff1a; 首先要调用c编译器&#xff0c;process.start&#xff08;&#xff09;&#xff1b; 之后需要自己来进行编译器对代码执行的命令。 转载于:https://www.cnblogs.com/why1115/p/481032…

【自定义控件】c#winform自定义控件实现标签控件

介绍首先我们设计这个控件的时候要明白控件是怎样交互的&#xff0c; 熟悉b站的小伙伴应该知道 &#xff0c;我们上传视频的时候会去选择标签 &#xff0c;我们输入标签文本 按下回车就代表该标签已经添加成功了&#xff0c;效果图如下&#xff01;控件拆分我们首先拆分一下该控…

ASP.NET 使用Ajax(转)

之前在Ajax初步理解中介绍了对Ajax的初步理解&#xff0c;本文将介绍在ASP.NET中如何方便使用Ajax&#xff0c;第一种当然是使用jQuery的ajax&#xff0c;功能强大而且操作简单方便&#xff0c;第二种是使用.NET封装好的ScriptManager。 $.ajax向普通页面发送get请求 这是最简单…

printk函数出现延迟输出的问题

错误描述 关于测试内核read接口 有如下代码片段&#xff1a; static ssize_t hello_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos){int ret 0;printk("[read task]count%ld", count);memcpy(readbuf, kerneldata, sizeof(kerneldata));…

个人博客(05)

昨天&#xff1a;设计并制作了添加图书信息的界面 今天&#xff1a;准备学习制作修改店铺的界面问题&#xff1a;页面消息的提醒转载于:https://www.cnblogs.com/yibao/p/6849805.html