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

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

关注

评论

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

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

    2021-08-18

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

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

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

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

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

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

  • C# 7.1、7.2 特性追踪

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

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

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

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

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

  • C# 8 小特性

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

  • .NET 异常设计原则

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

  • C#的未来:不可变类

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

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

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

    2021-04-28

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

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

    2021-02-10

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

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

    2021-08-09

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

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

  • F# 4.1 全面概览

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

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

    2021-05-06

  • C# 7 编程模式与实践

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

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

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

  • C# 7 特性预览

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

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

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

    2021-11-12

发现更多内容

即时通讯技术文集(第11期):IM通信格式的选型及Protobuf专题 [共16篇]

JackJiang

网络编程 即时通讯 IM

数仓安全测试之SSRF漏洞

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

OceanBase 信息技术服务管理体系通过 ISO20000 认证和 ITSS 认证

OceanBase 数据库

数据库 oceanbase

Java基础_面试题

三十而立

mysqldump 详解

GreatSQL

MySQL greatsql greatsql社区

避免使用CSS @import 影响页面加载速度

南城FE

CSS css3 前端

ShareSDK Android SDK API

MobTech袤博科技

ShareSDK Android端权限说明

MobTech袤博科技

MobTech 秒验|本机号码一键登录

MobTech袤博科技

软件工程高效学 | 实践工具:Microsoft Office Visio

TiAmo

开发工具 Visio绘图注释工具

四个上海等保小知识汇总-行云管家

行云管家

等保 等级保护 等保测评 上海

IPv6是什么意思?哪款堡垒机支持IPv6资产纳管?

行云管家

资产管理 堡垒机 ipv6

钉钉协作Tab前端进化之路

阿里技术

前端 钉钉

履约核心引擎低代码化原理与实践

京东科技开发者

低代码 规则引擎 企业号 3 月 PK 榜 履约中心

机器学习实战系列[一]:工业蒸汽量预测(最新版本上篇)含数据探索特征工程等

汀丶人工智能

数据挖掘 机器学习 决策树 LightGBM

Github上获赞59.8K的面试神技—1658页《Java面试突击核心讲》

三十而立

一种自平衡解决数据倾斜的分表方法

京东科技开发者

数据倾斜 分布分表 企业号 3 月 PK 榜 B 端产品 数据分表

Swift之struct二进制大小分析

京东科技开发者

swift App struct 移动开发 企业号 3 月 PK 榜

百度内容理解推理服务FaaS实战——Punica系统

百度Geek说

云原生 Faas 成本优化 企业号 3 月 PK 榜 AI推理

Java开发新手必读:PO、VO、DAO、BO、DTO、POJO,区别在哪儿?

Java你猿哥

Java 后端 ssm Java工程师 Java基础知识点

无人机巡检场景小目标检测与量化加速部署方案详解

飞桨PaddlePaddle

人工智能 无人机 目标检测 飞桨 PaddlePaddle

火山引擎DataTester推出可视化数据集成方案

字节跳动数据平台

数据集成 ab测试 A/B 测试 可视化开发 企业号 3 月 PK 榜

AI训练性能提升30%,阿里云发布GPU计算裸金属实例ebmgn7ex

云布道师

弹性计算

Swift之struct二进制大小分析

京东科技开发者

swift 数据结构 struct 二进制 企业号 3 月 PK 榜

揭秘网页性能监控|如何从多个角度分析监控结果

云智慧AIOps社区

监控 监控宝 网站监控 网页性能优化 监控产品

首届OceanBase开发者大会|NineData首席架构师谭宇受邀参会,并发表了主题演讲

NineData

多云架构 数据管理 oceanbase 开发者大会 NineData

为什么 MySQL 不推荐使用 join?

Java你猿哥

Java MySQL sql 后端 ssm

vue面试题八股文简答大全 让你更加轻松的回答面试官的vue面试题

肥晨

Vue 面试题 金三银四 超全前端面试题

c4d超强三维动画设计:CINEMA 4D Studio R2023.2.0 中文激活版

真大的脸盆

Mac Mac 软件 C4D

java实现布隆过滤器

小小怪下士

Java 程序员 布隆过滤器

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