2009年2月15日

XSSを防ごう(PHP)

カテゴリー: PHP — admin @ 4:12 AM

関数htmlSanitizingは、1番目の引数に無害化したい文字列、2番目の引数は属性値用にするかどうか(true=する、false=しない)を指定すると、無害化した文字列が返る。ちなみにタグは全削除されるようにしてます。

■サンプルソース

<?php
/**
* sanitize for html
* @return (string) converted string for HTML
*/
function htmlSanitizing($value, $attribute = false){
    if(!is_array($value)){
        if($attribute === true){
            if(preg_match('/^javascript:/i', preg_replace('/[\x00-\x20\x22\x27]/', '', $value))){
                $value = preg_replace('/^javascript:/i', '',preg_replace('/[\x00-\x20\x22\x27]/', '', $value));
            }
            $value = htmlspecialchars(strip_tags($value), ENT_QUOTES);
            return $value;
        }
        else{
            $value = htmlspecialchars(strip_tags($value), ENT_QUOTES);
            return $value;
        }
    }
    else{
        foreach($value as $key => &amp;$val){
            $val = htmlSanitizing($val, $attribute);
        }
        unset($val);
        return $value;
    }
}
?>

■おまけ

再帰してるところで、array_mapを使おうとしたのだが、var_dumpをしたところ、連想配列のキーが削除されてしまったので、foreachとリファレンス(参照渡し)で代用することにした。

■追記

/**
* sanitize for html
* @return (string) converted string for HTML
* @param (array)
*        [attribute] => (bool)
*        [striptags] => (bool)
*        [escape] => (string) 'entities' or 'chars'
*        [quotes] => ENT_COMPAT, ENT_QUOTES or ENT_NOQUOTES
*/
function htmlSanitizing($value, $arg = array()){
    if(!is_array($value)){
        $attribute = (isset($arg['attribute']) && $arg['attribute'] === true)? true : false;
        $striptags = (isset($arg['striptags']) && $arg['striptags'] === true)? true : false;
        $escape = (isset($arg['escape']) && $arg['escape'] === 'entities')? 'entities' : 'chars';
        $quotes = (isset($arg['quotes']) && $arg['quotes'] !== '')?     $arg['quotes'] : ENT_QUOTES;
        $value = ($striptags)? strip_tags($value) : $value;
        $value = ($escape === 'entities')? htmlentities($value, $quotes) : htmlspecialchars($value, $quotes);
        if($attribute){
            if(preg_match('/^javascript:/i', preg_replace('/[\x00-\x20\x22\x27]/', '', $value))){
                $value = preg_replace('/^javascript:/i', '',preg_replace('/[\x00-\x20\x22\x27]/', '', $value));
            }
        }
        return $value;
    }
    else{
        foreach($value as $key => &$val){
            $val = htmlSanitizing($val, $arg);
        }
        unset($val);
        return $value;
    }
}

コメントの返事を書いてる時に、いろいろと考えてみまっしたー。。。三項演算子が嫌いな方はいるかもしれませぬが、こんなんドウでしょうか?

2009年2月12日

ふと思った

カテゴリー: 日記 — admin @ 12:32 AM

書物は、創造力に補填され、個々を越えた個人を我々に与える。

日本の教育はこの点を忘れてはならない。

2009年2月1日

ヒート

カテゴリー: アクション — admin @ 2:18 PM

■評価

☆☆☆☆

■コメント

1995年公開。

アル・パチーノ、ロバート・デニーロ出演。
その他、ヴァル・キルマー、ナタリー・ポートマン、トム・サイズモア出演で贈る、プロフェッショナルに生きる警察の男と犯罪者の男の対決する作品。監督はマイケル・マン。

仕事に生きる家庭生活を持たない刑事ヴィンセント(アル・パチーノ)は、私生活を断ち切った強盗のプロフェッショナルであるニール(ロバート・デ・ニーロ)の起こした事件を担当する。駆け引きをしながら徐々にお互いが接近していき遂に1つのテーブルを共にする。

次に2人が出会う時、それは映画史に残る12分間の銃撃戦で幕を開ける。

お互いの譲れぬプロフェッショナルなスピリッツ、駆け引き、迫力の銃撃戦、その全てが見逃せない。

2009年2月1日

スターリングラード

カテゴリー: アクション, 戦争 — admin @ 2:13 PM

■評価

☆☆☆☆

■コメント

2001年公開。

ジュード・ロウ主演。
エド・ハリス、ジョセフ・ファインズ出演で贈る重厚な作品。
監督は巨匠ジャン=ジャック・アノー。

1942年、ドイツ軍の猛攻にあって瓦礫と化したソ連のスターリングラードで起こった、スナイパー対決の実話。極限の対決から伝わる凄まじい緊迫感、役者の演技、壮大なセット、美術…ケチのつけどころが無い!

ラストシーンのエド・ハリスの演技だけでも買う価値がある映画。人間の驚異的な何かを表現した瞬間を見れる映画は数少ない。

2009年2月1日

魔法にかけられて

カテゴリー: ラブストーリー — admin @ 2:01 PM

■評価

☆☆☆

■コメント

絵本の中の登場人物が現実世界にやってくるというディズニーらしい作品。コメディ的な要素もあり微笑ましい作品。子供と一緒に見れるタイプの映画だ。ただチョット結末が個人的にドウかと思う。