ホームページ >php教程 >php手册 >PHPトークン トークン改良版

PHPトークン トークン改良版

WBOY
WBOYオリジナル
2016-06-13 12:28:141202ブラウズ

Base64 を使用しているため、GET メソッドを通じてこのトークンを送信するときに問題が発生します。
例: http://test/test.php?a=1 2
$_GET["a"] を使用すると、次の結果が得られます: 1 2、つまり、プラス記号がなくなりました。最初は urlencode を使用して変換しましたが、予期しない結果が常に 1 つまたは 2 つありました。

後から考えたら、base64 の文字は [A-Za-z0-9 /=] までしかなく、数が多すぎてプラス記号に問題があるので、プラス記号は問題を引き起こさない記号であり、下線は最良の選択です。以下は変更されたコードです:

GEncrypt.inc.php

コードをコピーします コードは次のとおりです:


class GEncrypt {
protected static function keyED($txt, $encrypt_key) {
$encrypt_key = md5 ($encrypt_key)
$ctr = 0; 🎜> $tmp = "";
for($i = 0; $i < strlen ( $txt ); $i ) {
if ($ctr == strlen ( $encrypt_key ))
$ctr = 0 ;
$tmp .= substr ( $txt, $i, 1 ) ^ substr ( $encrypt_key, $ctr, 1 );
$ctr ; ;
}

public static function encrypt($txt, $key) {
$encrypt_key = md5 ((( float ) date ( "YmdHis" ) rand ( 10000000000000000, 9999999999999999 9 )) 。 rand ( 100000, 999999 ) );
$ctr = 0;
$tmp = "";
for($i < strlen ( $txt ); $i ) {
if ($ ctr == strlen ( $encrypt_key ))
$ctr = 0;
$tmp .= substr ( $encrypt_key, $ctr, 1) . (substr ( $txt, $i, 1) ) ^ substr ( $ encrypt_key, $ctr, 1 ));
$ctr ;
}
return ( preg_replace("/\ /s","_", base64_encode ( self::keyED ( $ tmp, $key ) ) ));
}
//base64 [A-Za-z0-9 /=]
public static function decrypt($txt, $key) {
if( $txt == " "){ return false;}
//echo preg_replace("/_/s"," ",$txt)
$txt = self::keyED (base64_decode ( preg_replace(" /_/s" ," ", $txt) ), $key );
$tmp = "";
for($i = 0; $i $ md5 = substr ( $txt, $i, 1 );
$i ;
$tmp .= (substr ( $txt, $i, 1 ) ^ $md5);
return $tmp; }
}

?>


GToken.inc.php



コードをコピー

コードは次のとおりです:


/**
* 原則: トークンの割り当てをリクエストするときは、一意のトークン、base64(time rand action) を割り当てる方法を見つけてください。
* 送信された場合は、このトークンが以前に使用されたことを示すためにこのトークンを記録します。重複した送信を避けてください。
*
*/
class GToken {

/**
* 現在のトークンをすべて取得します
*
* @return array
*/
public static function getTokens() {
$tokens = $_SESSION[GConfig::SSN_KEY_TOKEN ]; 
if (empty($tokens) &&!is_array($tokens)) {
$tokens = array(); 
}
$tokens を返します。 
}

/**
* 新しいトークンを生成します
*
* @param string $formName
* @param 暗号化キー $key
* @return string
*/

public static function newToken($formName,$key = GConfig::ENCRYPT_KEY ){
$token = GEncrypt:: encrypt($formName.session_id(),$key); 
$token を返す; 
}

/**
* トークンを削除すると、実際にはセッション内の配列に要素が追加され、データの繰り返しの送信を避けるためにそのトークンが以前に使用されたことを示します。
*
* @param string $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){
if(empty($token)) falseを返します。 

$tokens = self::getTokens(); 

if (in_array($token,$tokens)) //結果が存在する場合、说明は过的トークンを使用します
return false; 

$source = GEncrypt::decrypt($token,$key); 

if($fromCheck)
return $source == $formName.session_id(); 
else{
return strpos($source,$formName) === 0; 
}
}

public static function getTokenKey($token,$key = GConfig::ENCRYPT_KEY){
if($token == null || trim($token) == "") false を返します。 
$source = GEncrypt::decrypt($token,$key); 
return $source != "" ? str_replace(session_id(),"",$source) : false; 
}

public function newTokenForSmarty($params){
$form = null; 
抽出($params); 
return self::newToken($form); 
}
}
?> 

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。