PHPとCGIのXSSクロスサイトスクリプティング対策関連
「はてな」界隈で只今なにかと
【これはえがい人の脆弱性】
ただそれは「クロスサイトスクリプティング(XSS)」という問題に対処出来ていなかったからだけど、少しその方法に困ったらしく助言(というか全部直してもらう)を求めていたようだ。
【エガミくんの脆弱性のやつ】
【Re:Re:Re:Re:Re:Re:エガミくんの脆弱性のやつ】
htmlspecialchars関数と「HTMLの中をちゃんと "" で囲む」というのができていなかったらしい。
APIが使えて、こういう基本的なものが分からなかったというのは若者らしいとは思いつつ、基本的な事を再確認させてくれたのかなってことで。
PHPだとhtmlspecialchars関数いがいにも色々対処法があるらしいので以下にそのリンク先。
【PHPでのセキュリティ対策についてのメモ - Liner Note】
入力時エスケープ処理に対する方法と是非
【XSSの脆弱性を限りなくなくす方法[to-R]】
【水無月ばけらのえび日記:「入力時に文字参照に変換するのがよろしくない理由」】
【UK STUDIO:XSS対策に入力時エスケープは非常にややこしい】
【PHP: htmlspecialchars - Manual】
┗ htmlentities()
【配列データに一気にhtmlspecialcharsをかける - phpspot】
strip_tags(文字列からHTMLおよびPHPタグを取り除く)なんてのもあるけど、注意した方が良さそうではある。
【文字列からタグを取り除く関数 - phpspot】
ところでココまでPHPについての対処法ですけど、CGIの場合にも起こりうる訳で対処をしないといけない。
いわゆる「タグ除け」の処理でいいのカナ?
■CGIの場合のタグ除けの例
他に「tag_change関数」とかも。
【不正なタグの除去】
■tag_change関数
【便利なサブルーチン関数集】
スクリプトのソースコードを眺めていると分かってくる事もある。
【返信機能付き掲示板】[ソースコード]
【プログラミングコンテスト】[ソースコード]
他のCGIに置けるタグ除去の方法
【HTMLタグを取り除く - にししの Perl/CGI Tips ふぁくとりー】
【HTML-TokeParser-Simpleを使ってHTMLタグを除去する - TechMemo】
【HTML文字列からJavaScriptタグなどを除去する、nsIScriptableUnescapeHTML - FAX】
■クロスサイトスクリプティング関連
【クロスサイトスクリプティング - Wikipedia】
【@IT:クロスサイトスクリプティング対策の基本】
【「XSS脆弱性は危険,Cookieを盗まれるだけでは済まない」専門家が注意喚起:ITpro】
もし他に考えうる対策や問題があれば教えてください。
入力時エスケープ処理に対する方法と是非
【XSSの脆弱性を限りなくなくす方法[to-R]】
【水無月ばけらのえび日記:「入力時に文字参照に変換するのがよろしくない理由」】
【UK STUDIO:XSS対策に入力時エスケープは非常にややこしい】
【PHP: htmlspecialchars - Manual】
┗ htmlentities()
【配列データに一気にhtmlspecialcharsをかける - phpspot】
strip_tags(文字列からHTMLおよびPHPタグを取り除く)なんてのもあるけど、注意した方が良さそうではある。
【文字列からタグを取り除く関数 - phpspot】
ところでココまでPHPについての対処法ですけど、CGIの場合にも起こりうる訳で対処をしないといけない。
いわゆる「タグ除け」の処理でいいのカナ?
■CGIの場合のタグ除けの例
#タグ除け
$com = ~s/< /g;
$com = ~s/>/> /g;
他に「tag_change関数」とかも。
【不正なタグの除去】
■tag_change関数
sub tag_change {
local($_) = $_[0];
1 while s/(.*)(<(img([!-:A-~\s\=]+))>)/$1<img$4>/i;
1 while s/(.*)(<(font[\s\w\=\#\"\']+)\>(.*)\<\/font\>)/$1<$3>$4<\/font>/i;
1 while s/(.*)(<(b)>(.*)<\/b>)/$1<b>$4<\/b>/i;
1 while s/(.*)(<(i)>(.*)<\/i>)/$1<i>$4<\/i>/i;
$_;
}
【便利なサブルーチン関数集】
スクリプトのソースコードを眺めていると分かってくる事もある。
【返信機能付き掲示板】[ソースコード]
【プログラミングコンテスト】[ソースコード]
他のCGIに置けるタグ除去の方法
【HTMLタグを取り除く - にししの Perl/CGI Tips ふぁくとりー】
【HTML-TokeParser-Simpleを使ってHTMLタグを除去する - TechMemo】
【HTML文字列からJavaScriptタグなどを除去する、nsIScriptableUnescapeHTML - FAX】
■クロスサイトスクリプティング関連
【クロスサイトスクリプティング - Wikipedia】
対策
クロスサイトスクリプティングの対策は、いくつかの例外を除き、出力値のエスケープを適切に施すことである。
HTMLの実体参照を用い、& を & に、< を < に、> を > に、" を " に、それぞれ置換する。
タグの属性値は必ず "〜" (ダブルクオート)で括る。また属性値中のエスケープを忘れない。例:
例外は以下のような場合である。
入力値をURIとして用いる場合(リダイレクタなど)
許可するスキームを定め、それ以外のスキームを持つURIは拒否する。
入力値をスタイルシートとして使用する場合
許可する構文を定め、それ以外の使用は拒否する。スタイルシート中のスクリプト起動方法は多様であり、ブラックリスト方式で完全に抑制することは難しい。
入力中の一定のタグをHTMLとして反映したい場合(例: ウィキ)
ホワイトリスト(許可リスト)を使用した出力タグ、あるいは属性の制限を行う。制限には上述のURI中のスキーマ制限や、スタイルシートへの制限を当然に含む。
【@IT:クロスサイトスクリプティング対策の基本】
【「XSS脆弱性は危険,Cookieを盗まれるだけでは済まない」専門家が注意喚起:ITpro】
もちろん,Cookieを盗まれることもリスクの一つである。しかしそれよりも,「XSS脆弱性が存在するサイト上に,偽のログイン画面や個人情報入力画面を作られることのほうが深刻だ」(徳丸氏)。フィッシング詐欺への悪用である。
もし他に考えうる対策や問題があれば教えてください。