SqlCommand はどのようにパラメータをサニタイズしますか?
-
06-09-2019 - |
質問
使用する SqlParameters
データベース クエリでの SQL インジェクションを防ぐために推奨される方法です。これらのパラメータを内部的にサニタイズするコード/関数はどこで見つけられますか?この関数をカスタム実装で再利用したいと考えています。Reflectorを使用して検索しようとしましたが、失敗しました。
解決
XSS ではなく SQL インジェクションから保護します。 コードや機能はありません パラメータデータをサニタイズします。
保護は、パラメータ値をクエリ文字列とは別にサーバーに送信することによって実現されます。 一度もない SQL ステートメントに直接置換されます。
したがって、SQL Server の代わりに次のようなものを実行します。
SELECT * FROM [table] WHERE [column] = ParameterValue
あたかも次のようなものを実行したかのようです:
DECLARE @ParamValue int
-- //@ParamValue variable is populated from the framework in a safe way
SELECT * FROM [table] WHERE [column] = @ParamValue
これは、パラメーター データを評価する必要がある関数よりも高速で、はるかに安全で堅牢です。このような関数は非常に複雑にする必要があります (以下を参照)。エラーが発生しやすい) のようなものを処理するため カスタムエスケープ文字 そして将来の機能強化。
これにより、問題全体がうまく回避されます。データはデータ、コードはコード、この 2 つが一致することはありません。
他の人へのあなたのコメントは現在削除されていますが、次のように答えてください。
値 O'Rourke を渡すと、クエリが壊れないように、値が O''Rourke にエンコードされます。正しい?
いいえ、それは正しくありません。変数はデータ ブロックから直接作成されるため、特別なエスケープやエンコードは必要ありません。
所属していません StackOverflow