[PHP-dev 667] Re: hiddenフィールドの検証コードの実装

Hiroyuki Toda php-dev@php.gr.jp
Thu, 12 Dec 2002 00:25:28 +0900


どうもこんにちわ 戸田@日本ノーベルです。

2002/12/10 10:57:50頃の小泉さんからのメールです。
(Subject: [PHP-dev 663] Re: hiddenフィールドの検証コードの実装 )

Moriyoshi> 補助関数的なものがどのようになっていくかも楽しみですが、
Moriyoshi> もしフォームの変数を取り扱うためのパッケージ的なものになるんでしたら
Moriyoshi> とても興味深いですね。

大掛かりなものを作るつもりはありません。
とりあえず、検証コードを生成(及び、hiddenフィールドの出力)するための
補助関数output_hidden, 検証コードを検証するための補助関数validationを
作成しましたので投稿します。

function output_hidden($secret, $array, $vc_name = "vc")
{
        $v_array = array();
        while(list($key, $val) = each($array)){
                echo "<input type=\"hidden\" name=\"$key\" value=\"$val\" />\n";
                array_push($v_array, "$key:$val");
        }

        $vc = verify_code_md5($secret, $v_array);
        echo "<input type=\"hidden\" name=\"$vc_name\" value=\"$vc\" />\n";
}

function validation($secret, $validate_code, $array)
{
        $v_array = array();
        while(list($key, $val) = each($array)){
                $key = $val;
                $val = $_POST[$key];
                array_push($v_array, "$key:$val");
        }

        $vc = verify_code_md5($secret, $v_array);

        return $vc == $validate_code ? true : false;
}

使い方は簡単で、output_hiddenでは$arrayにhiddenフィールドとして
出力する各項目の連想配列を与えます。$vc_nameは検証コード用の
hiddenフィールドの名前です。(デフォルト: "vc")

output_hidden("secret_000", array("test1"=>"abc", "test2"=>"def", "test3"=>"ghi"));

出力結果: 
<input type="hidden" name="test1" value="abc" />
<input type="hidden" name="test2" value="def" />
<input type="hidden" name="test3" value="ghi" />
<input type="hidden" name="vc" value="969f580b7c7bd730226b4d6c861cc876" />


validationでは、$validate_codeにhiddenフィールドから受け取った
検証コード、$arrayには検証範囲となるhiddenフィールドのフィールド名
の名前の配列を与えます。

validation("secret_000", $_POST['vc'], array("test1", "test2", "test3"));

検証が正常に完了した場合はtrue, そうでない場合はfalseが戻ります。


output_hiddenとvalidationでは配列の使い方が非対称になっていますが、
一番ユーザにとって使いやすいと思われる構文を採用してみました。


尚、上記の補助関数の関係で、validate_code_md5本体自体にも多少手を
加えていますが、あまり本質的な変更ではありませんので、今回は投稿を控えたいと
思います。





それでは戸田@日本ノーベルでした。