私はいくつかのデータベースクエリでプロトタイプシステムを構築しました。それは単なるプロトタイプであり、私はデータベースにはまったく新しいので、私はちょうど直接の文字列を使用しました。これは私が使用される文字列であり、それは正常に動作します:VB.NET - パラメータ化されたクエリでいくつか問題がある
command = New OleDbCommand("SELECT * FROM " + prefix + "CanonicForms WHERE Type=1 AND Canonic_Form='" + item + "'", dictionary_connection)
さて、実際のシステムにそれを置くことで、私はより安全なparametizedメソッドを使用していたので、いくつかのグーグルの後、私はこの思い付いた:
command = New OleDbCommand("SELECT * FROM @prefix WHERE Type=1 AND [email protected]", dictionary_connection)
command.Parameters.AddWithValue("@prefix", prefix + "CanonicForms")
command.Parameters.AddWithValue("@form", item)
しかし、私は不完全なクエリ句のエラーです。私はどうしたのですか?
本当に?何らかの入力に依存するテーブル名を持っている場合は、パラメータを使用しない場合と同じようにインジェクションの問題を引き起こすことはありませんか?私がテーブルの連結を使用しているのであれば、 – cost
私はそれがあなたを開くかもしれないと言っています。テーブル名を「サニタイズ」したいと思うかもしれません。これはかなり一般的なものだと思います。誰もSQL文を連結するのは好きではありませんが、多くの選択肢がない時があります。 –
@cost:SQLインジェクションは、UNVERIFIED/sanitized入力を連結した結果です。入力を確認すると、SQLインジェクションはできません。この場合、入力を検証する好ましい方法は、ユーザーが入力したものを既知のテーブル名にマップすることです(ユーザー入力を直接使用しない)。そうでない場合は、連結する前にテーブル名が存在することをまず確認することができますそれは(つまり、information_schema.tablesに対するパラメータ化されたクエリを使用します)。だから、はい、注射にはオープンですが、注射に脆弱である必要はありません。 – jmoreno