5

私は最終的にSQL SELECTステートメントを動的に構築して後で保存および実行するASP.NET MVC4アプリケーションを作成しています。動的 SQL の構造は、標準のチェックボックス、ドロップダウン、および自由入力テキストボックスを使用して、ユーザーフレンドリーな方法でユーザー構成によって決定されます。入力を検証し、パラメーター化されたクエリを使用して SQL 文字列を作成するのは簡単ですが、高度なユーザーがカスタム SQL を入力して SELECT 句と WHERE 句に直接挿入できるようにする必要があります。では、カスタム SQL 式をクレンジングしたり、巧妙なユーザーからの不要な入力から保護したりするには、どのような手法を使用できるでしょうか? 疑わしいキーワードやブラックリストの挿入/更新/削除などの文字列を簡単に解析できますが、100% 保護することはできないことがわかります。

私がここで行っていることについて、より詳細な情報を提供できることをうれしく思いますが、私の問題はおそらく一般的ではありませんが、かなり一般的なものだと感じているため、他の詳細が役立つかどうかはわかりません.

4

4 に答える 4

4

SQL を指定する直接的な方法を提供しないことによってのみ、必要なものを達成できると思います。

しかし、それは問題である必要はありません。基本的に、式 (SELECT で計算された solumns) と述語 (WHERE でフィルタリングするため) を定義するための SQL のサブセットのみが必要です。これは自作のパーサーで処理できます。このパーサーは、必要なすべてを実行するのに十分なパワーを備えていますが、実際には何も直接注入することなく、式を実際の SQL コードに「コンパイル」します。

次に、これにより構文が検証され、インジェクションを許可する構造が作成されないことが確認されます。また、必要に応じて生成するクエリをコード ジェネレーターに適切にパラメーター化させることもできます (たとえば、すべてのリテラルをコード ジェネレーターによってクエリ パラメーターとして渡すことができます)。

于 2013-04-04T16:34:45.383 に答える