2012-04-11 14 views
2

私はWebサービスを呼び出し、動的に生成されたSQLの文字列を渡しています。この文字列にはユーザー入力が含まれます。現在、単純な文字列連結を使用して構築されているため、SQLインジェクション攻撃に対して脆弱です。私はアプリケーションからコマンドを実行していないので、私は通常のパラメータ化されたSQLソリューションを使用することはできません。実行されていないSQLでのSQLインジェクションの防止

私の最初の試みは、パラメータ化されたSqlCommandオブジェクトを構築することでした。ただし、最終的なSQL文を抽出する方法はありません。私の2番目の試みはsp_executesqlを使用することでしたが、それは私の元のコードと同じ問題を抱えているようです:SQLコマンドをユーザー入力と共に連結します。

だから、どのように私は自分の入力のサニタイズロジック(すなわち.Replace("'", "''")を書くに頼らずにSQLを生成することができますか?内蔵の使用可能なクラスや優れたサードパーティのライブラリ?

+0

[単純なSQLクエリをC#でSqlServer用にエスケープする方法](http://stackoverflow.com/questions/2403681/how-to-escape-simple-sql-queries-in-c-sharp-for -sqlserver) – nothrow

+0

http://msdn.microsoft.com/en-us/library/ff648339.aspx –

+11

を参照してください。Webサービスは、SQL文字列を受け入れて実行する必要はありません(ただし、その使用がDBAのユーザーに厳重に制限されている場合を除きます)および開発者)。それはちょうど*本当に*、***本当に***悪い考えです。 – RBarryYoung

答えて

3

私は質問を理解したようあり...自分の入力サニタイズロジックを記述することなく、SQLをどのように生成することができますか?使用するSQLインジェクション軽減テクニックはいくつかあります。 これらの中にはセキュリティベースのバックエンドやビジネスやアプリケーションの開発

バックエンドセキュリティ:「最小特権」ルールを常に適用する:ロープライを設定するDBMSにアクセスするアプリケーションのデータベースアカウントは です。 サーバー側の衛生管理:サーバー側。ユーザーが入力したデータを検証する - だけでなく、潜在的に危険sourceClient側の入力検証から得たすべてのデータは 便利

クライアント側になります彼らは 攻撃者にとって有用な情報が含まれているとして、ユーザーにSQLエラーメッセージを返しません。対象となるテーブルやそのコンテンツに関するクエリや詳細など、 これは、例外処理を使用してJavaで簡単に防止できます。

クライアント側:問題のある文字を含む可能性が高いテキスト入力フィールドを、Base64などの双方向関数を使用して の英数字バージョンにエンコードします。

クライアント側:SQLインジェクションを防止するコードを積極的に作成してください。すべての入力データを2段階のプロセスでフィルタリングします。まず、入力集計(例:Webフォーム)の ユーザーにホワイトリストフィルタリングを適用します。フィールド関連の文字列、文字列フォーマット とデータ型のみを許可します。文字列の長さを制限します。次に、ブラックリストフィルタリングまたはエスケープは、SQLクエリを生成する前にデータアクセスレイヤーに適用される でなければなりません。エスケープSQLメタキャラクタ とキーワード/演算子。

クライアントまたは中間層側:厳密なホワイトリストフィルタリングを使用して、動的に生成されたデータベースオブジェクト名(テーブル名など)を検証します。

クライアントサイド引用符で区切られた識別子を使用しないと、すべてのホワイトリスト作成、つまり のブラックリスト表示とエスケープ作業がかなり複雑になります。

開発:開発者にセキュリティを配慮し、SQLインジェクションを回避する安全なAPIを提供するプロセスを強制する。複雑な防御的なコーディング手法を実装するために開発者に頼るのではなく、これを行います。

API:その後、 はIDEに統合し、直接SQLを構築するために、開発者によって呼び出された(コンパイル時 でデータベーススキーマを分析し、SQLクエリ建設クラスのカスタムセットのコードを書き込み、APIまたはmiddel階層を開発クエリ)。 結果は、テーブルと列の定義に従ってSQLクエリの可能なバリエーションをマッピングする汎用テンプレートに基づくツリー状の構造です。 クラスには主に3つのタイプがあります:SQL文、テーブルの列、および の条件です。これらのクラスには、 データベーススキーマのデータ型をマッピングする強力な型のメソッドがあります。攻撃面が減少します。提案されたAPIはあなたの質問で指定したようにクエリを実行せず、SQLのみを生成します。提案されたAPIは、入力値の提出時に、そのマッピングに対してデータ型をチェックします。次に、バインドされた 変数を持つJDBCのPreparedStatementインタフェースを使用して、 DBMS固有のドライバによってクエリが事前にコンパイルされます。いずれかのステップでエラーが発生すると、クエリの実行が妨げられます。

開発者が使用する提案されたAPIデザインは、サーバー側の検証、SQLエラーの代行受信に対処します。動的入力はPreparedStatementインタフェースを介して別個の保護データ チャネル(バインドされた変数)を介して注入されるため、強力な型付けが直接強制され、テキスト入力エンコーディングと2ステップ入力の検証は不要です。オブジェクト名は、ユーザによって入力されず、日常的に検証される。ただし、依然として低特権のデータベースアカウントを提案されたAPIに提供する必要があります。

提案されたAPIでは、データベースの操作の直前に保護が適用されるため、データ入力エントリポイントを特定する必要はありません。セグメント化されたクエリは完全にサポートされています。それらの のセキュリティは、各クエリの変更がAPIによって検証されるときに保証されます。バインドされた変数を使用して動的入力が指定されるため、ホワイトフィルタ とブラックリストは不要です。提案されたAPIで

( 名前とデータ型であるように)、カラム長(VARCHARフィールドの例えば)溶液 入力データの境界の検証を行うため、その保護レベルを増加することを可能にするDBクラスに記憶することができます全体的な精度

類似のAPIデザインのJavaベースのプロトタイプが進行中であり、現在の研究努力の下にあります。

関連する問題