首页 > 数据库 >EF Core 中避免 SQL 注入的三种写法

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

时间:2024-10-15 16:21:04浏览次数:6  
标签:Core await author EF blog SQL var SELECT

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 注入的三种方式,希望对你有帮助。

标签:Core,await,author,EF,blog,SQL,var,SELECT
From: https://www.cnblogs.com/denglei1024/p/18467781

相关文章

  • Solution - Codeforces 1628D2 Game on Sum (Hard Version)
    首先来考虑Easy。注意到的是最后输出的答案要求是模意义下的,这说明对于实数二分的做法都已经用不了了。注意到\(n,m\le3000\)的数据范围,于是一个想法就是考虑DP之类的算法。考虑到B选了\(+/-\)实际上就代表着下一轮的\(m\)是否会\(-1\),于是可以设状态为\(f_{i......
  • docker-compose安装mysql/redis/nacos环境
    dockerdocker-compose安装查看上一篇文章1.新建目录并创建docker-compose.yaml文件文件内容services:mysql:image:mysql:8.2.0container_name:mysqlenvironment:MYSQL_ROOT_PASSWORD:1qaz@WSXMYSQL_DATABASE:nacosMYSQL_USER:......
  • 【高频SQL基础50题】36-40
    回到SQL.目录1.员工奖金2.每月交易I3.只出现一次的最大数字4.最后一个能进入巴士的人 5.2016年的投资​1.员工奖金连接题。#WriteyourMySQLquerystatementbelowSELECTt1.name,t2.bonusFROMEmployeet1LEFTJOINBonust2ONt1.empId=t2.empIdWHER......
  • sqlserver 里的UNION 关键字是啥含义
    在SQLServer中,UNION是一种用于合并两个或多个SELECT语句结果集的操作符。它允许你将来自不同表或相同表但基于不同条件的查询结果合并成一个单独的结果集。使用UNION时,需要注意以下几点:列数和数据类型:所有SELECT语句必须返回相同数量的列,并且相应列的数据类型必须兼......
  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • Educational Codeforces Round 170 (Rated for Div. 2) D.Attribute Checks (没有完全
    算法显然为dp状态设计\(dp_{i,j}\)表示在第\(i\)个获得能力点的地方,之前智慧能力值为\(j\),时的最大分数状态转移显然需要从\(dp_{i-1,j}\)转移而来枚举\(j\in[0,i)\)则有(注意取\(\max\)操作要与自己相比较)设第\(i-1\)个能力点到第\(i\)个能......
  • MySQL面试题-为什么用了索引就会加快查询
    快速定位数据索引类似于书的目录,它提供了一种快速定位数据的方法。没有索引时,MySQL需要逐行扫描整个表(全表扫描)来查找满足查询条件的记录,这可能需要很长时间,特别是当表很大时。而有了索引,MySQL可以迅速定位到索引中满足条件的记录位置,然后直接访问这些记录,从而大大减少了需要......
  • 关于最新版本mysql9,使用Kettle连接Mysql 9 报错,驱动问题
    使用kettle连接mysql时,报“Driverclassorg.gjt.mm.mysql.Drivercouldnotbefound”错,没有需要的connector包,在Mysql官网下载了最新的connector的jar包,并将其放在如下图的Kettle所示的目录中:重试发现仍然连接失败。这时候对比了网上大家的解决方法,发现我所下载的最新conne......
  • union all SQL 操作符
    在Hive中,`UNIONALL`是一个SQL操作符,用于将两个或多个查询的结果合并为一个结果集。与`UNION`不同,`UNIONALL`不会自动去重,因此它会返回所有查询结果,包括重复的记录。以下是`UNIONALL`在Hive中的一些主要作用和特点: 主要作用1.合并结果集:  可以将多个S......
  • SQLServer数据库日志太大处理方式
    SQLServer数据库日志太大处理方式1.1 如下图,点击连接登陆数据库1.2 如下图,打开数据库属性窗口1.3 如下图,更改数据库恢复模式1.4 如下图,收缩数据库日志到这里已经完成了,数据库的日志收缩1.5 如下图,数据库恢复模式修改为完整至此,完成。......