重複の可能性:
XKCD SQL インジェクション — 説明してください
私はC#が初めてで、知りたいです。
C# で SQL 文字列を作成するとき、文字列を直接渡すのではなく、ユーザーの入力を表すために SqlParameter オブジェクトを使用する必要があるのはなぜですか?
重複の可能性:
XKCD SQL インジェクション — 説明してください
私はC#が初めてで、知りたいです。
C# で SQL 文字列を作成するとき、文字列を直接渡すのではなく、ユーザーの入力を表すために SqlParameter オブジェクトを使用する必要があるのはなぜですか?
私はあなたがなぜ書く方が良いのかを意味していると思います:
command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = @FirstName";
// Or whichever form...
command.Parameters.AddParameter("@FirstName").Value = input;
それよりも
command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = '" + input + "'";
後者の形式には 3 つの問題があります。
エスケープに非常に注意しない限り、 SQL インジェクション攻撃を許可しますが、上記のコードはそうではありません。ユーザーが次のように入力した場合、SQL がどのようになるか想像してみてください。
' OR 'x' = 'x
コードとデータが混在しています。最初の形式では、どのビットが固定され、どのビットが可変入力であるかを示しているのに対し、何をしようとしているのかを明確に表現することはできません。
文字列についてはそれほど問題にはなりませんが、パラメーターは不要なデータ変換を回避します。たとえば、日付または日付/時刻の値を使用する場合、2 番目のアプローチでは、データベースが受け入れるテキスト形式について心配する必要がありますDateTime
。適切な日付/時刻型の値を使用します。文字列表現を経由すると、問題が発生するだけです。
さらに、状況によっては、最初の方法でパフォーマンスが向上し、データベースがクエリ実行プランをキャッシュできるようになる場合があります。ただし、これにはかなりのニュアンスがあり、かなりデータベース固有です。
簡単に言えば、SQL インジェクション攻撃を回避し、そのパラメーターのデータ型、サイズなどを指定することで、パフォーマンスがある程度向上する可能性があります。
SQLインジェクションを避けたいだけなら、単に使用できると思います
command.Text = "SELECT LastName FROM MyUsers WHERE FirstName = '" + input.Replace("'","''") + "'";