PEAK XOOPS - anti-XSS system (2) in englishin japanese

Archive | RSS |
PHP
PHP : anti-XSS system (2)
Poster : GIJOE on 2006-06-21 15:27:40 (10959 reads)

in englishin japanese
昨日書いた「大きな傘」たりえるXSS対策のコード編です。
理屈はすでに述べた通りですが、これをどうコードに落とすかについては、実はまだ迷いがあります。
とりあえず、一番簡単なパターンだとこんな感じでしょうか。

(1) ファイルを作成
/usr/local/lib/php/bigumbrella.php


<?php
function bigumbrella_init() {
        foreach( $_REQUEST as $key => $val ) {
                if( preg_match( '/[<\'"].{15}/s' , $val , $regs ) ) {
                        $GLOBALS['bigumbrella_doubtfuls'][] = $regs[0] ;
                }
        }
        if( ! empty( $GLOBALS['bigumbrella_doubtfuls'] ) ) {
                ob_start( 'bigumbrella_outputcheck' ) ;
        }
}

function bigumbrella_outputcheck( $s ) {
        if( ! is_array( @$GLOBALS['bigumbrella_doubtfuls'] ) ) {
                return "bigumbrella injection found." ;
        }

        foreach( $GLOBALS['bigumbrella_doubtfuls'] as $doubtful ) {
                if( strstr( $s , $doubtful ) ) {
                        return "XSS found." ;
                }
        }
        return $s ;
}

$GLOBALS['bigumbrella_doubtfuls'] = array() ;
bigumbrella_init() ;
?>


(2) httpd.conf の各VirtualHost内に1行追加。

php_value auto_prepend_file /usr/local/lib/php/bigumbrella.php

php.ini に記述することも可能です。

auto_prepend_file = /usr/local/lib/php/bigumbrella.php


大事なのは、このXSS対策は、ホスト単位で守らないと意味がないことです。それ故の、httpd.conf指定、または、php.ini指定です。auto_prepend_file は、PHP_INI_PERDIRなので、.htaccessで指定してもOKですが、結果的にこの「傘」に守られない同一ホストのファイルができてしまうようでは、意味がない可能性があります。

実は、まだ上記のコードは不完全です。例えば、GETのXSS攻撃を同名のPOSTでカモフラージュすることが可能ですし、「HTML許可したプレビュー」なんて条件での回避策がありません。というわけで、もう少しまともなコードは(3)へと続きます。(時間がなくて細切れにてすみません…)

とりあえず、このanti-XSSを命名だけしちゃいます。

「ビッグ・アンブレラ・anti-XSS・システム」

なんとも、洋館に巨大なゾンビがうようよしてそうな名前ですが

0 comments

Related articles
Printer friendly page Send this story to a friend

Comments list

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!