昨日書いた「大きな傘」たりえる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() ;
?>
php_value auto_prepend_file /usr/local/lib/php/bigumbrella.php
auto_prepend_file = /usr/local/lib/php/bigumbrella.php