SQLの勉強の過程で参考になった記事@PHPプログラマがおかしがちなミスTOP10

 - by naoki

SQLの勉強をしているときに出会ったサイト。
PHPSPOT開発日記さんのエントリーで参考になったものがあったので、ここに残しておきます。
すごく初歩的なことなんだけど、独学でやってる身としては参考になりました。

以下初級PHPプログラマがおかしがちなミスTOP10参照。
参照元URL:http://phpspot.org/blog/archives/2007/01/php_71.html

「PHPプログラマがおかしがちなミスTOP10」、という記事があったので紹介。
PHP初心者だとこういうミスがよくありますね。ということで今年からPHPをはじめようと思っている人には気をつけてほしいリストです。

生でクエリを出力しない
echo $_GET[‘username’];

echo htmlspecialchars($_GET[‘username’], ENT_QUOTES);

やらないとクロスサイトスクリプティングされます。
SQLクエリに$_GET,$_POST,$_REQUESTの値を直接含めない
$sql = “select * from table where id=”.$_GET[“id”];

$sql = “select * from table where id=?”; (プレースホルダを使う)
やらないとSQLインジェクションされます。
header, session_start, setcookieを何か出力した後に実行
悪い例)
echo “HOGE”;
header(“Location:/html/”);

// echo “HOGE”;
header(“Location:/html/”);
出力処理を先に行うとちゃんとheader関数が実行されません。session_start, setcookieも同様。
何かの出力処理の前に実行したい場合は出力をバッファリングしておいて、header呼び出しの後にバッファを出力する。
ユーザクエリを元にincludeしない
include($_GET[“filename”]);
そもそもこういったコーディングは危険なので避けるべきです。サーバにあるファイルが覗かれてしまいます。
php.iniのopen_basedirによる制限などもしておいた方がよいですね
php.iniのmagic_quotes設定による自動エスケープの罠
このオプション設定によって ‘ , ” , , NUL が自動エスケープされますが、それによってデータにエスケープ文字がはいってしまうという問題がありますね。
addslashes関数による2重エスケープなんかも起こることがあります。
マニュアルに、「マジッククオートは、PHPスクリプトに入力されるデータを 自動的にエスケープする機能です。 コードでは、マジッククオートをオフにして 実行する際必要な時にデータをエスケープすることが望まれます。」とあるので、それに従った方が良さそうです。
オープンソースなプログラムなんかでは、phpの設定は関係なく、どのサーバでもちゃんと動くようにget_magic_quotes_gpc関数によって設定を調べてstripslashesで取ったりする必要がありますね。

Leave a comment