- - PR -
SQL インジェクションの防止
1|2|3|4|5
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 2005-07-07 11:11
Formに入力された"uid"と"pas"そのものに変な文字列が混ぜられていないか
評価しないとマズいと思いますよ。 あと、select では * を使わずに必要なフィールドだけを指定した方がいいかもしれません。 _________________ がうしぇ 人生のデザインパターン.... | ||||
|
投稿日時: 2005-07-07 11:28
がうしぇさん、早速ありがとうございます。
>変な文字列が混ぜられていないか それに尽きるのは分かりますが、「変な文字」が漠然しすぎて、想定すべき「変な文字」の具体例が分からないもので質問させて頂きました。 >select では * を使わずに必要なフィールドだけを はい、例でこのように書きました。私も「*」は嫌いです。 #価格.comが、どのような文字列によって SQL インジェクション されたのか知りたいところです・・ #まさか、「';SELECT 〜」ではないですよねぇ・・・ | ||||
|
投稿日時: 2005-07-07 11:46
ちょいと量が多いかも知れませんが、SQLの予約語をマークしてみるとかはいかがでしょう? | ||||
|
投稿日時: 2005-07-07 12:17
NAL-6295です。
素直にパラメータ利用したほうが良いかも? ちなみに、『.NETエンタープライズWebアプリケーション 開発大全』シリーズでも、触れられています。Vol2かVol3だったかな。失念してしまいました。 | ||||
|
投稿日時: 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については分からないので有識者の方の意見を聞いて下さい(汗)) | ||||
|
投稿日時: 2005-07-07 13:15
SQLインジェクションだけであれば、基本的にパラメータクエリを使えば防げます。 また、接続用アカウントに余計な権限を持たせないとか、SQLのエラーメッセージをそのまま 出力しないなどは基本的なレベルの対策になると思います。 XSS対策のためのサニタイジングは、どちらかといえばDBに登録されたデータをWebページに 出力する際におこなうものですね。 | ||||
|
投稿日時: 2005-07-07 13:54
みなさんが書かれているパラメータクエリ、とても有益なことは分かってますが、SQL 文を直に書くほうが楽で融通きくことも多いもので・・・(--;)
私も冬寂さんが書かれているように、「'」さえ対策すれば解決すると思って、先に書いた方法でコーディングしたものが公開 Web で運用されてたりしてます。 (果たして大丈夫だろうか) >XSS対策のためのサニタイジング asp 風に書くと、Server.HTMLEncode([文字列]) ですね。 |
1|2|3|4|5
次のページへ»