当前位置: 首页 > news >正文

Entity Framework中的字符串插值引发担忧

将内插字符串(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

相关文章:

  • CentOS 利用 yum 安装卸载软件常用命令
  • jarjar-maven-plugin打包
  • Vim 删除不包含指定字符串的行及统计匹配个数
  • JVM指令助记符
  • FTP与TFTP
  • Android通过Gradle发布开源项目到binary/Jcenter
  • 针对通过 SSH 连接到 Azure Linux VM 时发生的失败、错误或被拒绝问题进行故障排除...
  • bootstrap-table使用总结
  • Tensorflow CNN入门
  • charles抓包并分析问题
  • Veeam任命新的中国区总经理 坚信可用性领域大有可为
  • spring常用注解
  • 学习笔记之Python 3 教程
  • iOS APP原生一维码、二维码扫描使用介绍
  • 新的博客
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • HTML-表单
  • java2019面试题北京
  • JavaScript-Array类型
  • Java新版本的开发已正式进入轨道,版本号18.3
  • jquery cookie
  • PermissionScope Swift4 兼容问题
  • Python打包系统简单入门
  • Python语法速览与机器学习开发环境搭建
  • use Google search engine
  • Vue全家桶实现一个Web App
  • WePY 在小程序性能调优上做出的探究
  • 程序员最讨厌的9句话,你可有补充?
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 小程序01:wepy框架整合iview webapp UI
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 携程小程序初体验
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 原生Ajax
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​Java并发新构件之Exchanger
  • ​第20课 在Android Native开发中加入新的C++类
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (1)Nginx简介和安装教程
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (5)STL算法之复制
  • (C语言)逆序输出字符串
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (八)c52学习之旅-中断实验
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (全注解开发)学习Spring-MVC的第三天
  • (三)uboot源码分析
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)IOS中获取各种文件的目录路径的方法
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)