写点什么

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:002472
用户头像

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

关注

评论

发布
暂无评论
  • RDD 和 DataFrame:既生瑜,何生亮?

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

    2021-04-28

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

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

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

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

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

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

    2021-08-09

  • C# 7 编程模式与实践

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

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

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

    2021-11-12

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

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

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

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

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

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

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

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

    2021-02-10

  • .NET 异常设计原则

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

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

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

  • C# 7 特性预览

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

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

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

  • C# 8 小特性

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

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

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

    2021-08-18

  • F# 4.1 全面概览

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

  • C#的未来:不可变类

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

  • C# 7.1、7.2 特性追踪

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

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

    2021-05-06

发现更多内容

mosquitto支持websocket搭建记录

风翱

4月日更 web socket mosquitto

GraphX图计算组件最短路算法实战

小舰

4月日更

阿里内部热捧“Spring全线笔记”,不止是全家桶,太完整了

Java架构追梦

Java spring 源码 架构 微服务

不想搞Java了,4年经验去面试10分钟结束,现在Java面试为何这么难

Java 编程 程序员 面试 计算机

Golang Slice 数组和切片

escray

学习 极客时间 Go 语言 4月日更

车行易携手睿象云:告警管理体系全升级

睿象云

浅谈 MySQL 集群高可用架构

民工哥

MySQL MySQL 高可用 集群 linux运维

智慧城市现状调研

程序员架构进阶

华为 智慧城市 28天写作 4月日更

专访中寰卫星导航项目管理部负责人卜钢:如何演绎人生之路

打工人!

采访 调查采访能力考核

建议收藏!看完全面掌握,最详细的Redis总结(2021最新版)

民工哥

运维 后端 redis cluster NoSQL数据库

流计算:流式处理框架

正向成长

流式计算框架

怎么拥有个人磁力

帅安技术

IP 个人磁力 KOL 思想 吸引力法则

接口的幂等性怎么设计?

xcbeyond

设计 幂等性 4月日更

const与指针交集的那些事

Bob

c++ 编程语言 4月日更

使用JavaScript解析XML文件

空城机

JavaScript xml 大前端 递归 4月日更

Markdown 文档可折叠化展示

耳东@Erdong

4月日更

聊聊十种常见的软件架构模式

架构精进之路

4月日更

从被踢出局到5个30K+的offer,一路坎坷走来,沉下心,何尝不是前程万里

北游学Java

Java 数据库 分布式 微服务

json基础学习

ベ布小禅

4月日更

我常用的两个外国应用

彭宏豪95

产品 产品经理 工具 社交 Slack

安于现状的人,不值得同情

小天同学

深度思考 个人感悟 4月日更 突破现状

Python OpenCV 图像2D直方图,取经之旅第 27 天

梦想橡皮擦

Python OpenCV 4月日更

Java 常见 bean mapper 的性能及原理分析

Java小咖秀

Java bean Copier

不愧是阿里内部“Spring Cloud Alibaba学习笔记”这细节讲解,神了!

Java架构追梦

Java 阿里巴巴 架构 微服务 SpringCloud

隐私安全的城池营垒,能成为手机品牌高端化的赛点吗?

脑极体

Vue3、Vuex4、Ant Design2的实战项目开发管理系统

devpoint

vite Vue3 and design of vue

Java-技术专题-Stream.foreach和foreach

码界西柚

Java stream collection

1分钟搞定 Nginx 版本的平滑升级与回滚

民工哥

nginx 后端 linux运维

学会这15点,让你分分钟拿下Redis数据库

民工哥

后端 linux运维 redis cluster

计算机原理学习笔记 Day6

穿过生命散发芬芳

计算机原理 4月日更

LeetCode题解:17. 电话号码的字母组合,回溯,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

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