それらをファイルに詰め込み、fun.php という名前を付けます
<?php function passport_encrypt($txt, $key) { srand((double)microtime() * 1000000); $encrypt_key = md5(rand(0, 32000)); $ctr = 0; $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; $tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]); } return base64_encode(passport_key($tmp, $key)); } function passport_decrypt($txt, $key) { $txt = passport_key(base64_decode($txt), $key); $tmp = ''; for($i = 0;$i < strlen($txt); $i++) { $md5 = $txt[$i]; $tmp .= $txt[++$i] ^ $md5; } return $tmp; } function passport_key($txt, $encrypt_key) { $encrypt_key = md5($encrypt_key); $ctr = 0; $tmp = ''; for($i = 0; $i < strlen($txt); $i++) { $ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr; $tmp .= $txt[$i] ^ $encrypt_key[$ctr++]; } return $tmp; } ?>
以下は、これら 3 つの暗号化および復号化関数の理解を深めるためのいくつかの例です
//string.php <?php include “fun.php”; $txt = “This is a test”; $key = “testkey”; $encrypt = passport_encrypt($txt,$key); $decrypt = passport_decrypt($encrypt,$key); echo $txt.”<br><hr>”; echo $encrypt.”<br><hr>”; echo $decrypt.”<br><hr>”; ?> //array.php <?php include “fun.php”; $array = array( "a" => "1", "b" => "2", "c" => "3", "d" => "4" ); //serialize产生一个可存储的值,返回一个字符串,unserialize还原 $txt = serialize($array); $key = “testkey”; $encrypt = passport_encrypt($txt,$key); $decrypt = passport_decrypt($encrypt,$key); $decryptArray = unserialize($decrypt); echo $txt.”<br><hr>”; echo $encrypt.”<br><hr>”; echo $decrypt.”<br><hr>”; echo $decryptArray.”<br><hr>”; ?>
重要なポイントは、別の URL にジャンプしたい場合ですが、確実にセッションが正しい場合は、セッションを処理する必要があります。ある企業には Web サイトとフォーラムがあり、両方の場所で登録とログインが行われるようですが、ユーザーがホームページでログインした後にフォーラムにジャンプすることは望ましくありません。セッションの有効期限が切れた場合、つまり、会社全体を実行するために 1 回ログインするだけです。
Web ページがステートレスである場合、新しい Web ページでセッションを継続して使用する必要があります。セッションを別の場所に移動するには、PHP には $_SESSION というセッションを処理するための変数が用意されています。
//login.php <?php session_start(); include “fun.php”; $_SESSION[“userid”]; $_SESSION[“username”]; $_SESSION[“userpwd”]; header("Location: http://$domain/process.php?s=".urlencode(passport_encrypt(serialize($_SESSION),"sessionkey"))); ?>
まずそれに対処しましょう
//process.php <?php session_start(); include “fun.php”; $_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); header("Location: http://$domain/index.php"); ?>
この方法にはセキュリティの問題もあります。アドレス送信プロセス中に他の人に URL アドレスが取得されると、非常に恥ずかしいことになりますが、URL の内容を解読することはできません。この URL アドレスを使用して、個人アカウント、電子メール アカウント、さらには銀行口座にログインすることもできます (もちろん、これを書く人は私以外にはほとんどいないと思いますが、実際はすぐにキャンセルできます)。ページのセッション処理です。
以下は process.php の拡張版です
<?php session_start(); include_once "fun.php"; $_SESSION=unserialize(passport_decrypt($_GET["s"],"sessionkey")); if((time()-$_SESSION["TIME"])>30){ header("Location: http://$domain/ login.php"); unset($_SESSION["USERNAME"]); unset($_SESSION["PASSWORD"]); } else header("Location: http://$domain/ index.php"); ?>
$_SESSION["TIME"] = time();
これを設定する理由は、主に、ジャンプ時間が 30 秒を超えた場合に、login.php のログイン ページにジャンプさせることができるためです。この URL がブロックされている場合も防止されます。ユーザーが 30 秒以内にログインしない場合は、タイムアウトして再度ログインしてください。
$_SESSION["PASSWORD"]これら 2 つのセッションをキャンセルする理由は、URL が誰かに取得された場合、その人は 30 秒以上以内に logon.php ページにジャンプしますが、そのセッションは渡されてしまうためです。これはまだ有効です。URL サフィックスの login.php を Index.php に変更するだけで、引き続き正常にログインできます。