10 月 23 - 25 日,QCon 上海站即将召开,现在购票,享9折优惠 了解详情
写点什么

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

发布了 391 篇内容, 共 151.8 次阅读, 收获喜欢 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# 7.1 先睹为快(第二部分)

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

  • .NET 异常设计原则

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

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

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

  • .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

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

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

    2021-04-28

  • F# 4.1 全面概览

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

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

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

    2021-08-18

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

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

  • C# 7 特性预览

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

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

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

    2021-11-12

  • 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)运行现有的代码就会造成严重的问题。

  • C# 8 小特性

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

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

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

    2021-08-09

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

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

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

    2021-05-06

发现更多内容

👊 【Spring技术原理】异步编程机制以及功能分析讲解

码界西柚

spring springboot 异步编程 8月日更

打开vscode好像打开了原神?vscode原神背景推荐,比博燃

CodeNongXiaoW

vscode vscode背景 原神

阿里资深架构师终于把微服务架构与实践第2版PDF分享出来了

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

关于飞书的告警通知,这里有个更好的办法

睿象云

运维 告警 运维平台 智能告警

计算机网络常用知识总结

Java 架构 后端 网络 计算机

图数据库在百度汉语中的应用

百度Geek说

数据库 后端

交易所智能炒币机器人开发||量化交易炒币机器人系统搭建

Geek_23f0c3

量化交易机器人系统开发 炒币机器人

如何基于分布式KV研发一款消息中间件

Java 编程 面试 后端 中间件

浅析智慧交通有哪些应用场景?

一只数据鲸鱼

数据可视化 智慧城市 智慧交通 城市交通

华为18级工程师三年心血终成趣谈网络协议文档(附大牛讲解)

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

Spring 配置加载

樊江。

Spring Framework

高可用 | Xenon 实现 MySQL 高可用架构 部署篇

RadonDB

MySQL 数据库 Xenon RadonDB

WorkPlus高端制造业移动数字化平台解决方案—华晨宝马

BeeWorks

即时通讯 移动办公平台 移动数字化底座 移动数字化基座 企业即时通讯平台

吐血整理!金九银十必问的1000道Java面试题及答案

Java 编程 程序员 架构 面试

通过明道云实现培训机构客户管理

明道云

阿里巴巴首发:Java核心框架指导手册1小时点击量破千万!

Java 编程 面试 程序人生 Alibaba

如何从内部保障企业数据安全?用IT运维审计系统可以吗?

行云管家

网络安全 数据安全 堡垒机 IT运维 运维审计

TCP协议认知篇

邱学喆

TCP协议 拥塞避免算法 慢启动算法 坚持定时器 TCP状图切换

量化交易炒币机器人系统搭建

量化系统19942438797

机器人 量化交易

技术分析| 实时音视频通讯中的流媒体是怎样传输的

anyRTC开发者

音视频 WebRTC 流媒体 流媒体传输

模块一作业

当归

cocoapods 的主模块如何判断子模块有没有被加载?

fuyoufang

ios swift 8月日更

来!看排名一年上升16位的ClickHouse,如何在京东落地实践

京东科技开发者

数据库 Clickhouse

如何对接口参数的描述进行集中管理

CodeNongXiaoW

大前端 测试 后端 接口工具

模块一作业

陈家豪

架构实战营

ipfs挖矿合法吗?ipfs挖矿靠谱吗?

区块链 IPFS ipfs挖矿 ipfs矿机 filecoin挖矿

关于C++中“不能返回对象引用”的思考

她的男人是程序员

CERT和CWE之间有什么联系?

鉴释

安全编码规范 cwe cert

WebRTC中的RefCountedObject解析

她的男人是程序员

微信业务架构 | 架构实战营

樊江。

架构实战营

云原生多云容器编排平台karmada上手指南

谐云

云原生 开源技术

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