クロスサイトスクリプティング対策の落とし穴
単なる文字列の置換に「ereg_replace」を利用することに疑問を持ち、その後のバイナリセーフではないので危険という展開も強引な気がします。
文字列の置換ならば「str_replace」、正規表現を利用した置換ならば、マニュアルにeregは遅いという旨の記述があり「preg_replace」を選択するでしょう。
ereg_replaceはバイナリセーフでないですし、preg_replaceを利用しましょう。
サニタイズに関しては<>を削除すればOKという教えるようなところは今時ないです、たぶん。
PHPなら「htmlentities」「htmlspecialchars」を利用しようと簡単に済ませてあるのが大半です。
その際に第二引数にENT_QUOTESを利用しなければいけないという展開がベターであり希望するところです。
ヌルバイトアタック、マルチバイト崩れに関しては、前記の問題よりも認知度が低いと思われるので、実例を挙げた上で対処法ともう少しスペースを割いて欲しいと思いました。
ヌルバイトアタックは「\0」を取り除く方法で対処するが、その際にバイナリセーフではない関数は利用できません。
$str = str_replace("\0", '', $str);
崩れたマルチバイト文字に関しては、エンコード変換を通すことによって取り除くことが可能です。
$str = mb_convert_encoding($str, 'SJIS-win', 'SJIS-win');
Sanitizeという言葉が嫌いなようですが、これは認識の違うのかなと思います。
個人的には、入力値に対しての処理がValidation、出力の際の処理がSanitize。
ヌルバイトアタック、マルチバイト崩れに対するValidation、<>’”を処理するSanitize。
2つでセット。
XSSを防ぐには常にこのSanitizeとValidationが必要です。
vimのplugin「snippetsEmu」のPHP用すにぺっと。
自分用にPEAR準拠チックに書き換えて使ってます。
phpdocは別のプラグイン使うといいと思うよ。
winなら
$HOME\vimfiles\after\ftplugin\php_snippets.vim
その他は
$HOME/.vim/after/ftplugin/php_snippets.vim
if !exists('loaded_snippet') || &cp
finish
endif
let st = g:snip_start_tag
let et = g:snip_end_tag
let cd = g:snip_elem_delim
exec "Snippet elseif elseif (".st."condition".et.") {<CR><Tab>".st.et."<CR>}<CR>"
exec "Snippet do do {<CR><Tab>".st.et."<CR>} while (".st.et.");<CR>".st.et
exec "Snippet reql require_once '".st."file".et."';<CR>".st.et
exec "Snippet if? $".st."val".et." = (".st.et.")? ".st.et.": ".st.et.";<CR>".st.et
exec "Snippet php <?php<CR>".st.et."<CR>?>"
exec "Snippet switch switch (".st."variable".et.") {<CR>case ".st.et.":<CR><Tab>".st.et."<CR><Tab>break;<CR>".st.et."<CR>default:<CR><Tab>".st.et."<CR><Tab>break;<CR>}<CR>".st.et
exec "Snippet class class ".st."ClassName".et."<CR>{<CR><TAB>".st.et."<CR><Tab>function __construct(".st.et.")<CR><TAB>{<CR><Tab><Tab>".st.et."<CR><Tab>}<CR><Tab>".st.et."<CR>}<CR>"
exec "Snippet incll include_once '".st."file".et."';<CR>".st.et
exec "Snippet incl include '".st."file".et."';<CR>".st.et
exec "Snippet foreach foreach ($".st."variable".et." as $".st."key".et." => $".st."value".et.") {<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet ifelse if (".st."condition".et.")<CR>{<CR>".st.et."<CR>}<CR>else<CR>{<CR>".st.et."<CR>}<CR>".st.et
exec "Snippet $_R $_REQUEST['".st."variable".et."']".st.et
exec "Snippet $_S $_SERVER['".st."variable".et."']".st.et
exec "Snippet $_G $_GET['".st."variable".et."']".st.et
exec "Snippet $_P $_POST['".st."variable".et."']".st.et
exec "Snippet $_C $_COOKIE['".st."variable".et."']".st.et
exec "Snippet case case ".st.et.":<CR><Tab>".st.et."<CR><Tab>break;<CR>".st.et
exec "Snippet print print \"".st."string".et."\"".st.et.";".st.et."<CR>".st.et
exec "Snippet function function ".st."functionName".et."(".st.et.")<CR>{<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet if if (".st."condition".et.") {<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet else else {<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet array $".st."arrayName".et." = array(".st.et.", ".st.et.");".st.et
exec "Snippet -globals $GLOBALS['".st."variable".et."']".st.et.st."something".et.st.et.";<CR>".st.et
exec "Snippet req require '".st."file".et."';<CR>".st.et
exec "Snippet for for ($".st."i".et." = ".st.et."; $".st."i".et." < ".st.et."; $".st."i".et."++) {<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet while while (".st.et.") {<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet define define('".st."CONSTANT".et."', ".st.et.");<CR>".st.et
exec "Snippet const const ".st."CONSTANT".et." = ".st.et.";<CR>".st.et
exec "Snippet public public function ".st."functionName".et."(".st.et.")<CR>{<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet protected protected function ".st."functionName".et."(".st.et.")<CR>{<CR><Tab>".st.et."<CR>}<CR>".st.et
exec "Snippet private private function ".st."functionName".et."(".st.et.")<CR>{<CR><Tab>".st.et."<CR>}<CR>".st.et
■気軽に悩み相談して 女性警官に「姉妹」制度 島根県警
お待ちなさい、旭日影が曲がっていてよ
■Winnyユーザーへの求刑は軽すぎる
まず分散数=被害額、ダウンロード数=購入予定数という考えを改めたほうがよいかと
■著作権侵害ファイルをダウンロードしていないのに金を払えと言われた
■マスコミが隠す世界のタブー
信憑性はおいておいて読み物としてはなかなかおもしろかった
■Ruby on Railsで10分で作るTwitterもどき
■Windows Vista のダウングレード権 (旧バージョンソフトウェアの使用) について
OEM版およびVL版Windows Vista Business、UltimateからXP他へダウングレード(ある意味アップグレード?)できる
メディアは提供されない、同時起動は、ライセンス移行は許可されない
■吉野紗香のブログにキチガイ流入、大炎上騒ぎ発生についての回顧
現在、多数のお問い合わせをいただいている利用規約違反行為について
チート対策にnProtect GameGuardをメモリ監視に使っていたんですが、あっけなく破られチートし放題との噂。
nProtect GameGuardはPSUにも導入されていて、同じようにチートが、といってもそれ以前の問題で人がごっそり減っていたのでさほど話題になりませんでしたが。
MHFといい、PSUといい、nProtect GameGuardを導入しているMOはオンラインゲームなのにクライアントにデータを保持しているという謎。
使いまわしなんだろうけど、オンラインゲームを本気で運営するなら設計し直さないと。
それで採算とれるかは怪しいですが。
チート対策で見積もれない工数、ユーザー減少、企業イメージダウンを考えれば、ね。
結局対策としては、nProtect GameGuardを利用するしかなく、ゲームどころかOSの挙動までおかしくなってる始末。
掲示板が荒れております。
夏休みだから人員足りないんだろうけど、対応の悪さはいただけない。
なんだかねー。
yohei-y:weblog: APP の標準化作業がほぼ終了
AtomPPの標準化がほぼ終了したらしいですよ。
もうAtomPPと呼ぶのはナウくないらしいですが。
Atom API→AtomPP→APP?Atompub?
CPANにもAtompubで登録されたようなのでAtompubで。
XML-RPC、SOAPと並んでよく名前がでてくるREST。
ここの中でRESTはプロトコルではなくHTTPで「GET」「POST」「PUT」「DELETE」使って管理しようねという考え方で仲間はずれ。
RESTを取り入れてプロトコル化されたものがAtompub。
PerlではAtompub 0.0.1 リリースされています。
ちなみにPHPはPEPrでXML_Atomがドラフトのまま冬眠しています。
クライアントならHTTP_RequestやHTTP_Client+XMLで実装できるからいいけど。
サーバはフレームワークで実装されてたりすると楽なんだけど。
django-atompubってのは発見したけどRoR(NOT Rise of Nations:Rise of Legends)は軽く探したけど見つからず。
symfonyとかcakePHPとかなんかやってる様子もみあたらず。
サーバのユーザ認証はBasicかWSSEですかね。
Basic認証はplaintext passwordだしWSSE認証ですよねーとか思ったけど、サーバがplaintext password知っていないといけない罠。
可逆暗号しないとですね。
可逆暗号のススメは天下のアシアル様の連載ですが、サンプルは想定された動作はしないので注意が必要です。