写点什么

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

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

关注

评论

发布
暂无评论
发现更多内容

分类树,我从2s优化到0.1s

Java你猿哥

Java 算法 ssm 分类树

支持GraalVM原生编译的开源低代码平台:Nop Platform

canonical

开源 低代码 GraalVM Quarkus 低代码平台

Paxos的魔法学研究报告

canonical

paxos协议 共识算法 分布式, 分布式算法 深入理解分布式共识算法

系统学Java,看这篇Java综合笔记万字总结就够了!纯干货分享

Java你猿哥

Java spring 面试 ssm 多线程与高并发

为什么说百度AMIS框架是一个优秀的设计

canonical

开源 前端架构 低代码 低代码平台 百度AMIS

性能优化多重要?凭借华为791页Mysql金字塔性能调优手册,进阿里

做梦都在改BUG

Java MySQL 性能优化 性能调优

如何用 ModelScope 实现 “AI 换脸” 视频

北桥苏

Python ModelScope

如何在不修改基础产品源码的情况下实现定制化开发

canonical

开源 低代码 定制化 迭代增量开发 可扩展性

Y组合子的一个启发式推导

canonical

函数式编程 函数式 Lambda演算 Y组合子 不动点

再见!Fastjson!

Java你猿哥

Java ssm Fastjson

采用Excel作为设计器的开源中国式报表引擎:NopReport

canonical

开源 低代码 报表 BI 报表 中国式报表

不是单例的单例——巧用ClassLoader

PPPHUANG

单例模式 ClassLoader ContextClassLoader Java web

这份阿里逆天的Redis手册,于内卷中首次亮相了

Java你猿哥

Java redis 面试 Redis 核心技术与实战 redis 底层原理

一把王者的时间,带你吃透Java面试八股文(2023最新整理)

Java你猿哥

Java 面试 微服务 Spring Boot mybatis

火山引擎DataTester:A/B实验平台数据集成技术分享

字节跳动数据平台

关于 ModelScope 的视频 “AI 换脸” 优化方案

北桥苏

Python ModelScope

问鼎CodeXGLUE榜单,华为云UniXcoder-VESO-v1算法取得突破

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 5 月 PK 榜

《银河护卫队3》观后感:AI、人生

无人之路

AI 电影

中移链合约常用开发介绍(四)工程树目录

BSN研习社

springboot整合redis基础示例

(-0 , +0)

可逆计算:下一代软件构造理论

canonical

低代码 软件架构 函数式编程 领域驱动模型DDD 中台架构 低代码平台

从张量积看低代码平台的设计

canonical

开源 低代码 架构设计 低代码平台 领域模型

如果重写SpringBoot,我们会做哪些不同的选择?

canonical

开源 低代码 架构设计 springboot spring ioc

led大屏幕存在的问题

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家

一图看懂CodeArts Deploy 5大特性,带你玩转部署服务

华为云开发者联盟

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

XDSL:通用的领域特定语言设计

canonical

开源 低代码 dsl 领域特定语言 领域语言工作台

分库分表的 21 条法则,hold 住!

程序员小富

分库分表 springboot 分库表

从可逆计算看开源低代码平台Skyve的设计

canonical

开源 低代码 架构设计 低代码平台 扩展机制

SpringBoot整合MybatisPlus基础教程

(-0 , +0)

springboot Mybatis Plus

eBPF动手实践系列二:构建基于纯C语言的eBPF项目

阿里云大数据AI技术

运维 C语言 ebpf 企业号 5 月 PK 榜

宝兰德应用服务器软件与华为云GaussDB完成兼容互认证

华为云开发者联盟

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

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