「WeeklyCMS 6/24 マイクロソフト本社特番03」はセキュリティ回で、ちょっと補足したほうがいいかなーと思ったんで、ブログエントリにしちゃいます。XOOPSモジュール開発しようって人に参考になればなぁと。
WeeklyCMS 6/24 マイクロソフト本社特番03
Check Secure Code (04:47〜)
$_POST/GETをforeach展開
foreach ( $_POST as $key => $value ) { $$key = $value; }
「見かけたら即デリート」ということで、危険性と置き換え方がはしょられてる。時間の都合かなーと思いつつ…。
こういうコードの危険性としては、$_SERVERなどの変数を容易に乗っ取られてしまう点。置き換え方は、必要な変数だけ定義するようにすること。たとえば、下の例のように。
// title, text, posterだけがあればいいとき $title = $_POST['title']; $text = $_POST['text']; $poster = $_POST['poster'];
intvalはエースケープ関数じゃない^^;
bluemoonさんによると、下の例がまずいらしい。
$hoge = isset($_GET['hoge']) ? $_GET['hoge'] : 0 ;
そして、整数を受け取る前提のものは、次のように書き換えるべきだとしてる
$hoge = isset($_GET['hoge']) ? intval($_GET['hoge']) : 0 ;
最初に整数にしといたほうが安全になるのは確か。HTMLに出すとき、SQLのクエリに入れるときのどちらにも対応できるから。でも、ユーザの入力を勝手に書き換えるのはあまりベストじゃない。だから、この場合は$_GETから取るときはintvalしないでおいて、HTMLに出すときにhtmlspecialchars($hoge, ENT_QUOTES, 'UTF-8')、SQLのクエリにするときにmysql_real_escape_string($hoge)しておくのがいいと思う。
htmlspecialchars()はHTMLに出す直前に
「文字列だったら、htmlspecialcharsで」とのこと。そしてそのサンプルがこれ。
$hoge = isset($_GET['hoge']) ? htmlspecialchars($_GET['hoge'], ENT_QUOTES) : "" ;
そのとおりなんだけど、$_GETから取った直後にhtmlspecialchars()をかけることはXOOPSのモジュールではほとんどない。Smartyに変数を渡す直前でやるのが通常かなと。なぜなら、リクエストをもとに何かデータをこねくり回す(DBを参照したり)ことが多いから。そのとき、HTMLエンコードされた文字列だといろいろ不便だから。なので、やっぱりこれもintval同様に$_GETから値をとった段階では生にしとく。
$hoge = isset($_GET['hoge']) ? $_GET['hoge'] : "" ; // $hogeをもとにデータをこねくり回す処理 $hoge = htmlspecialchars($hoge, ENT_QUOTES, 'UTF-8'); $xoopsTpl->assign('hoge', $hoge); // smartyに$hogeを渡す
SQL Injection (6:01〜)
addslashes()じゃなくてmysql_real_escape_string()を使おう
録画の中でSQLインジェクションの対策として、addslashes()関数をつかうことを勧めてる。addslashes()でも、SQLのエスケープをうまくやってくれる。実際に、XOOPSのコードのいたるところにaddslashes()がある。でも、addslashes()はクエリエスケープ用の関数じゃないので、SQLインジェクション対策に使うのはちょっと意味が違う。やっぱり、ここはMySQL専用エスケープ関数のmysql_real_escape_string()を使おう。
Mac大好きなmikageさんが会場がMicrosoftなのに「PCじゃなくてMacです、PCというとWindowsです」と言っちゃってるとこを見て、ポカリふきそうになったw そのあと、Microsoftの武田さんが発表の前振りで「すいません、PCでっ」ってww6/24ほんとに行きたかったし、行けなくてもリアルタイムで放送見たかったよーT_T