[PHP-users 32380] Re: PHPを使ってのPostgresqlについて

Yasuo Ohgaki yohgaki @ ohgaki.net
2007年 7月 6日 (金) 08:18:38 JST


大垣です。

kanonbell さんは書きました:
> そういえばもう怪談の季節ですねえ。。
> 文字エンコーディングを利用したってのはこういうののことでしょうか?
> SQLインジェクションじゃなくてXSSですけど。
> http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino01.html
> 
> 気になって使用しているADOdbのソース見てみましたが、うーん。。
> 通常のPrepared Statementでは、MSSQLとかだとエミュレーションされてて、
> 入力値はstr_replaceで普通に置換されてました。mssql_bind使えない
> 理由でもあるのかしらん。どーなんだろこれ。。

MSSQLの場合、SJISが文字エンコーディングである可能性が非常に高いので
かなり致命的ですね...

> 
> よろしければ、str_replaceだと防げない攻撃方法の手順や、pg_escape_string
> のようなエスケープ関数がない場合のエスケープ方法など教えていただけませんか?
> 上の記事と同様なら、いったんmb_convert_encodingくぐらせるのかな。

詳しい攻撃方法を説明には文字数が必要なので簡単に説明すると、基本的な
攻撃手法は2種類あります。

- マルチバイト文字に無条件にエスケープ文字を追加させ特殊文字を無効化させる方法
- マルチバイト文字の開始データ(SJISの1バイト目など)で特殊文字を無効化する方法

XSSだと文字エンコーディングの明示的な切り替えを利用してJavaScriptを実行
させる方法もあります。
# <script>に見えないように複数の文字エンコーディングを利用して隠す、等

XSSもあるのでmb_check_encoding関数で入力のバリデーション時にチェックし、
さらにstr_repalceでなく文字エンコーディングを考慮するmb_ereg_replaceで
置換するようにすればOKです。

海外フレームワークのバリデーションコードには文字エンコーディングのバリ
デーションが全く欠落している物がほとんどですが、本当は必須のバリデーショ
ンです。

-- 
Yasuo Ohgaki : yohgaki @ ohgaki.net : http://www.ohgaki.net/



PHP-users メーリングリストの案内