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

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

Jun 13, 2016 pm 12:28 PM
base64getphptokenトークンバンドル改善する方法バージョンこれ合格

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 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 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。