2017-09-26 41 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答案,瞭解一些基本原理。

相關問題