2009-05-29 5 views
10

SqlParametersを使用することは、データベースクエリでSQLインジェクションを防止するために推奨される方法です。これらのパラメータを内部的に消毒するコード/機能は、どこで見つけることができますか?私は私のカスタム実装でこの関数を再利用したいと思います。リフレクターを使って見つけようとしましたが、失敗しました。SqlCommandはどのようにパラメータをサニタイズしますか?

+0

大きな質問 - パラメータ化されたクエリの使用によってセキュリティがどれだけ深く提供されているかを理解することが重要です。 – RedFilter

答えて

24

これはXSSではなく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 

をパラメータデータを評価する必要があります。このような関数は、custom escape charactersや将来の拡張機能などを処理するためには、非常に複雑な(読み込み:エラーが発生しやすい)必要があります。

この問題は、データがデータであり、コードがコードであり、二度と決して満たされないという問題を完全に解決します。


他、今削除し、答えにあなたのコメント:

私は値オルークに渡すと、それが壊れないようにO''Rourkeように、それをコード化しますクエリ。正しい?

いいえ、正しくありません。変数はデータブロックから直接作成されるため、特別なエスケープやエンコーディングは必要ありません。

+0

OK、感謝します、ありがとう。 "// @ ParamValue変数は安全な方法でフレームワークから読み込まれます"これは安全な方法でどのように埋め込まれますか? –

+0

これはsqlではありません。変数はクライアントから送信された_data_ブロックからSQL Serverによって作成されますが、データセグメントに保存され、コードとしては扱われないため、エスケープまたはエンコードする必要はありません。 –

+0

これに関する詳しい文献は知っていますか?私は本当にプロセス全体を理解したいと思います。 –

関連する問題