FromSqlInterpolated and in clause



声纳让我很为难,因为下面的代码:

var listaChaves = chaves.ToList();
var parametros = new string[chaves.Count];
var parametrosSql = new List<NpgsqlParameter>();
for (int i = 0; i < listaChaves.Count; i++)
{
parametros[i] = string.Format("@param_{0}", i);
parametrosSql.Add(new NpgsqlParameter(parametros[i], listaChaves[i]));
}
var comandoSql = string
.Format("SELECT distinct on(chave_identificacao) chave_identificacao, data from ultimos_acessos where chave_identificacao in({0}) order by chave_identificacao, data desc",
string.Join(", ", parametros));
var ultimosAcessos = await Entidade.FromSqlRaw(comandoSql, parametrosSql.ToArray())
.Select(a => new ProjecaoListagemUltimoAcesso(a.Data, a.ChaveIdentificacao))
.ToListAsync();

它认为SQL注入可以发生,因为字符串插值。所以我试图改变为" from msqlinterpolated& quot;方法,如下:

var listaChaves = chaves.ToList();
var ultimosAcessos = await Entidade.FromSqlInterpolated(@$"SELECT distinct on(chave_identificacao) chave_identificacao, data from ultimos_acessos where chave_identificacao in({string.Join(", ", listaChaves)})) ) order by chave_identificacao, data desc")
.Select(a => new ProjecaoListagemUltimoAcesso(a.Data, a.ChaveIdentificacao))
.ToListAsync();

但它只是不工作,任何人都可以帮助我如何从使用"in"插入字符串创建一个安全的sql;条款?

这样应该可以工作。在与参数相同的循环中构建一个OR子句,并将其塞进SQL:

string ORclause = "";
for (int i = 0; i < listaChaves.Count; i++)
{
ORclause += $" chave_identificacao = @param_{i} OR ";

parametros[i] = string.Format("@param_{0}", i);
parametrosSql.Add(new NpgsqlParameter(parametros[i], listaChaves[i]));
}
//remove last "OR"
ORclause = ORclause.Substring(0, s.Length - 4);
@$"SELECT distinct on(chave_identificacao) chave_identificacao, data 
from ultimos_acessos 
where {ORclause} 
order by chave_identificacao, data desc";

如果你有很多listachave,那么考虑使用StringBuilder而不是+=

最新更新