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