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 注入的三种方式,希望对你有帮助。
本文来自博客园,作者:硅基喵,转载请注明原文链接:https://www.cnblogs.com/denglei1024/p/18467781
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!