AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

Entity Framework 中的字符串插值引发担忧

  • 2017-09-21
  • 本文字数:910 字

    阅读完需:约 3 分钟

将内插字符串(Interpolated Strings)自动地转化为参数化 SQL 语句,这是 Entity Framework Core 2 提供的一个新特性。虽然该特性从设计上是为了避免出现 SQL 语句编写上的问题,但是有人担心这会导致更多的 SQL 注入攻击。

下面给出一个正确工作的字符串插值例子:

复制代码
var city = "Redmond";
context.Customers.FromSql($"SELECT * FROM Customers WHERE City = {city}");
SELECT * FROM Customers WHERE City = @p0a

我们对此稍作更改,下面的代码就不工作了:

复制代码
var city = "Redmond";
var sql = $"SELECT * FROM Customers WHERE City = {city}";
context.Customers.FromSql(sql);
SELECT * FROM Customers WHERE City = Redmond

这是因为后者将表达式存储在本地变量中,这一简单操作完全地更改了代码的行为。

为推本溯源,我们需要理解 C#中“$"”表达式的事实真实行为。乍一看,表达式仅是将内插字符串转换为一个正常的String.Format调用。但事实上,它还做了一些额外的工作。

本质上,“$"”表达式是 FormattableString 的一个子类。对象中包含字符串格式化表达式以及所有需要填充的值。对象在传递给 EF Core 的 FromSql(FormattableString) 方法后,会执行必要的替换,并得到了参数化的 SQL 表达式。

问题在于,编译器并不愿意直接操作 FormattableString。除非我们将“$"”表达式直接指定为一个 FormattableString 类型的变量或参数,否则表达式将立刻被转换为字符串。在正常情况下,这是一种良性更改,因为我们希望最终能给出字符串格式。

不幸的是,在 EF Core 中,会丢失全部有意义的信息,Entity Framework 使用这些信息对 SQL 语句参数化。此外一旦发生错误,EF Core 并不会给出任何编译器告警或是其它的指示信息。因此如果开发人员试图“清理”代码,这类软件缺陷就很容易混入到应用中。

如要深入了解 EF Core 使用字符串插值可导致 SQL 注入攻击这一问题,可从 GitHub 下载 Nick Craver 给出的“EFCoreInjectionSample”例子代码,也可以看一下他发布在 ASP.NET Monster 上的一个幻灯片,名为“ EF Core 2.0 中的 SQL 注入攻击”(SQL Injection attacks in Entity Framework Core 2.0)。

查看英文原文: String Interpolation in Entity Framework Raises Concerns

2017-09-21 19:002215
用户头像

发布了 391 篇内容, 共 147.9 次阅读, 收获喜欢 257 次。

关注

评论

发布
暂无评论
  • C# 7 编程模式与实践

    C# 7是一个重大更新,其中提供了很多有意思的新功能。虽然已有大量的文章介绍这些功能可以做什么,但是鲜有文章介绍应如何使用这些功能。本文将过一遍《.NET设计规范:.NET约定惯用法与模式》一书中给出的指导原则,力图从C# 7的新特性中收获更多。

  • 14|常量:Go 在“常量”设计上的创新有哪些?

    Go中的常量,支持无类型常量、隐式自动转型,以及实现枚举。

    2021-11-12

  • 微软提议在 C# 7 中为引用增加选项类型

    微软C#语言的项目经理Mads Torgersen,最近提议在C# 7中引入可为选项类型(option types)的引用类型。加入选项类型能让C#语言变得更安全,正如Torgersen所说,在C#里,因为任一引用类型都能引用一个空值,从而导致了空引用异常的泛滥成灾,而使用选项类型能减少空引用异常的产生。

  • .NET 4.6 的 RyuJIT 编译器中发现严重的 Bug

    来自Stack Exchange的开发者Nick Craver与Marc Gravell提交了一个严重的bug的相关报告,它可能会影响到安装了.NET 4.6的用户与开发者。一旦安装了.NET 4.6之后,新的RyuJIT编译器将默认设置为启动状态,它在用户的程序执行时可能会产生一个严重的问题。

  • C#的未来:不可变类

    本文是C#的未来系列文章的最后一篇了,这次我们将讨论第159号提案,它建议在编译器中加入对不可变类的支持。

  • C# 7.1 先睹为快(第一部分)

    自2003年以来,Microsoft首次考虑对C#使用带小数点后位数的版本。当前暂定下一个版本是C# 7.1,其中有望包括:异步Main函数、默认表达式、推导元组名和使用泛型的模式匹配等。

  • .NET 4.6 的 RyuJIT 编译器中又发现两个严重的 Bug

    在.NET 4.6的RyuJIT编译器中又发现了两个严重的bug,要重现这些错误无需重新编译代码,只要在RyuJIT中(.NET 4.6自带并默认启用RyuJIT)运行现有的代码就会造成严重的问题。

  • JavaScript 这几种内存泄露写法,你要小心了

    讲师介绍: 潘松奎,贝壳找房资深前端开发工程师。目前在贝壳原石组主要负责开发提效的相关开发。大学主修通信工程专业,擅长JavaScript、Node.js,有5年的前端开发经验。 问题背景: 随着前端工程的复杂度不断提升,交互的流畅性和系统稳定性对前端提出了更大的挑战。而内存泄漏在开发的过程中难以发现,大部分内存泄露问题的发现都是在生产环境阶段发现的。在通常情况下,内存泄漏并不会影响应用的功能,直到应用运行时间足够长,请求或者操作足够多的话,问题才会暴露,同时也会带来一些损失。那为什么会出现内存泄漏呢?以及前端 JavaScript 开发过程中会有哪些写法会导致内存泄漏呢?本文将给你做详细分析。 内容看点: 从内存的生命周期来看内存泄露出现的环节 从垃圾回收机制来看发生内存泄露的深层原因 引起内存泄漏的常见写法及避免方式

    2021-02-10

  • Rust 异步编程之 Mio 代码实践(二)

    2021-05-06

  • C#将引入可空的引用类型

    是的,标题没错。C#其中一份新提案假定,所有的引用类型在默认情况下都是不可空的。在新语法下,你需要显式地标明一个引用变量是可空的,就像对值类型所做的那样。

  • C# 7.1、7.2 特性追踪

    早在8月份,C# 7.1就随Visual Studio 15.3悄悄地发布了,但准备并不充分。在这篇报道中,我们看一个微妙的编译器缺陷,并看下即将发布的C# 7.2准备好了哪些特性。

  • RDD 和 DataFrame:既生瑜,何生亮?

    为什么有了RDD,我们还用要DataFrame?DataFrame相比RDD到底有哪些优势?

    2021-04-28

  • C# 7.1 先睹为快(第二部分)

    昨天我们介绍了异步Main函数(Async Main)和默认表达式(Default Expressions)。我们的C# 7.1之旅将继续,今天要介绍的特性在建议中称为推导元组名(Infer Tuple Names)和使用泛型的模式匹配(Pattern-matching with Generics)。

  • .NET 异常设计原则

    异常是使用.NET时必然会遇到的问题,但是,有太多的开发人员没有从API设计的角度考虑这个问题。在大部分工作中,他们自始至终都知道需要捕获什么异常以及哪些异常需要写入全局日志。如果你设计了可以让你正确使用异常的API,则可以显著减少修复缺陷的时间。

  • 05|函数实现:是时候让我们的语言支持函数和返回值了

    一节课带你升级编程语言的函数功能!

    2021-08-18

  • C# 8 小特性

    对于C# 8,有吸引了大多数注意力的重大特性,如默认接口方法和可空引用,也有许多小特性被考虑在内。本文将介绍几例可能加入C#未来版本的小特性。

  • 微软在 C# 8 中引入预览版可空引用类型

    微软已经为开发者提供了预览版的可空引用类型(Nullable Reference Type),想尝鲜的开发者可以尝试这个新特性,并提供反馈。

  • 01|实现一门超简单的语言最快需要多久?

    实现一门超简单的语言最快需要多久?一节课的时间,够吗?

    2021-08-09

  • C# 7 特性预览

    在过去一年间,我们为读者展示了多个已考虑加入C# 7中的特性。在最近发布的Visual Studio 15预览版中,微软决定为用户展现这些特性,使其成为C# 7最终发布的一部分。

  • F# 4.1 全面概览

    F# 4.1在性能、互操作性和便利性等方面上新增了一些特性。本文从性能角度介绍了如何使用结构体元组、记录和差别联合,概述了有助于实现F#与其它语言库互操作的Caller Information、可选参数、反射等特性,并介绍了一些为方便开发人员操作的特性及API的更改等。本文对F# 4.1给出了一个全面概览。

发现更多内容

云数据库TiDB免费试用初体验

TiDB 社区干货传送门

社区活动 6.x 实践

云数据库TiDB-试用

TiDB 社区干货传送门

管理与运维 版本测评 安装 & 部署

云数据库 TiDB 初使用

TiDB 社区干货传送门

版本测评 安装 & 部署 性能测评 扩/缩容 6.x 实践

中冶赛迪:基于鲲鹏DevKit开发智慧城市基础设施管理平台,性能提升47%

极客天地

Wallys/QSDK IPQ6010/wifi mesh function supports qcn9074/qcn6024 M.2 E Key Interface

Cindy-wallys

IPQ6010 ipq6018 IPQ6000

英方软件加入龙蜥社区,联手夯实数字基础设施坚实底座

OpenAnolis小助手

开源 数据复制 英方软件 龙蜥社区 CLA

测试角色在项目各阶段的项目管理tips

京东科技开发者

项目管理 测试 测试 单元测试 企业号 2 月 PK 榜

TiDB x Aliyun 免费试用,竟还有这般福利?

TiDB 社区干货传送门

社区活动 版本测评 6.x 实践

不要 ChatGPT,我们要你!2023 涛思招聘季重磅来袭~

TDengine

数据库 tdengine 时序数据库

在字节跳动,造赛博古籍

字节跳动技术范儿

后端 nlp 搜索 OCR 多模态

在流媒体时代,如何看待音乐版权?

曲多多(嗨翻屋)版权音乐

知识产权 音乐 版权

华为云CodeArts Artifact,5大特性守护制品质量与安全

华为云开发者联盟

云计算 开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

云数据库 TiDB 入门级别的体验

TiDB 社区干货传送门

6.x 实践

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

股市老人

平时报表很复杂吗?瓴羊Quick BI智能报表轻松解决!

夏日星河

DevEco Studio端云协同开发之云函数

白晓明

HarmonyOS 端云协同 云函数

颜色的认识与使用(大屏颜色/仪表板报告设计)

Data 探险实验室

大屏配色 颜色 可视化颜色 配色搭配

数据库审计有什么用?过等保三级需要吗?

行云管家

数据库 等保 等级保护 数据库审计

云小课|MRS基础原理之Hue组件介绍

华为云开发者联盟

大数据 华为云 企业号 2 月 PK 榜 华为云开发者联盟

C++中const和constexpr关键字解析:常量、函数和指针

小万哥

程序员 后端 开发 C/C++ const

LeetCode题解:2357. 使数组中所有元素都等于零,哈希表,详细注释

Lee Chen

JavaScript 算法 LeetCode 哈希表

多模并起,万向融合 | 2023年2月《中国数据库行业分析报告》精彩抢先看

墨天轮

数据库 HTAP MatrixDB 多模数据库 超融合数据库

即时通讯技即时通讯技术文集(第8期):移动端弱网优化系列 [共14篇]

JackJiang

ZBC通证月内已翻倍,Nautilus Chain 上线前夕的“开门红”

鳄鱼视界

这周末,StarRocks 邀请开发者们一起来上海 GAIDC 开源集市,各种任务等你来挑战!

StarRocks

数据库

Fine BI、Smart BI怎么办,瓴羊Quick BI已经可以提供移动端自助分析整体解决方案!

对不起该用户已成仙‖

LeetCode题解:2357. 使数组中所有元素都等于零,排序,详细注释

Lee Chen

JavaScript 算法 LeetCode

深入浅出玩转监控宝|网站监控之创建网站监控任务

云智慧AIOps社区

监控宝 监控工具 监控指标 #监控 网站监控

爆肝!《Java权威面试指南(阿里版)》,冲击“金三银四”有望了

程序知音

Java java面试 java架构 后端技术 Java面试八股文

行云管家属于高新企业吗?安全吗?

行云管家

云计算 网络安全 高新企业 云管理 高新技术

Entity Framework中的字符串插值引发担忧_.NET_Jonathan Allen_InfoQ精选文章