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

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

posted @   硅基喵  阅读(116)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示