- PR -

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

投稿者投稿内容
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-07-07 10:22
 SQL Server において、SQL インジェクション を防止するため、ユーザーによる入力文字中の「'」を「''」(シングル2つ)に予め Replace して SQL 文を作ってます。

例) asp 風に書くと

select * from account
where uid='<%= Replace(Request.Form("uid"), "'", "''") %>'
and pass='<%= Replace(Request.Form("pas"), "'", "''") %>';

 これだけで防止できると考えると危険でしょうか。

[ メッセージ編集済み 編集者: こばさん 編集日時 2005-07-07 18:40 ]
がうしぇ
大ベテラン
会議室デビュー日: 2002/02/26
投稿数: 110
お住まい・勤務地: 住:神社の裏山 勤:天神さんの裏手
投稿日時: 2005-07-07 11:11
Formに入力された"uid"と"pas"そのものに変な文字列が混ぜられていないか
評価しないとマズいと思いますよ。

あと、select では * を使わずに必要なフィールドだけを指定した方がいいかもしれません。
_________________
がうしぇ
人生のデザインパターン....
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-07-07 11:28
がうしぇさん、早速ありがとうございます。

>変な文字列が混ぜられていないか

 それに尽きるのは分かりますが、「変な文字」が漠然しすぎて、想定すべき「変な文字」の具体例が分からないもので質問させて頂きました。

>select では * を使わずに必要なフィールドだけを

 はい、例でこのように書きました。私も「*」は嫌いです。


#価格.comが、どのような文字列によって SQL インジェクション されたのか知りたいところです・・
#まさか、「';SELECT 〜」ではないですよねぇ・・・
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2005-07-07 11:46
引用:

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

>変な文字列が混ぜられていないか

 それに尽きるのは分かりますが、「変な文字」が漠然しすぎて、想定すべき「変な文字」の具体例が分からないもので質問させて頂きました。


ちょいと量が多いかも知れませんが、SQLの予約語をマークしてみるとかはいかがでしょう?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-07-07 12:17
NAL-6295です。

素直にパラメータ利用したほうが良いかも?
ちなみに、『.NETエンタープライズWebアプリケーション 開発大全』シリーズでも、触れられています。Vol2かVol3だったかな。失念してしまいました。
冬寂
ぬし
会議室デビュー日: 2002/09/17
投稿数: 449
投稿日時: 2005-07-07 13:05
SQL ServerとかASPとかについては全然分からないのですが、少し気づいた事をちょっと。

例がaspなので、ひょっとしてクロスサイトスクリプティング(XSS)とSQLインジェクションをごっちゃにして考えてるのかと思ってしまいました。
XSSとSQLインジェクションの対策に必要なサニタイズは全く違うので、もし同じに考えてたとしたら危険です。
(もし私の思い違いだとしたらすみません。)

で、SQLインジェクションは、私の知る限りでは次の2例

1.「select * from a where id = 数値」
の場合に、数値が入るべき所に「1;update 〜」などと入れられたりする。

2.「select * from a where name like '文字列'」
の場合に文字列が入るべき所に「' or 1 = 1」などと入れられたりする。

ですので、1の場合は数値かのチェック、2の場合にはシングルクォートをエスケープする処理が対策として有効だと思います。

(って、たぶんNAL-6295さんの言われてるパラメータクエリを使用すれば大丈夫だと思うんですけどね。すみませんが、SQL Serverについては分からないので有識者の方の意見を聞いて下さい(汗))
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-07 13:15
引用:

冬寂さんの書き込み (2005-07-07 13:05) より:
(って、たぶんNAL-6295さんの言われてるパラメータクエリを使用すれば大丈夫だと思うんですけどね。すみませんが、SQL Serverについては分からないので有識者の方の意見を聞いて下さい(汗))


SQLインジェクションだけであれば、基本的にパラメータクエリを使えば防げます。
また、接続用アカウントに余計な権限を持たせないとか、SQLのエラーメッセージをそのまま
出力しないなどは基本的なレベルの対策になると思います。

XSS対策のためのサニタイジングは、どちらかといえばDBに登録されたデータをWebページに
出力する際におこなうものですね。
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2005-07-07 13:54
 みなさんが書かれているパラメータクエリ、とても有益なことは分かってますが、SQL 文を直に書くほうが楽で融通きくことも多いもので・・・(--;)

 私も冬寂さんが書かれているように、「'」さえ対策すれば解決すると思って、先に書いた方法でコーディングしたものが公開 Web で運用されてたりしてます。
(果たして大丈夫だろうか)


>XSS対策のためのサニタイジング

 asp 風に書くと、Server.HTMLEncode([文字列]) ですね。

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