- - PR -
パラメタライズドクエリでのテーブル指定
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-08-03 23:57
[ メッセージ編集済み 編集者: 未記入 編集日時 2007-01-19 21:49 ] | ||||||||||||||||
|
投稿日時: 2006-08-04 00:35
テーブル名のSQLインジェクションに限定するなら、半角スペースと、セミコロンぐらいのチェックだけで良さそうな気もしますね。 これらはテーブル名に使用できないはずだから、無条件ではじいて問題なさそうですし。 | ||||||||||||||||
|
投稿日時: 2006-08-04 00:37
ストアドを使用する場合でも、ストアド内部でSQL文を(入力値値を用いて)動的に作成する
のであれば、sp_executesqlを使用してパラメタライズドクエリを実行すべきだと思います。 ぜうすさんの方法だとVB側でガリガリSQL文を作成するのと同じ結果になってしまいますね。 SELECT文がコンパイルされる前に入力値とSELECT文を結合してしまえば、それだけで SQLインジェクションの危険性があります。(入力値を事前に検証していれば別ですが…) テーブル名、列名がユーザから入力されないのですから、VB側でテーブル名と列名を 文字列結合して、キーの部分をパラメータ化したパラメタライズドクエリを使用するのが 私としては良いと思います。 | ||||||||||||||||
|
投稿日時: 2006-08-04 10:06
データベース側にビューを用意しておくってのはどうでしょうか。
| ||||||||||||||||
|
投稿日時: 2006-08-04 12:17
皆様、こんな初心者質問に多数の回答有難うございます。
ぜうす様 回答有難うございます。 実際にストアドを組んでやってみました。 やってみた結果としてはDelete文を組み込むことも可能だったので、 ちょっと今回の実装には出来そうに無いです…。 やっぱりお客さんに現状報告してどうにかできないか確認してみます。 SQLインジェクションについてはまだまだ知識が足りないみたいです… 色々資料をあさってこれを機に深く勉強してみようかと思います。 有難うございます。 burton999様 度重なるご回答有難うございます。
とのことですが、実際にテーブルを作ってみました。 Table_A];delete from [Table_B て感じのテーブルが作れてしまいました… 単純にセミコロン、シングルクォート、ダブルクォートを 無効化(Replace等)してしまうようにすれば良いですかね? がんふぃーるど様 ご回答有難うございます。 sp_executesqlですか、これも初めて聞きました。 調べてみましたが、ストアド内でのパラメタ化クエリが使用できるみたいですね! 実装してみたのですが、やはりこれもテーブル名等は パラメタ化できないみたいで… やり方の問題ですかね? vincent様 ご回答有難うございます。
とのことですが、どのようなビューを実装したらよいのでしょうか? 今回の問題に対して、ビューと言うアプローチ方法が浮かびません… 何か良い方法があれば教えていただいてもよろしいでしょうか? | ||||||||||||||||
|
投稿日時: 2006-08-04 12:41
という条件を生かし、各テーブルをunionで連結し、 どのテーブルから読み出すかを識別子(連番でも、テーブル名でもお好きなように)を付与しておく。
ってな感じ? unionで連結するので、列数、列の型は合わせとくように。 | ||||||||||||||||
|
投稿日時: 2006-08-04 12:42
テーブル名や列名をパラメタにする方法を少なくとも私は知りません。
何でもかんでも SQL インジェクションの心配をしていたらキリがないですよ? 例えば以下は文字列連結をしていますが、
「クエリを文字列連結しているようだけど、サニタイズしなくていいの?」と言う人がいるでしょうか。 32WHさんの場合は、どこからテーブル名や列名が来るのか、そこがハッキリしたら
突っ込みを無くせるでしょう。 _________________ 囚人のジレンマな日々 | ||||||||||||||||
|
投稿日時: 2006-08-04 16:57
複雑怪奇なことをしても逆に穴を作るだけだったりします
string query = "SELECT * FROM [" + tableName.Replace("]","]]") + "]"; これじゃだめですか?(参考) ほかにエスケープしなきゃならん文字あるのかな。。 インジェクション対策を破れるかテストしてみてください。(だめだったらごめんなさいね。。w) この手の対策の類は「ダメな文字」をエスケープするか、エスケープする方法がないなら消す、でほとんど済みます。 #私の最初の投稿ではインジェクション対策してません。 |