- PR -

SQL インジェクションの防止

投稿者投稿内容
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-07 19:35
引用:

これを実行すると次のようにプロファイラに記録されます。
引用:

select * from Products where ProductID = 20
exec sp_executesql N'select * from Products where ProductID = @P1', N'@P1 int ', 30



で、私は後者の記述がキライということ。


なるほど、JDBCドライバの実装がそうなってるんですね。TYPE4だとこうするしかないのか、
それともSQLServerでパラメータクエリを実行するにはこうしないとできないんですかね。

引用:

あなたがストアドに変な固定概念を持っているだけでは? 別にストアドのすべてがユーザープログラマブル(とそれを実行する機構)である必要はないでしょ? SQL Server の場合、sp_executesql は拡張ストアドプロシージャとして実装されているので、内部がどうなっているのか良く分からないけど、多分、コアと密接な関係にあるのでしょう。ストアドという呼び出し形態を取る事でミドルウェアのインターフェイスがシンプルになるんじゃないかな。


MSDNでsp_executesqlからたどって「システムストアドプロシージャ」を調べてみました。
…なるほど面白いですね。SQLインジェクションでなんでもできるようになるわけだ。

sp_whoとかってSYBASEでは普通のストアドプロシージャだったような気がするけど、完全に
作り直しているのかな?

引用:

一般的な処理だなんて書いてないですよ? むしろ、私の確認できる範囲として「SQL Server の場合」と断り書きをしていることのほうが多いはずですが?


これは、私が読み違えていました。すいません。

引用:

意味って何の意味ですか? プリコンパイルによるパフォーマンス向上の恩恵は受けられませんが、十分にテストされたミドルウェアであれば、プレーンテキスト展開をしていても SQL インジェクション対策としての意味が十分あると思いますけど。


この文脈ではパフォーマンスに触れているわけですから、パフォーマンスの観点ではパラメータ
クエリを使うことが無意味になってしまう、ということです。

引用:

ええ、そこまでするほどの理由です。


なるほど
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-07-07 19:40
引用:

こばさんさんの書き込み (2005-07-07 18:29) より:

 検索キーワード省略時に対応したものを作ろうとすると SQL文 が伸びるのがいやで・・・(もしくは完全にストアド化して分岐させるか)

select * from account where (uid=@uid or @uid is null) and (pas=@pas or @pas is null)

※このような認証時の例にパラメータ省略を考えるのは不適切ですけど、うーん、美しくない!って思っちゃいます。



検索キーワード省略時はその条件自体を作らなければ良いのでは?
作り方次第です。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-07-07 19:46
引用:
この文脈ではパフォーマンスに触れているわけですから、パフォーマンスの観点ではパラメータクエリを使うことが無意味になってしまう、ということです。


この文脈ではパフォーマンスに触れている? それは、あなたの脳内だけでは?

スレタイもそうだし、他の人はパラメータ化による安全性、SQLインジェクション対策の話をしているようですよ。私も都度コンパイルの性能に不満はないので、パラメタ機能が使いたいだけだと明言していますし。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-07 19:51
引用:

こばさんさんの書き込み (2005-07-07 18:29) より:
 検索キーワード省略時に対応したものを作ろうとすると SQL文 が伸びるのがいやで・・・(もしくは完全にストアド化して分岐させるか)

select * from account where (uid=@uid or @uid is null) and (pas=@pas or @pas is null)

※このような認証時の例にパラメータ省略を考えるのは不適切ですけど、うーん、美しくない!って思っちゃいます。


パラメータクエリだと、SQL文が固定でなければならない、と思っていませんか?
パラメータクエリ自体を組み立てればいいんですよ。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-07 19:59
引用:

未記入さんの書き込み (2005-07-07 19:46) より:
この文脈ではパフォーマンスに触れている? それは、あなたの脳内だけでは?


以下の私の文章は、

引用:

もちろんそうですが、「プレーンテキストに展開」(ってパラメータを値に置換するってこと
ですよね?)したら意味ないですよね?


以下の文章に対応するものですから。

引用:

それと、(密接な関係があるのは確かですが) パフォーマンス向上の要因になっているのはパラメタを使うことではなく、プリコンパイルによるものでしょう。



引用:

スレタイもそうだし、他の人はパラメータ化による安全性、SQLインジェクション対策の話をしているようですよ。私も都度コンパイルの性能に不満はないので、パラメタ機能が使いたいだけだと明言していますし。


はい、脇道にそれていることは重々承知しております
ただ、あまり知識のない人があなたの文章を読んで、「パラメータクエリ」にネガティブな印象
を持ってしまうと損だな、と思ったもので。
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-07-07 20:05
引用:

ukさんの書き込み (2005-07-07 19:51) より:

パラメータクエリだと、SQL文が固定でなければならない、と思っていませんか?
パラメータクエリ自体を組み立てればいいんですよ。



 そうでしたね。ビュー定義しておくプリコンパイルされるんで、パラメータクエリを=固定ビューという固定概念を持ってしまってました。

 ただそうなると、プログラム側でパラメータクエリを使用した SQL文 をその都度生成するということですよね?
 直に SQL 文書いたほうがラクチンという話になってしまう訳でして・・・


 それも、SQL インジェクション を防止するということが目的であれば、致し方なしと考えるべきか。。
 ひとまず、今までの投稿では、「'」→「''」(シングル2つ)に変換して使えば、少なくとも SQL Server では インジェクション されることはなかろうという風な話になってますが、どうなんでしょう。

 普通のSQL文で SQL インジェクションを防止する方法を知っておくこと自体は重要なことだと思ってます。
 その上で、パラメータクエリ化した方が安心なコードができそう・・・
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-07 20:23
引用:

こばさんさんの書き込み (2005-07-07 20:05) より:
 ただそうなると、プログラム側でパラメータクエリを使用した SQL文 をその都度生成するということですよね?
 直に SQL 文書いたほうがラクチンという話になってしまう訳でして・・・


そのように思われるのは自然な反応だと思いますが、やってみるとそんなに面倒くさいもの
ではありません。むしろ、

引用:

 それも、SQL インジェクション を防止するということが目的であれば、致し方なしと考えるべきか。。
 ひとまず、今までの投稿では、「'」→「''」(シングル2つ)に変換して使えば、少なくとも SQL Server では インジェクション されることはなかろうという風な話になってますが、どうなんでしょう。


このような懸念を払拭できたほうが精神衛生上よくはないですか
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-07-07 23:14
NAL-6295です。

引用:

 ひとまず、今までの投稿では、「'」→「''」(シングル2つ)に変換して使えば、少なくとも SQL Server では インジェクション されることはなかろうという風な話になってますが、どうなんでしょう。




Likeに関してはSQL文でそのまま記述した場合は'(シングルクォート)に加えて、入力文字列からは%_[等をエスケープしなくてはいけません。
ちなみにパラメータクエリでも%_[等に関してはエスケープする必要があります。

%は[%]
_は[_]
[は[[]

といった感じで・・・。

#もちろんSQLServerの話です。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2005-07-07 23:19 ]

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