MSDE FunClub
Microsoft Data Engine FunClub
MSDE初心者向けメーリングリスト過去ログ[1522]番
 
[TOP]>[MSDE初心者向けメーリングリスト過去ログ(1522番)]>[ウィンドを閉じる]
 
SQLServer2005時代でも
開発の基本は T-SQL
上巻で T-SQL の基礎作り
 
SQLServer2005時代でも
運用の基本はバックアップ
下巻でバックアップ手法を学びましょう
PASSJ人気コンテンツで学んだ後は下巻でさらなる学習を!
 
ウィンドを閉じる
MSDE/SQLServer FAQ
MSDE / MSDE2000 
技術情報サポート
初心者向け
メーリングリスト
過去ログの表示
技術者向け
メーリングリスト
過去ログの表示
メーリングリスト
活動状況の
表示
MSDE TOP メニュー
MSDEトップメニューに移動します
 

 
SQL インジェクションについて

Date: Wed, 1 Jun 2005 17:17:57 +0900
From: "Akira Horikawa" <who@example.ne.jp>


堀川です、こんにちは

入力されたパラメータの値を使って、SQL文の文字列を組み立てて
その文字列をEXECUTE命令によって実行させるような場合に、
与えられたパラメータの内容を正しく検査していますか?

【続報】OZmallへの不正アクセスの手口は「SQLインジェクション」
http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20050531/161856/

不正アクセスというより、そのようなプログラムを構築した開発者側に
落ち度があると言えるでしょう。


「SQLインジェクション」は、
                  文字列を比較するときにクォートで囲む規則
や
                  SQL文がセミコロン等で実行単位が区切られる
などの性質を応用したものです。

これらは、実行しているデータベースのSQL文の文法によって
その方法は変わりますので、今使用しているデータベースの
SQL文の文法を十分に熟知している必要があります。

例えば、SQLServerで、

      CREATE  TABLE  passwd (
                    id_name   varchar(20) ,
                    id_pass     varchar(20)
      )

のようなユーザ名とパスワードを入れたテーブルがあるとします。

本来、データベースサーバーのテーブルに、生のパスワードを入れること事態、
設計が間違っているのですが、そのことは無視しておきます。


ユーザ名とパスワードが与えられて、そのレコードが存在するかどうかを調べる
場合に、わざわざ動的SQL文を構築する人は居ないと思いますが、もし、
動的SQL文にしたらどうなるでしょうか?

Create Proc  IsOK
    @id   varchar(20) ,
    @ps  varchar(20)
AS
    DECLARE  @SQL  VARCHAR(1000)  --このサイズも本来は考えておく必要あり

    CREATE TABLE #TMP( CHK INT )

    SELECT @SQL =
        'IF EXISTS( '                           +
        '      SELECT * FROM passwd ' +
        '          where(                       ' +
        '             id_name=''' + @id + ''' and id_pass=''' + @ps + ''')
' +
        ')           ' +
        '  BEGIN ' +
        '         SELECT 1 AS CHK'  +
        '  END    ' +
        'ELSE    ' +
        '  BEGIN ' +
        '         SELECT 0 AS CHK'  +
        '  END    '

     INSERT INTO #TMP(CHK)  EXEC(@SQL)
     SELECT * FROM #TMP
GO


   EXEC IsOk  '正しいユーザ名'  ,  '正しいパスワード'

のときは、当然、正しいと判定されます。

しかし、

EXEC IsOk   '正しくないユーザ名'  ,  '正しくないパスワード''   OR
''X''=''X'

のときも、正しいと判定されます。

SQL文を組み立てた文字列を想像すればわかりますが、与えられた文字列が
そのままSQL文になりますので、

                            OR  ''X''=''X'

の文字列が WHERE句の最後に付加され、常に真(True)の状態が成立します。

実際のWHERE句は次のような文字列になります。

 id_name=''' + @id + ''' and id_pass=''' + @ps + ''')    '

 id_name='正しくないユーザ名' and id_pass='正しくないパスワード'   OR
'X'='X' )
                論理演算子は、AND部分がORの前に評価される


このような攻撃?が成立するのは、与えられたパラメータの内容を十分検査
しないで、SQL文を組み立てることに原因があります。


SQL文を自分で組み立てる動的SQL文を使うときは、必ず、パラメータのチェックを
して下さい。
と言いつつ、私が書いた原稿では、パラメータチェックは省略していることが多いで
すね
注釈を書かないと、わかってくれない人が増えているのでしょうか。。。。



-----------------------------------
(株)日本技術ソフト開発
        堀川 明  (Akira Horikawa)
    06月01日(水曜日) 17時17分記
        mailto:who@example.ne.jp
        http://www.horikawa.ne.jp/msde/



[MSDE/SQLServerに関して、今、どんなことにお困りですか?]
よろしければお困りの内容を、電子メールで教えて下さい。
質問を電子メールで作成する


[ウィンドを閉じる]

[MSDE/SQLServer FAQ ]

[MSDE / MSDE2000 技術サポート情報一覧]

MSDE TOP ページに移動する

 
 
 
 
 
 
 
MSDE FunClubに関するご意見・ご要望等ございましたら、
msdefun@horikawa.ne.jp までご連絡下さい。
MSDEを始めとする各種データベースシステムの開発、コンサルタントに関するご要望等は、
msdedev@horikawa.ne.jp までご連絡下さい。