【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

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

关注

评论

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

logback获取bootstrap.yml配置

小鲍侃java

签约计划第二季

高可用 | repmgr 构建 PostgreSQL 高可用集群部署文档【建议收藏】

RadonDB

数据库 postgresql RadonDB

数据库自增 ID 用完了会咋样?

CRMEB

使用docker安装elk环境

小鲍侃java

签约计划第二季

在有道 | 同宇:一个正在老去的程序员

有道技术团队

程序员 技术人 工程师思维 人物访谈

安全RCE之未授权访问分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

基于云的技术架构设计实践-第2篇

hackstoic

监控系统 签约计划第二季

使用logstash获取springboot控制台日志并传输到elasticsearch

小鲍侃java

签约计划第二季

面试腾讯:渗透测试工程师题型汇总

喀拉峻

面试 网络安全 安全 渗透测试

在 ABAP 里模拟实现 Java Spring 的依赖注入

Jerry Wang

Java 28天写作 SAP abap 12月日更

荣耀周榜公布!你上榜了么?2022.1.17-1.23

InfoQ写作社区官方

话题讨论 热门活动

编曲时如何在FL Studio卷帘窗口修改单个音符音量

懒得勤快

【11月】InfoQ写作平台荣耀月报:名单出炉!

InfoQ写作社区官方

话题讨论 热门活动

低代码发展正当时,中国将取代美国成为低代码开发的全球领导者

金小K

RPA 低代码 低代码开发 低代码平台

elk客户端与springboot整合

小鲍侃java

签约计划第二季

数仓和数据中台长期霸权,数据湖最稳

用友BIP

数据胡

VirtualBox 网络配置 NAT + Host-Only

李鑫磊

Kubernetes 虚拟机 网络配置 virtualbox

质量服务“一站式”平台搭建,NQI一站式云服务平台

电微13828808271

vue全家桶合集

法医

大前端 内容合集 签约计划第二季

一个基于HTML的可定制轮盘——帮你告别选择困难症

海拥(haiyong.site)

html 大前端 28天写作 签约计划第二季 12月日更

云编辑 | 使用 Cloud Studio 在线撰写预览并发布 Hugo 博客

宋天伦

CloudIDE Hugo Cloud Studio

使用自定义注解打印logstash日志

小鲍侃java

签约计划第二季

数据中台的OneID是个什么鬼

用友BIP

数据中台 主数据

使用logstash监控微服务项目,并制定索引格式

小鲍侃java

签约计划第二季

小企业如何落地elk日志收集系统

小鲍侃java

内容合集 签约计划第二季

elk简介与背景

小鲍侃java

签约计划第二季

大型前端项目 DevOps 沉思录 —— CI 篇d

CODING DevOps

ci DevOps 持续集成 工作流

Istio 实践手册 |服务网格框架对比

xcbeyond

istio 28天写作 12月日更 Istio 实践手册

自定义View:使用二阶贝塞尔曲线绘制正弦函数

Changing Lin

12月日更

在 Windows 笔记本上调试运行在 iOS 设备上的前端应用

Jerry Wang

大前端 web api iOS Developer 28天写作 12月日更

Linux一学就会之Centos-文件权限管理

学神来啦

云计算 Linux centos linux运维

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