2016-10-28 16 views
3

私は、ASP.NET WebFormsアプリケーション用に生成されたセキュリティレポートを研究しています。私たちのコードのいくつかの領域は、潜在的なSQLインジェクションの脆弱性であると言われています。私はコードベースでこれらの領域を調べており、すべてがExcelブックをインポートしているように見えます。問題のコードは、ブック内の最初のシートの名前に基づいてOleDbCommandを作成しようとしているときのようです。 OleDbConnectionオブジェクトを使用してデータベース(Excelシート)に接続します.OleDbConnectionオブジェクトは、データベーススキーマを読み取り、最初のシートの名前を検索します。その名前を使用してSQLコマンドを動的に構築します。私は上記のコードの代替に探してきた、このSQLインジェクションの脆弱性を修正するための努力においてExcelインポートSQLインジェクションの脆弱性

String connectionString = String.Format(
       "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};" + 
       "Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1\"", sFullPath); 
    OleDbConnection conn = new OleDbConnection(connectionString); 
    conn.Open(); 
    DataTable dbSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 
    string firstSheetName = dbSchema.Rows[0]["TABLE_NAME"].ToString(); 
    using (OleDbCommand command = new OleDbCommand("SELECT * FROM [" + firstSheetName+ "]", conn)) // Offending line of code 

:サンプルコードは次のようになります。誰かが、SQLインジェクションの脆弱性としてフラグを立てることなくこれを実行する方法を知っていますか?私は、この操作を実行するためにActiveXオフィスオブジェクトを使用したくありません。

+0

:あなたはまた、最後のコード例ここで

のように、正規表現のチェックを行うことができますが、いくつかのサンプルコードを使用すると、このフィルタリングを実行するために適応させる可能性がある(私は唯一のコメントを解除し、ホワイトリストのチェックを残しました)ストアドプロシージャのロジックが脆弱性を修正しますか? –

+1

準備完了ステートメントのプレースホルダは識別子ではなくVALUESのみを表すことができるため、準備完了ステートメントはここでは機能しません。従来のSQLエスケープ手法を使用する必要があります。 –

+1

ここでは、SQLのエスケープ方法と関連するものについていくつかの情報があります:http://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and-surrounding-use – HaukurHaf

答えて

0

可能なテーブルのリストがわかっている場合は、最初の例のように、これらのテーブルのホワイトリストを作成し、そのホワイトリストに対してスプレッドシート名を確認することができます。 2番目の例のように、フィルタリングStringメソッドの検証を行うこともできます。単純にこれを動かすのでしょう

bool targetStringInArray = false; 

//Table name is in the whitelist 
targetStringInArray = Array.Exists(tables, element => element == firstSheetName); 

//Table Begins with begin with 'q' 
//string[] tables = { "start", "q1","q3", "fyend", "q4"}; 
//targetStringInArray = Array.Exists(tables, firstSheetName=> firstSheetName.StartsWith("q")); 

//Table name is only letters, numbers and underscores: 
//targetStringInArray = Regex.IsMatch(firstSheetName, @"^[a-zA-Z0-9_]+$"); 



if (targetStringInArray) 
{ 
    using (OleDbCommand command = new OleDbCommand("SELECT * FROM [" + firstSheetName+ "]", conn)) // Offending line of code 
} 
関連する問題