- PR -

パラメタライズドクエリでのテーブル指定

投稿者投稿内容
32WH
会議室デビュー日: 2006/08/03
投稿数: 15
投稿日時: 2006-08-03 19:41
VB2005
SQLServer2005

お世話になります、
VBからSqlCommand.Parameters.Addを使用して
パラメタライズドクエリを実行しているのですが、
Parameterでテーブル名もしくは列名をAddすることはやはり出来ないのでしょうか?
それとも、何か特殊な記述式があるのでしょうか?

やりたいことは↓みたいなことです。

Select
*
FROM
@Table ←ここをパラメータにしたい
WHERE
@Key = @Value ←ここもパラメータにしたい

どなたかご存知の方、よろしくお願いいたします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-08-03 22:15
VBなら普通にSQLを動的に作成すればいいだけだと思います。
(文字列を連結する)
32WH
会議室デビュー日: 2006/08/03
投稿数: 15
投稿日時: 2006-08-03 22:28
burton999さま
有難うございます。

当初その方法で実装しようかと思ったのですが、
今回のシステムはDBのテーブルからデータを取得するので、
その実装を行った場合、DBに不正な値が入力されていた場合、
SQLインジェクションの可能性が考えられるのではないのか?
と思い、パラメタライズドクエリで実装できないものかと思って
書き込んだ次第です。

上記の方法でSQLインジェクションを防ぐことは可能なのでしょうか?
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-08-03 22:55
確かに文字列連結ではSQLインジェクションが発生する可能性はありますね。
テーブル名をパラメタライズドクエリにする方法は残念ながら私は知りません(そもそもあるのか?)

思いつくのは、SQLインジェクションの処理を自作するのは面倒そうなので、
sp_tablesでテーブル一覧を取得して、文字列連結するテーブル名がその一覧に含まれていることを確認するとかですかね。。。(微妙)

とりあえず識者の降臨を待ちましょう。
32WH
会議室デビュー日: 2006/08/03
投稿数: 15
投稿日時: 2006-08-03 23:02
burton999様
度々の回答有難うございます。

なるほどですね、
テーブル名をパラメータにして存在チェックして
あったら文字列連結でクエリを組み立てるとかなら
出来そうですね。

ただ、この処理はかなりの回数が呼び出されるので、
毎回クエリを発行しないように配列かなんかで持って
おくようにしようと思います。

なんかもっと良い方法があればよいのですが、
今のところはこれで行こうかと思います。

有難うございました!!
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-08-03 23:15
引用:
Select
*
FROM
@Table ←ここをパラメータにしたい
WHERE
@Key = @Value ←ここもパラメータにしたい

FROMの後の@Tableは'テーブル変数'というものを意味するみたいです
(テーブル名を動的に指定する目的ではつかえないようです)
WHERE の後の @Key = @Value は単に2つのパラメータを比較するだけですね。

VBで側でSQLインジェクション対策を施せばいいことだとも思いますが、

そういうときはたいだい、ストアドの中で以下のようにSQL文字列をexecしています。
(直接発行しちゃってもいいのか)

exec 'Select * FROM ' + @Table + ' WHERE ' + @Key + ' = ' + @Value

#こっちのほうがよっぽどバグりそうって話もありますがね

#ん、ていうかこれじゃSQLインジェクション対策になってないのかな。。

[ メッセージ編集済み 編集者: べる 編集日時 2006-08-03 23:17 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-08-03 23:21
テーブル名や列名をパラメタにしたい理由は何でしょうか?
SQLインジェクションの心配をしているようですが、「テーブル名」「列名」がユーザーから入力される??
_________________
囚人のジレンマな日々
32WH
会議室デビュー日: 2006/08/03
投稿数: 15
投稿日時: 2006-08-03 23:40
べる様
回答有難うございます。

ストアドにするのも手なんですね!
これは知りませんでした。
でもどうやってデータを受け取れば良いのでしょうか・・・?

囚人様
回答有難うございます。

今回こんなつくりになった理由はデータパターンにより、
取得するテーブルもキーも全て違う、
(但し取得項目は同じ)
と言う条件の下、メンテナンス性を考慮し、
テーブル内でテーブル名及び主キーを管理する。
と言う経緯からこのようなコードを書く状況になりました。

テーブル名、列名はユーザから入力されることは無い
(システム管理者がSQL直打ちで追加/更新する為)のですが、
システム的な穴はなるべくふさいでおきたい&
ユーザがセキュリティにうるさい為、ここに対しての
突っ込みを無くしたいが為に今回の投稿をしました。
(伝わりにくいですかね?)

スキルアップ/キャリアアップ(JOB@IT)