第3回 サンプルで理解! フォームデータの受け渡し レビュー

続けて.

「$ファイルポインタ」ってなんですか(笑 って思ってマニュアルを検索してみると…

'r' 読み込みのみでオープンします。ファイルポインタをファイルの 先頭に置きます。

みたいな表記は見つかりました.これのことなら「ファイルポインタ」はファイルの読み書き位置(クラシカルな表現で? シーク位置)になるんじゃないかと思います.
fopenの返り値は「リソース」です.ふつーにこのサンプルの場合,$fileでいいんじゃないんでしょうか?

あと前後しますけど/tmpにファイルを置くのは辞めましょうよ.いつかファイル消えちゃうよ?

ちなみに、PHP5では文字列のファイルへの書き出しfopen()、fputs()、fclose()を「file_put_contents()」で、ファイルの内容を文字列として読み込むfopen()、fgets()、fclose()を「file_get_contents()」で実現できます。これら2つの関数は、特に一度にファイル全体を取り扱う(読み込み、書き込み)ときに便利です。

まるでfile_get_contents()もPHP 5からの関数です.

話の流れ的に? sample1.tgzのpurchase.phpに話が移りますが,

>
$order_no = escapeshellcmd($_POST["order_no"]);
$order_file = "/tmp/order" . $order_no . ".txt";<

なんでescapeshellcmd()するのかさっぱり.
NULL文字とかのアタックを回避したいんでしょうか.
ついでに$order_noは値があることがすべてみたいなので,「order_no」に「/../../../../path/to/foo」とかやるとゴミファイルを沢山散らかすことができそうですね.

(省略)
49 ">
(省略)
59 ">
(省略)
67 ">
(省略)
75 ">
(省略)
83 ">
(省略)

完全にXSSの可能性.以下いくつかのコードにも同様に.

12 $now = date("Y/m/d H:i:s", time());
13 $name = escapeshellcmd($_POST["name"]);
14 $name = htmlspecialchars($name);
15 $address = escapeshellcmd($_POST["address"]);
16 $address = htmlspecialchars($address);
17 $apache = escapeshellcmd($_POST["apache"]);
18 $qmail = escapeshellcmd($_POST["qmail"]);
19 $mysql = escapeshellcmd($_POST["mysql"]);
20 $bind = escapeshellcmd($_POST["bind"]);

ですが,最終的にファイルにログとしてこの値を使用したテキストを書き込んでいるようです.
が,そのためになんでescapeshellcmd()とhtmlspecialchars()を連発するのかさっぱり分かりません.
ちなみにescapeshellcmd()は「実行するコマンド文字列」をエスケープする関数で,引数にたいしてのエスケープはescapeshellarg()でやります.

 先に紹介したsample1では、タグを多用しました。それにより発生する問題点(危険性)も先に述べたとおりです。本節では、サーバ変数を利用してサーバ側で各画面間のデータを管理する方法を解説します。

いや入力された値が適切に処理しないと画面に出てくる場合があるだけじゃないでしょ…

1

E_NOTICEが…とかは今回は抜きにするけど先にisset()しないと不当な値をセッションに潜り込ませることができるような気がします.
とりあえずconfirm.phpに不当な値をつっこんでおいて一旦エラー,次にpurchase.phpでなんでもいいのでorder_noをPOSTしてあげる.
これで祭りでしょうか?

いやーサンプル込みの記事を掲載するって怖いです…