0

SQL インジェクションの概念、それらが何であるか、なぜ悪いのか、パラメーター化されたクエリやクエリの分割などの方法でそれらを防ぐ方法を理解していますが、コード内で単純なクエリ文字列を使用するとどうなりますか?ユーザー入力がない場所。

たとえば、ユーザーがログオンしたときにユーザーに関する何かを保存し、それが自動的に行われ、ユーザーが気付かずに何もしなかった場合、おそらく次のようなものです。

UPDATE tblUser SET lastLogged = blahblah WHERE userID = blahblah2;

これは、開発者の心に何らかの心配の脅威を引き起こしますか?

私の主な推測では、ハッカーがプログラムまたは Web サイトに侵入した場合、この情報をさらに別の攻撃に使用できるのではないでしょうか? クエリ/文字列は簡単に難読化されますか?

事前に乾杯。

編集:これは純粋に理論上のものなので、「仕事をするならきちんとやれ」などの言い回しは控えるようにしてください.

4

4 に答える 4

4

やるなら…

上で定義した更新クエリのようにプログラムが任意の SQL を実行できるようにすることで、プログラムが危険にさらされた場合、データの整合性を信頼できなくなります。

ストアド プロシージャ (例: SetUserLastLoggedInDate) を使用し、データベースに対して任意の SQL を実行する権限を拒否することで、侵害が発生した場合の潜在的な損害を軽減できます。

于 2012-09-18T09:20:12.573 に答える
4

クエリでパラメーターを使用すると、パラメーターが変更されていても、データベース エンジンはクエリが同じであると認識し、キャッシュされた実行プランを使用できるようになり、パフォーマンスが向上します。したがって、はい、常にパラメーターを使用してください。

セキュリティに関しては、上記で概説したように、もちろん入力の一部がユーザーによって改ざんされない限り、update ステートメントに実際の問題はありません。

于 2012-09-18T09:16:05.330 に答える
2

問題はパラメータのないクエリではなく、文字列の連結です。したがって、次のようにします。

myQuery = "UPDATE tblUser SET lastLogged = blahblah WHERE userID = " + blahblah2

あなたはトラブルを求めています。blahblah2外部ソースからのものではないことを絶対に確信できますか? 通常、パラメーターは他のメソッドからメソッドに渡され、実際のソースは多くのクラスから離れた場所にあります。他の開発者は、結果を知らずに、これらのクラスとソースを変更できます。

クエリをパラメータ化しないことの利点は何ですか? ほとんどの言語ではとても簡単にできるので、習慣にしてそれを続けるだけです。

于 2012-09-18T09:17:49.197 に答える
1

セキュリティの観点からは、あなたのブラブラがユーザーの制御下にない限り、心配する必要はありません。しかし、効率の観点からは、パラメーター化されたクエリを引き続き使用します。

おそらく、心配するユーザーが複数いるため、クエリはさまざまなユーザーに対して実行されます。ステートメントをパラメーター化すると、DBMS はより効率的なキャッシュを行うことができます。

于 2012-09-18T09:17:32.023 に答える