2017-09-26 70 views
0

我想编写一个NpgsqlConnection.BeginTextExport()查询,指定要作为参数导出的表。该naive way要做到这一点:使用Npgsql进行COPY查询的防御参数?

using (var reader = conn.BeginTextExport("COPY " + myTable + " TO STDOUT")) 
{ 
    Console.WriteLine(reader.ReadLine()); 
} 

但我不喜欢它,因为明显的SQL注入格局。我可以想到许多有些复杂的选项来消毒myTable字段,但我想知道这里的规范模式是什么。任何想法?

回答

1

我相信你应该坚持“逃离所有用户提供的输入”。

该技术通常用作最后的手段。输入验证可能是一个更好的选择,因为与其他防御相比,此方法比较脆弱,我们无法保证它可以防止所有情况下的所有SQL注入。

该技术是在将用户输入放入查询之前将其转义。它的实现非常特定于数据库。通常只建议在实施输入验证不符合成本效益时改进遗留代码。从头开始构建的应用程序或需要低风险容忍的应用程序应该使用参数化查询,存储过程或某种为您构建查询的对象关系映射程序(ORM)进行构建或重新编写。

这种技术是这样工作的。每个DBMS支持特定于某种查询的一个或多个字符转义方案。如果您使用适用于您正在使用的数据库的转义方案逃避所有用户提供的输入,那么DBMS不会将该输入与开发人员编写的SQL代码混淆,从而避免任何可能的SQL注入漏洞。

在Postgres的,如果你可以使用美元的情况下引用

https://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

1

https://github.com/npgsql/npgsql/issues/1677

答案的要点是Npgsql只是将参数转发给PostgreSQL(而不是替代客户端),而PostgreSQL不支持表名中的参数。请参阅github答案,了解一些基本原理。