EntityFramework Core 2.0执行原始查询如何防止SQL注入?

前言

接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助。

EntityFramework Core执行原始查询

在EntityFramework Core中执行原始查询我们借助FromSql来实现,如下:

using (var context = new EFCoreDbContext())

            {

                var orders = context.Orders

                    .FromSql("SELECT * FROM dbo.Orders")

                    .ToList();

            }

这是最简单且不带任何条件的查询方式,接下来我们看看有条件的查询我们应该如何查询,如下:

using (var context = new EFCoreDbContext())

            {

                var parameters = new SqlParameter[]

                {

                    new SqlParameter(){ ParameterName = "@p0", Value = 1, SqlDbType = System.Data.SqlDbType.Int }

                };


                var orders = context.Orders

                    .FromSql("SELECT * FROM dbo.Orders WHERE Id = @p0", parameters)

                    .ToList();

            }

除了以上利用参数化查询方式外,若我们还借助string.format或者C# 6.0出现的新特性字符串插值即美元符号$来查询最终生成的SQL是否仍然是以参数化查询呢,我们来看看。

using (var context = new EFCoreDbContext())

            {


                var orders = context.Orders

                    .FromSql($"SELECT * FROM dbo.Orders WHERE Id = {1}")

                    .ToList();

            }

由上我们看出即使利用字符串插值最终仍然翻译成参数化SQL。接下来我们再来看看字符串拼接查询方式。

using (var context = new EFCoreDbContext())

            {


                var searchString = "Jeffcky";


                var blogs = context.Blogs

                    .FromSql("SELECT Id, Name, CreatedTime, Url, ModifiedTime FROM dbo.Blogs " +

                    "WHERE Name = '" + searchString + "'")

                    .ToList();

            }

此时我们通过控制台打印能够看出最终生成的SQL语句是以字符串形式展示,在EntityFramework Core 2.0+上执行原始查询的APi即FromSql有重载方法,如下:

public static IQueryable<TEntity> FromSql<TEntity>([NotNullAttribute] this IQueryable<TEntity> source, [NotNullAttribute][NotParameterized] FormattableString sql) where TEntity : class;

我们利用上述FromSql重载方法传递字符串参数,同时在查询字符串中添加对数据库表操作,验证EF Core是否能防止SQL注入。

using (var context = new EFCoreDbContext())

            {


                var searchString = "Jeffcky; DROP TABLE dbo.Blogs;";


                var blogs = context.Blogs

                    .FromSql("SELECT Id, Name, Url, CreatedTime, ModifiedTime FROM dbo.Blogs "

                    + " WHERE Name = {0}", searchString)

                    .ToList();

            }

经过验证您会发现上述我们注入上述Blogs表的SQL语句,最终表将不会删除。我们看到当未利用重载方法进行字符串拼接,此时参数将以字符串形式展示,这种情况极易引起SQL注入问题。C# 6.0引入了字符串插值(String Interpolation),此特性能够允许C#表达式直接嵌入到字符串文本中,为运行时构建字符串提供了一个很好的方法。在EF Core 2.0特性中,对FromSql和ExecuteSqlCommand方法都添加了对插入字符串的特殊支持。此新特性的支持允许以安全的方式使用C#字符串插值。即防止在运行时动态构建SQL时可能发生SQL注入问题。

是不是到了这里就这样结束了呢?显然不是这样,接下来咱们再来看看另外一种情况,如下:

using (var context = new EFCoreDbContext())

            {


                var author = "Jeffcky Wang";

                var query = $"SELECT * FROM Blogs WHERE Name = {author}";

                var blogs = context.Blogs.FromSql(query).ToList();

            }

这样的语法错误显而易见,我们需要用单引号将变量包含起来才能避免语法错误,如下:

using (var context = new EFCoreDbContext())

            {


                var author = "Jeffcky Wang";

                var query = $"SELECT * FROM Blogs WHERE Name = '{author}'";

                var blogs = context.Blogs.FromSql(query).ToList();

            }

上述情况下,EF Core依然将执行明文字符串而不是作为变量查询并未以参数化执行。如果变量包含恶意字符串,那么EF Core将根本无法防范并保护SQL。因此,如果我们需要通过EF Core执行原始T-SQL,则应使用参数化SQL或利用FormatttableString,FromSql有两个重载,其一为通过FormatttableString可格式化字符串参数,其二为原始字符串且可传递查询参数。所以上述错误,我们可利用FormatttableString来执行,同时在利用FromSql方法查询过后我们仍可以继续进行查询,比如如下关联查询Posts表数据。

using (var context = new EFCoreDbContext())

            {


                var searchString = "Jeffcky Wang";


                FormattableString sql = $@"SELECT Id, Name, Url, CreatedTime, ModifiedTime FROM dbo.Blogs WHERE Name = {searchString}";


                var blogs = context.Blogs

                    .FromSql(sql)

                    .Include(d => d.Posts)

                    .ToList();

            }

通过【$@】并利用FormattableString重载或者传递参数化变量来防止SQL注入问题,希望您发现EF Core 2.0中这个新特性,同时不要忘记它也用来承担更大的责任,由于SQL注入攻击,不会让我们所写代码存在漏洞。

总结

本节我们详细讲解了EF Core 2.0中执行原始查询如何防止SQL注入问题,精简的内容,简单的讲解,希望能帮助到您。我们明天再会。

原文:https://www.cnblogs.com/CreateMyself/p/8481331.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

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

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

相关文章

EntityFramework Core 2.0自定义标量函数两种方式

前言上一节我们讲完原始查询如何防止SQL注入问题同时并提供了几种方式。本节我们继续来讲讲EF Core 2.0中的新特性自定义标量函数。自定义标量函数两种方式在EF Core 2.0中我们可以将方法映射到数据库中的标量函数&#xff0c;我们可在LINQ中调用此方法并会被正确翻译成SQL语句…

ASP.NET Core远程调试

关于ASP.NET Core远程调试的具体做法可参考微软文档——Remote Debug ASP.NET Core on a Remote IIS Computer in Visual Studio 2017&#xff0c;详细做法不再赘述&#xff0c;这里主要记录下自己的感受。体验Web Deploy这种发布方式可直接将代码打包发到指定服务器的指定站点…

修复.NET的HttpClient

早在2016年我们就报道过 &#xff0c;.NET的HttpClient存在一些问题。随着.NET Core 2.1中HttpClientFactory的引入&#xff0c;其中部分问题已经得到缓解。HttpClient的根本问题是&#xff0c;每次调用资源好像都应该在使用后立即释放。在现实中&#xff0c;那意味着每个目标服…

欢乐纪中A组赛【2019.8.20】

前言 Rank1???Rank1???Rank1??? 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111(J−3)WYC(J-3)WYC(J−3)WYC145145145100100100000454545212121(J−3)ZYC(J-3)ZYC(J−3)ZYC636363383838000252525353535(J−3)XXY(J-3)XXY(J−3)XXY45454500000045454…

Asp.Net Core2.0 基于QuartzNet任务管理系统

Quartz.NET官网地址&#xff1a;https://www.quartz-scheduler.net/Quartz.NET文档地址&#xff1a;https://www.quartz-scheduler.net/documentation/index.htmlQuartz.NET是一个开源的作业调度框架&#xff0c;是OpenSymphony 的 Quartz API的.NET移植&#xff0c;它用C#写成…

64位的Mac OS X也有Windows.Forms了

Mono长期以来一直为Linux、Mac和Windows提供Windows.Forms的纯C#实现。随着技术潮流的变化&#xff0c;Mono的Windows.Forms平台仍然没有得到很好的发展&#xff0c;还只是各种第三方库和应用程序的依赖&#xff0c;这使得它的重要性超过了那些基于WinForms的应用程序。Mono默认…

.Net 4.X 提前用上 .Net Core 的配置模式以及热重载配置

1. 前言在提倡微服务及 Serverless 越来越普及的当下&#xff0c;传统 .Net 应用的配置模式往往依赖于一个名为 web.config 的 XML 文件&#xff0c;在可扩展性和可读性与时代脱节了。当然&#xff0c;我不会怂恿一下子把所有应用迁移到 .Net Core 上&#xff0c;本文将在尽量不…

C# 枚举特性 FlagAttribute 的应用

写在前面枚举Enum 全称(Enumeration)&#xff0c;即一种由一组称为枚举数列表的命名常量组成的独特类型。可以看出枚举的出现是为了使我们可以在程序中方便的使用一些特定值的常量&#xff0c;一般的使用大家都比较熟悉&#xff0c;本文主要介绍枚举的特性 FlagAttribute。Flag…

重温.NET下Assembly的加载过程

最近在工作中牵涉到了.NET下的一个古老的问题&#xff1a;Assembly的加载过程。虽然网上有很多文章介绍这部分内容&#xff0c;很多文章也是很久以前就已经出现了&#xff0c;但阅读之后发现&#xff0c;并没能解决我的问题&#xff0c;有些点写的不是特别详细&#xff0c;让人…

看eShopOnContainers学一个EventBus

最近在看微软eShopOnContainers 项目&#xff0c;看到事件总线觉得不错&#xff0c;和大家分享一下看完此文你将获得什么&#xff1f;eShop中是如何设计事件总线的实现一个InMemory事件总线eShop中是没有InMemory实现的&#xff0c;这算是一个小小小的挑战发布订阅模式发布订阅…

创建基于MailKit和MimeKit的.NET基础邮件服务

邮件服务是一般的系统都会拥有和需要的功能&#xff0c;但是对于.NET项目来说&#xff0c;邮件服务的创建和使用会较为的麻烦。.NET对于邮件功能提供了System.Net.Mail用于创建邮件服务&#xff0c;该基础服务提供邮件的基础操作&#xff0c;并且使用也较为的简单。对于真正将该…

EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题

小故事在开始讲这篇文章之前&#xff0c;我们来说一个小故事&#xff0c;纯素虚构&#xff08;真实的存钱逻辑并非如此&#xff09;小刘发工资后&#xff0c;赶忙拿着现金去银行&#xff0c;准备把钱存起来&#xff0c;而与此同时&#xff0c;小刘的老婆刘嫂知道小刘的品性&…

牛客练习赛50-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1080#question 成绩 本届 升高二届 总结 以后还是不要写太多自己不擅长的写法&#xff0c;空间要多检查&#xff0c;不要像个傻逼一样啥都写错。 尽量不要为了省一点空间和时间写一些不舒服的东西&#xff0c;尽量在能…

物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线

正所谓天下大势&#xff0c;不跟风不行。你不跨平台&#xff0c;很low嘛。java说&#xff1a;你们能跨嘛&#xff0c;跨给我看看。C#说&#xff1a;不要强人所难嘛。java说&#xff1a;能部署在云上吗&#xff1f;docker&#xff1f;微服务&#xff1f;C#说&#xff1a;不要强人…

使用WebApiClient请求和管理Restful Api

前言本篇文章的内容是WebApiClient应用说明篇&#xff0c;如果你没有了解过WebApiClient&#xff0c;可以先阅读以下相关文章&#xff1a;WebApi client 的面向切面编程我来给.Net设计一款HttpClient.Net45下HttpClient的几个缺陷.net的retrofit--WebApiClient库.net的retrofit…

拥抱.NET Core系列:MemoryCache 缓存选项

MSCache项目MSCache 目前最新的正式版是 2.0.0&#xff0c;预览版是2.1.0&#xff0c;会与 .NETCore 2.1 一起发布。本篇用了2.0.0版本开源在 GitHub 上&#xff0c;仓库地址是&#xff1a;https://github.com/aspnet/CachingNuGet地址为&#xff1a;https://www.nuget.org/pac…

牛客练习赛51-记录

正题 比赛链接:https://ac.nowcoder.com/acm/contest/1083#question 成绩 可怜的zycT3zycT3zycT3被n0n0n0卡了半天&#xff0c;这里感谢一下排雷 总结 比赛状态较好&#xff0c;后面没有T6T6T6的题解 T1:abcT1:abcT1:abc 题目大意 给出一个字符串&#xff0c;求有多少个abc…

Metrics.net + influxdb + grafana 构建WebAPI的自动化监控和预警

前言这次主要分享通过Metrics.net influxdb grafana 构建WebAPI的自动化监控和预警方案。通过执行耗时&#xff0c;定位哪些接口拖累了服务的性能&#xff1b;通过请求频次&#xff0c;设置适当的限流和熔断机制&#xff0c;拦截非法或不合理的请求&#xff0c;保障服务的可用…

EF Core 2.1路线图:视图、GROUP BY和惰性加载

Entity Framework Core一直追随着初始Entity Framework的发展&#xff0c;并不断推陈出新。它首先推出的是对视图的支持&#xff0c;这听起来有些耸人听闻。在即将推出的EF Core 2.1之前&#xff0c;EF Core并未对数据库视图提供官方的支持&#xff0c;也不支持缺少主键的数据库…

计算机网络总结

一、计算机网络体系 &#xff08;1&#xff09;OSI分层 &#xff08;7层&#xff09; 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 &#xff08;2&#xff09;TCP/IP分层&#xff08;4层&#xff09; 网络接口层、 网际层、运输层、 应用层。 &#xff0…