とき、それはSQLコマンドで非パラメータ化変数を使用しても安全ですか?

StackOverflow https://stackoverflow.com/questions/929873

  •  06-09-2019
  •  | 
  •  

質問

私は、クライアントコードは、行IDを提供し、行のデータから構築されたオブジェクトを取り戻すことができますC#メソッドで選択クエリを書いています。行IDは整数であり、私はそれがポジティブだ確認している場合は、単にString.Formatのを使用してそれを通すことで害はありますか?私は、彼らが唯一の文字列をint型に渡すことが許可されていなかった場合は損害を行うことができる方法を見ていない。

役に立ちましたか?

解決

そうだね、そのように整数を渡しても安全でしょう。しかし、物語の別の側面もあります。

それだけでint型をフォーマットAN SQL式を作成するために安全であると考えることができる一方で、

、パフォーマンスの考慮事項もあります。 SQLサーバが最初にクエリを見ているとき、それはそのクエリの実行計画を作成し、キャッシュします。同じクエリが発行される次回は、実行計画が再利用されます。

あなたが別の文字列を渡す場合は、

、それは別の実行計画を必要とし、個別のクエリとして見られるだろう。あなたは(異なるパラメータを持つ)同じパラメータ化クエリで各時間を渡す場合は、最初の実行計画は、SQL Serverによって再利用されます。

あなたはパフォーマンス上の利点を気にしない場合でも、私はまだも、あなたが指摘するよう「安全」と見なすことができるもののために、データベースに対するすべてのクエリのためのパラメータ化クエリを使用します - 単純で一貫しています方法は、アプリケーションがデータにアクセスします。あなたがは常にがパラメータ化クエリを使用している場合、それはまた、あなたのデータベースを照会するためにどのように決定するためにクエリが安全であるかどうかをその都度決定する手間が省けます。

他のヒント

あなたはここにあなた自身の質問に答えるしています。可能System.Int32を含めることはできません。

';DROP DATABASE xxx;--

それはあなたが心配しているものだ場合。でも、負の整数を渡すと、マイナスのデータベースに影響を与えないだろう!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top