EF Core 中避免 SQL 注入的三种写法

server/2024/10/22 12:43:50/

SQL 注入攻击可能会对我们的应用程序产生严重影响,导致敏感数据泄露、未经授权的访问和应用程序受损。EF Core 提供了三种内置机制来防止 SQL 注入攻击。

1、利用 LINQ 查询语法和参数化查询,这是比较推荐的做法。

await using var context = new PostgresContext();  
var author = "江";  
var blog = await context.Blogs.Where(s=>s.Author == author + "山").FirstOrDefaultAsync();

生成的查询脚本如下:

SELECT b.author, b.blogid, b.url
FROM blog AS b
WHERE b.author = @__p_0
LIMIT 1

2、使用 FromSql

对于一些复杂的查询,需要直接使用 SQL 查询脚本的,如果是 EF Core 7.0 以上版本可以使用 FromSql。

await using var context = new PostgresContext();  
var author = "江山";
var blog = await context.Blogs.FromSql($"SELECT * FROM blog WHERE author = '{author}'").FirstOrDefaultAsync();

生成的查询脚本如下:

SELECT e.author, e.blogid, e.url
FROM (SELECT * FROM blog WHERE author = '@p0'
) AS e
LIMIT 1

它会自动识别字符串中的 {author} 这样的字符,用参数替换掉。

3、使用 FromSqlRaw

FromSqlRaw 也可以执行 SQL,但是需要特别注意。

先看下面的代码:

await using var context = new PostgresContext();  
var author = "江山";    
var blog = await context.Blogs.FromSqlRaw("SELECT * FROM blog WHERE author = '{0}'",author).FirstOrDefaultAsync();

生成的查询脚本如下:

SELECT e.author, e.blogid, e.url
FROM (SELECT * FROM blog WHERE author = '@p0'
) AS e
LIMIT 1

上面的结果是安全的。现在,把脚本改成"+"号拼接:

var blog = await context.Blogs.FromSqlRaw("SELECT * FROM blog WHERE author = '"+author+"'").FirstOrDefaultAsync();

生成的脚本如下:

SELECT e.author, e.blogid, e.url
FROM (SELECT * FROM blog WHERE author = '江山'
) AS e
LIMIT 1

这样就不安全了。

这就是 EF Core 中避免 SQL 注入的三种方式,希望对你有帮助。


http://www.ppmy.cn/server/133897.html

相关文章

做一个英文PDF转化为中文PDF的系统

以下是基于本地模型的PDF翻译系统的完整设计和代码实现,支持术语表的导入,并保留PDF的原有格式。 系统设计概述 本系统的目标是将英文PDF文件翻译成中文,并保持原有的排版和格式(如字体、图片、表格等)不变&#xff…

【Flutter】Dart:异步

在现代应用开发中,异步编程是不可或缺的部分,尤其是在开发用户界面、网络请求、文件操作等涉及长时间执行的操作时,异步能避免阻塞主线程,从而提升应用的响应速度和用户体验。在 Dart 中,异步编程主要依靠 Future 和 S…

RocketMQ | 源码分析 | 消息刷盘

一、前言 在上篇文章中,我们分析了消息是如何从 Broker 最终存储到MappedFile 内存缓冲区中的,但是此时消息存储的任务并没有完成,因为消息还没有刷盘,即存储到文件中,本篇我们就来看看RocketMQ是如何进行消息刷盘的。…

Blender快捷键alt+A对齐没有反应/无效的解决方案(备忘录03)

目录 MACHIN3下载地址: 如果altA无效,那么有几个情况 没有正确安装MACHIN3,或者安装的版本与Blender版本冲突。 AltA快捷键与其他软件的快捷键冲突。 (本人最终解决方案)没有打开对齐饼菜单 测试结果 AltA快捷键…

在 gRPC 中,客户端和服务端的 Protocol Buffers(Protobuf)生成的文件必须保持一致性,以确保通信正常。

在 gRPC 中,客户端和服务端的 Protocol Buffers(Protobuf)生成的文件必须保持一致性,以确保通信正常。 关键点 相同的 .proto 文件: 客户端和服务端应该使用相同的 .proto 文件定义服务和消息结构。这确保了双方对数据…

数据库相关操作

1. 创建数据库 首先,使用 CREATE DATABASE 语句来创建一个新的数据库。 CREATE DATABASE my_database; 2. 使用数据库 创建数据库后,使用 USE 语句切换到这个数据库。 USE my_database; 3. 创建表 接下来,在数据库中创建一张表。表中…

python画图| 对齐图名和标签

【1】引言 学习了很多python画图教程之后,我们会发现:一些最基本的设置往往对图形的表达具有至关重要的影响。 因此,我们暂时回过头来,对一些基础知识进行加强。 今天,就一起学习如何对齐图名和标签。 【2】官网教…

解锁Claude五大能力,带你使用更加强大的Claude

很多人都听说过这样一句话:"想要AI生成更好的答案,你必须提供清晰、有效的提示。" 这句话现在可谓是家喻户晓。 然而,即便知道这个道理,很多人仍然不知道该如何写出好的提示词。他们常常面对空白的输入框,…