从EF Core 2.1开始,将检查SQL是否进行注入。很好。
但是将参数传递到ExecuteSqlCommand
的正确方法是什么?
var content = "whatever";
...
var command = @"NOTIFY test, '{0}'";
ctx.Database.ExecuteSqlCommand(command, content);
执行“ NOTIFY测试,'@ p0'”。错了
ctx.Database.ExecuteSqlCommand($"NOTIFY test, {content}");
消息:42601:“ $ 1”或附近的语法错误。
var command = $"NOTIFY test, {content}";
ctx.Database.ExecuteSqlCommand(command);
有效,但是“警告EF1000:传递给'FromSql'的SQL表达式嵌入了不会被参数化的数据。(...)“。 错误。这正是我要解决的问题。
var command = @"NOTIFY test, @Content";
ctx.Database.ExecuteSqlCommand(command, new SqlParameter("@Content", content));
InvalidCastException:“值必须是NpgsqlParameter。”哦,很好。
var command = @"NOTIFY test, @Content";
ctx.Database.ExecuteSqlCommand(command, new NpgsqlParameter("@Content", content));
(or)
ctx.Database.ExecuteSqlCommand(command, new NpgsqlParameter("Content", content));
消息:42601:“ $ 1”或附近的语法错误。认真吗?
var command = @"NOTIFY test, {0}";
(or)
var command = @"NOTIFY test, $1";
(or)
var command = @"NOTIFY test, @Content";
ctx.Database.ExecuteSqlCommand(command, new NpgsqlParameter{Value = content});
消息:42601:“ $ 1”或附近的语法错误。 我退出了。
我想念什么吗?
答案 0 :(得分:1)
PostgreSQL根本不支持SELECT
语句中的参数...如果尝试使用常规的DML,例如INSERT
或$whereData = [
['status', 'P'],
['end_date', '<', now()]
];
$publishedConferences =
$user->conferences()->
where($whereData)->
paginate($pageLimit);
,则一切正常。
如果您确实想对通知进行参数化,则仍然可以进行客户端字符串内插,但请确保清理用户输入,否则您将接受SQL注入。
答案 1 :(得分:0)
我想念一些东西
在查看文档时(http://www.npgsql.org/doc/index.html) 有这样的样品
还可以显示示例表结构吗?
var connString = "Host=myserver;Username=mylogin;Password=mypass;Database=mydatabase";
using (var conn = new NpgsqlConnection(connString))
{
conn.Open();
// Insert some data
using (var cmd = new NpgsqlCommand())
{
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO data (some_field) VALUES (@p)";
cmd.Parameters.AddWithValue("p", "Hello world");
cmd.ExecuteNonQuery();
}
// Retrieve all rows
using (var cmd = new NpgsqlCommand("SELECT some_field FROM data", conn))
using (var reader = cmd.ExecuteReader())
while (reader.Read())
Console.WriteLine(reader.GetString(0));
}
You can find more info about the ADO.NET API in the MSDN docs or in many tutorials on the Internet.
基于“ NOTIFY测试”,我不知道您要做什么