0

文字列を取り込んでエスケープする文字列メソッドを作成して、データベースのSQLクエリで使用できるようにする必要があります。次に例を示します。

"This is john's dog" ==> "This is john''s dog"
"This is a 'quoted' string" ==> "This is a ''quoted'' string"

私のメソッドを次のようにしたいと思います。

string PrepareForSQLCommand(string text)
{
    ...
} 

とにかく、SQLクエリでエスケープする必要のあるすべての文字を知っているわけではありません。これを行うための最善のアプローチが何であるか、またはC#でこれを行うための既存の堅牢な組み込みのものがあるかどうかはわかりません。

これについて以前に言及しなかったことをお詫びします。私には、パラメータ化されたクエリを使用するオプションがありません。

テッド

4

2 に答える 2

9

これを行う通常の方法は、SqlCommandの一部としてパラメーター化されたクエリを使用することです。

SqlCommand command = new SqlCommand("SELECT * FROM MyTable WHERE MyCol = @param", connection);
command.Parameters.AddWithValue("@param", "This is john's dog");

フレームワークは、安全性を確保します。これは、考えられるすべてのインジェクション攻撃を自分で解決しようとするよりもエラーが発生しにくいものです。

于 2013-01-30T22:23:06.623 に答える
3

警告をトリガーします。この答えは、次のステートメントへの応答です。

パラメータ化されたクエリを使用するオプションがありません。

この回答に賛成票を投じないでください。また、これを正しいやり方として受け入れないでください。OPがパラメータ化されたクエリを使用できない理由がわからないので、その特定の質問に答えていますが、これを行う方法をお勧めしません。あなたがOPでない場合は、私が与えた他の回答を読んでください。また、反対票を投じる前に、上記の制約に留意してください。ありがとう。

トリガー終了警告!

Microsoft SQL Serverの場合(サーバーによって答えは異なります)、一重引用符をエスケープする必要があります。

'

ただし、これらの文字をエスケープする前に、ホワイトリストにない文字を拒否する必要があります。これは、非常に巧妙なトリックがたくさんあり、ホワイトリストの検証は、単に悪いとわかっている文字をエスケープするよりも安全だからです。

Regex whiteList = new Regex("[^'a-zA-Z0-9 -]");
query = whiteList.Replace(query, "");

たとえば、これは文字と';'を削除[します。]文字。これは非常に制限のあるホワイトリストであるため、期待に一致するように正規表現を調整する必要がある場合がありますが、アプリケーションに表示されると予想されるデータの種類はわかっています。

これがお役に立てば幸いです。セキュリティの詳細については、OWASP Webサイトを自由にチェックしてください。パラメーター化されたクエリを使用する方法を見つけることができれば、よりよく眠ることができます。

于 2013-01-30T23:13:48.330 に答える