写点什么

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

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

关注

评论

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

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

  • C# 7.1、7.2 特性追踪

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

  • C#的未来:不可变类

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

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

    2021-05-06

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

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

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

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

    2021-02-10

  • .NET 异常设计原则

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

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

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

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

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

    2021-08-09

  • C# 8 小特性

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

  • F# 4.1 全面概览

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

  • C# 7 特性预览

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

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

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

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

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

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

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

    2021-04-28

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

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

    2021-08-18

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

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

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

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

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

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

    2021-11-12

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

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

发现更多内容

Istio与Kubernetes:资源管理与协同解析

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟

5秒成为AI产业顾问、营销BI轻松搭建......一封来自星河社区5周年产业特辑的信

飞桨PaddlePaddle

人工智能 产业生态 星河社区

利用Prompt提升大模型微调性能

百度开发者中心

深度学习 大模型

如何使用区块链数据构建安全工具

Footprint Analytics

区块链 区块链技术 数据安全

华为云开源 | 线下meetup · 中国人民大学站顺利收官

华为云开源

区块链 微服务 时序数据库 AI大模型 前端组件库

低多边形3D建模动画风格纹理贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理

盛大发布!用友携手35家数智化领先企业推出《用户之友》专著

用友BIP

企业数智化

音视频开发常见问题(四):视频花屏和绿屏

ZEGO即构

实时音视频 直播技术 视频编解码 音视频开发 直播推流

音视频FAQ(三):音画不同步

ZEGO即构

CDN 直播 实时音视频 视频编解码 实时互动

深入解析LLaMA如何改进Transformer的底层结构

华为云开发者联盟

人工智能 华为云 大模型 华为云开发者联盟 LLM

使用函数计算,数禾如何实现高效的数据处理?

Serverless Devs

云计算 Serverless AIGC

基于Unity3D 低多边形地形模型纹理贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理

阿里云 ACR 制品中心 AI/大数据镜像专场上新推荐榜

阿里巴巴云原生

阿里云 容器 云原生

利用Prompt,高效调教大模型

百度开发者中心

人工智能 大模型 Prompt

低多边形3D建模石头材质纹理贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理

mac上好用的软件提取工具:Pacifist中文激活版

胖墩儿不胖y

Mac软件 软件提取工具 软件提前

利用大模型训练提升AI性能

百度开发者中心

人工智能 大模型 深度学习、

大模型训练中batch的作用

百度开发者中心

人工智能 大模型 深度学历

低多边形游戏风格3D模型纹理贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理

政采云基于 Dubbo 的混合云数据跨网实践

阿里巴巴云原生

阿里云 云原生 dubbo

低多边形建筑3D模型纹理贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理 多边形建模

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