PHP注意urldecodeによるSQL注入ホール
Ihipop学校のDiscuz X 1.5フォーラムが暗されています。そこで午後に喧嘩をしました。Google「Discuz!X 1-1.5 notify_credit.php Blind SQL injection exploid」はご存知です。Disccuzは国内で流行しているフォーラムシステムです。しかし、私は他人のサイトに侵入することには興味がありません。また、それらのコードは書かれません。他人の放ったツールを使って攻撃するいわゆる「ハッカー」を軽蔑しています。コードをざっと見ましたが、このSQL注入ホールはurldecode関数によるものです。PHPマニュアルでは、urldecode関数の下に警告があります。The superglobals$uGET and$uREQUESST are already decoded.Using urldecode()on an element in$uGET or$uREQUEST could have unexpected and dangerous reults.Disczの開発者(初心者と推定される)は蛇足を加えて、一つのurldecodeを追加しました。
foreach($_POST as $k => $v) {
$value = urldecode($v);
$this->setParameter($k, $value);
}
シングル引用符はurlencodeに二回以降%2527で、POST、PHP内部はグローバル変数を生成しています。POSTの時はまずurldecodeを得て、%27を得て、PHPはMagic Quotesの設定を確認しますが、Magic Quotesを開くかどうかは関係なく、%27はaddslashesにならないです。この時はシングル引用符がありません。PHPコードに蛇足を入れてurldecodeを加えると、%27はシングルクォーテーションになります。PHPを初めて勉強した時、学校の図書館の悪い本を読みました。PHPはフォームを扱う時に自動的にurldecodeを書いていないので、自分でurldecode関数を使って復号しました。まとめてみます。1、いい本を選ぶことが大切です。2、urldecode関数を慎む。3、PHPマニュアルの警告に注意してください。原文はhttp://demon.tw/programming/php-urldecode-sql-injection.htmlから来ました。