Heim >php教程 >PHP开发 >PHP-Token Token verbesserte Version

PHP-Token Token verbesserte Version

黄舟
黄舟Original
2016-12-14 11:55:041456Durchsuche

Gerade aufgrund der Verwendung von Base64 gibt es ein Problem beim Senden dieses Tokens über die GET-Methode.
Zum Beispiel: http://test/test.php?a=1+2
Was Sie mit $_GET["a"] erhalten, ist: 1 2, das heißt, das Pluszeichen ist weg. Zuerst habe ich Urlencode zum Konvertieren verwendet, aber es gab immer einige unerwartete Ergebnisse.

Später dachte ich darüber nach, die Base64-Zeichen auf Folgendes zu beschränken: [A-Za-z0-9+/=] Es gibt so viele, dass das Pluszeichen ein Problem darstellt, also habe ich das Pluszeichen in ein Symbol geändert Das verursacht das Problem nicht. Unterstreichen ist die beste Wahl. Das Folgende ist der geänderte Code:

GEncrypt.inc.php

Der Code lautet wie folgt:


class GEncrypt {
protected static function keyED($txt, $encrypt_key) {
$encrypt_key = md5 ( $encrypt_key );
$tmp = ""; ($i = 0; $i < strlen ( $txt ); $i ++) {
if ($ctr == strlen ( $encrypt_key ))
$ctr = 0;
$tmp .= substr ( $txt, $i, 1 ) ^ substr ( $encrypt_key, $ctr, 1 );
öffentliche statische Funktion encrypt($txt, $key) {
$encrypt_key = md5 ( (( float ) date( "YmdHis" ) + rand ( 10000000000000000, 99999999999999999 )) . rand ( 100000, 999999 ) );
$ctr = 0;
$tmp = "";
for($i = 0; $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 ++; 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 < strlen ( $txt ); $i + +) {
$md5 = substr ( $txt, $i, 1 );
$i ++; ;
}
return $tmp;}
}

?>


/**
* Prinzip: Wenn Sie die Zuweisung eines Tokens anfordern, finden Sie eine Möglichkeit, ein eindeutiges Token zuzuweisen, base64( Zeit + Rand + Aktion).
* Wenn Sie es senden, notieren Sie das Token und geben Sie an, dass das Token verwendet wurde und kann entsprechend verwendet werden. Es dient der Vermeidung von Doppeleinreichungen.
*
*/ 
class GToken { 

/**
* Alle aktuellen Token abrufen
*
* @return array
*/ 
public static function getTokens() { 
$tokens = $_SESSION[GConfig::SSN_KEY_TOKEN ]; 
if (empty($tokens) && !is_array($tokens)) { 
$tokens = array(); 

$tokens zurückgeben; 


/**
* Erzeuge ein neues Token
*
* @param string $formName
* @param Verschlüsselungsschlüssel $key
* @return string
*/ 

public static function newToken($formName,$key = GConfig::ENCRYPT_KEY ){ 
$token = GEncrypt:: encrypt($formName.session_id(),$key); 
$token zurückgeben; 


/**
* Durch das Löschen eines Tokens wird tatsächlich ein Element zu einem Array in der Sitzung hinzugefügt, was darauf hinweist, dass das Token bereits zuvor verwendet wurde, um eine wiederholte Übermittlung von Daten zu vermeiden.
*
* @param string $token
*/ 
öffentliche statische Funktion dropToken($token){ 
$tokens = self::getTokens(); 
$tokens[] = $token; 
GSession::set(GConfig::SESSION_KEY_TOKEN ,$tokens); 


/**
* Prüfen, ob es sich um den angegebenen Token handelt
*
* @param string $token Der zu prüfende Tokenwert
* @param string $formName
* @param boolean $fromCheck Ob zu Überprüfen Sie die Quelle. Wenn wahr, wird beurteilt, ob die an das Token angehängte Sitzungs-ID mit der aktuellen Sitzungs-ID übereinstimmt.
* @param string $key-Verschlüsselungsschlüssel
* @return boolean
*/ 

öffentliche statische Funktion isToken($token,$formName,$fromCheck = false,$key = GConfig::ENCRYPT_KEY){ 
if(empty($token)) return false; 

$tokens = self::getTokens(); 

if (in_array($token,$tokens)) //如果存在,说明是以使用过的token 
return false; 

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

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



öffentliche statische Funktion getTokenKey($token,$key = GConfig::ENCRYPT_KEY){ 
if($token == null || trim($token) == "") return false; 
$source = GEncrypt::decrypt($token,$key); 
return $source != "" ? str_replace(session_id(),"",$source) : false; 


öffentliche Funktion newTokenForSmarty($params){ 
$form = null; 
extract($params); 
return self::newToken($form); 


?>

以上就是PHP令牌 Token改进版的代码实例,希望可以帮助到大家,更多相关内容请关注PHP中文网(www. php.cn)!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn