ホームページ >バックエンド開発 >PHPチュートリアル >PHP Token(トークン)設計アプリケーション
PHP トークンの設計目標: データの繰り返しの送信を避けること。ソースをチェックして、実行されるアクションと一致する外部送信であるかどうかを確認します (同じページに追加、削除、などの複数のロジックが実装されている場合)。 (PHP ファイル内で操作するための) 変更と配置 ここで言及されているトークンは、ページが表示されるときに FORM に書き込まれる非表示のフォーム項目 (type=hidden) です。トークンがプレーン テキストの場合は、トークンは使用できません。危険すぎるので、特定の暗号化方法を使用する必要があります。暗号文は可逆的である必要があります。そのため、インターネット上で既製の方法を使用しました。
繰り返し送信を回避するには?
この配列は、正常に送信されたトークンを保存します。トークンが存在する場合は、それが繰り返し送信されたことを意味します。オリジンを確認しますか? オプションで、このトークンは現在の session_id の生成時に追加されます。送信時に他の人が HTML (トークンのコピー) をコピーした場合、理論的にはトークンに含まれる session_id が現在の session_id と等しくない可能性があります。この送信が外部送信であると判断します。
実行されるアクションを一致させるにはどうすればよいですか?
トークンを作成するときに、トークンのアクション名を書き込む必要があります。このようにして、処理中に、
以前書いたGTokenでは上記記事2が実現できなかったので、今日修正して機能2を追加しました。教えてください。ありがとうございます。
protected static function keyED($txt,$encrypt_key){
$ をオンラインで見つけました。 encrypt_key = md5($encrypt_key);
$ ctr=0 .= substr($txt,$i,1) ^ substr($encrypt_key,$ctr,1); パブリック静的関数 encrypt($txt,$キー){ (100000,999999)); 0; returnbase64_encode(self::keyED($tmp,$key));
}
パブリック静的関数 decrypt($txt,$key){
$txt = self :: keyed(base64_decode($ txt)、$ key);
GToken.inc.php
メソッド:
a,granteToken パラメーター: formName、アクション名、key は暗号化/復号化キーです。
encryption(formName:session_id)
b の形式で文字列を返します。 isToken パラメータ: token は、grantToken、formName、アクション名、fromCheck がオリジンをチェックするかどうかによって生成された結果であり、true の場合、トークン内の session_id が現在の session_id、dropToken と一致するかどうかを判断する必要もあります。 、アクションが正常に実行されたら、この関数を呼び出し、このトークンをセッションに記録します
次のようにコードをコピーします:
/**
* 原則: トークンの割り当てをリクエストするときは、一意のトークン、base64(time + rand + action) を割り当てる方法を見つけてください。
* 送信された場合は、このトークンが以前に使用されたことを示すためにこのトークンを記録します。重複送信を避けるためです。
*
*/
class GToken {
/**
* 現在のトークンをすべて取得します
*
* @return array
*/
パブリック 静的 関数 getTokens(){
$tokens = $_SESSION[GConfig::SESSION] _KEY_TOKEN ];
if (empty($tokens) && !is_array($tokens)) {
$tokens = array();
}
$tokens を返します。
}
/**
*新しいトークンを生成します*/
パブリック 静的 関数 granteToken($formName,$key = GConfig::ENCRYPT_KEY ){
$token = GEncrypt::encrypt($formName.":".session_id() ,$キー);
$token を返す;
}
/**
* トークンを削除すると、実際にはセッション内の配列に要素が追加され、データの繰り返しの送信を避けるためにそのトークンが以前に使用されたことを示します。
*
*@param 文字列 $token
*/
public static function dropToken($token){
$tokens = self::getTokens();
$tokens[] = $token;
GSession::set(GConfig::SESSION_KEY_TOKEN ,$tokens);
}
/**
* * 指定された Token であるかどうかを確認します
* * @param string $token 確認するトークンの値
* * @param string $formName
* @param boolean $fromCheck true の場合、ソースを確認するかどうか、トークンは、session_id が現在の session_id と同じかどうかをさらに判断します
* @param string $key 暗号化キー
* @return boolean
*/
public static function isToken($token,$formName,$fromCheck = false,$key = GConfig::ENCRYPT_KEY){
$tokens = self::getTokens();
if (in_array($token,$tokens)) //如果存在、说明是使用过的トークン
return false;
$source = split(":", GEncrypt::decrypt($token,$key));
if($fromCheck)
Return $ Source [1] == Session_id () && $ Source [0] == $ formname; Bleak
まずは$_POSTからトークンを取り出してisTokenで判断すれば問題ないようです。一致するアクションかどうかを判断したい場合は、isToken の formName を変更して実行できます。一致しないことを証明してください。
単純すぎます。
残りは、ソース チェックが正常に機能しているかどうかを確認することです。
上記の例で生成された HTML をローカル Web ページにコピーし、ソースを確認して実行します。アクションはありません (isToken の 3 番目のパラメーターを true に設定する必要があります)。