Revision 2139
Added by darkviper almost 10 years ago
- class SecureTokens: ::buildFingerprint() fixed server identification an add protection of file SecureToken.php
| SecureTokens.php | ||
|---|---|---|
| 62 | 62 |         'default' => array('value' => 0, 'expire' => 0, 'instance' => 0)
 | 
| 63 | 63 | ); | 
| 64 | 64 | /** the salt for this instance */ | 
| 65 | private $sSalt = ''; | |
| 65 |     private $sSalt             = '';
 | |
| 66 | 66 | /** fingerprint of the current connection */ | 
| 67 | private $sFingerprint = ''; | |
| 67 |     private $sFingerprint      = '';
 | |
| 68 | 68 | /** the FTAN token which is valid for this instance */ | 
| 69 | private $aLastCreatedFtan = null; | |
| 69 |     private $aLastCreatedFtan  = null;
 | |
| 70 | 70 | /** the time when tokens expired if they created in this instance */ | 
| 71 | private $iExpireTime = 0; | |
| 71 |     private $iExpireTime       = 0;
 | |
| 72 | 72 | /** remove selected tokens only and update all others */ | 
| 73 | 73 | private $bPreserveAllOtherTokens = false; | 
| 74 | 74 | /** id of the current instance */ | 
| ... | ... | |
| 79 | 79 | private $sInstanceToUpdate = null; | 
| 80 | 80 | /* --- settings for SecureTokens ------------------------------------------------------ */ | 
| 81 | 81 | /** use fingerprinting to encode */ | 
| 82 | private $bUseFingerprint = true; | |
| 82 |     private $bUseFingerprint   = true;
 | |
| 83 | 83 | /** maximum lifetime of a token in seconds */ | 
| 84 | private $iTokenLifeTime = 1800; // between LIFETIME_MIN and LIFETIME_MAX (default = 30min) | |
| 84 |     private $iTokenLifeTime    = 1800; // between LIFETIME_MIN and LIFETIME_MAX (default = 30min)
 | |
| 85 | 85 | /** bit length of the IPv4 Netmask (0-32 // 0 = off default = 24) */ | 
| 86 | private $iNetmaskLengthV4 = 0; | |
| 86 |     private $iNetmaskLengthV4  = 0;
 | |
| 87 | 87 | /** bit length of the IPv6 Netmask (0-128 // 0 = off default = 64) */ | 
| 88 | private $iNetmaskLengthV6 = 0; | |
| 88 |     private $iNetmaskLengthV6  = 0;
 | |
| 89 | 89 |  | 
| 90 | 90 | /** | 
| 91 | 91 | * constructor | 
| ... | ... | |
| 271 | 271 | default: | 
| 272 | 272 | $sTokenName = $sFieldname; | 
| 273 | 273 | } | 
| 274 |         if (preg_match('/[0-9a-f]{16}$/i', $sTokenName)) {
 | |
| 274 |         if (preg_match('/^[0-9a-f]{16}$/i', $sTokenName)) {
 | |
| 275 | 275 | // key must be a 16-digit hexvalue | 
| 276 | 276 |             if (array_key_exists($sTokenName, $this->aTokens)) {
 | 
| 277 | 277 | // check if key is stored in IDKEYs-list | 
| ... | ... | |
| 412 | 412 |         }else if (array_key_exists('HTTP_CLIENT_IP', $_SERVER)) {
 | 
| 413 | 413 | $sClientIp = $_SERVER['HTTP_CLIENT_IP']; | 
| 414 | 414 | } | 
| 415 | return | |
| 416 | __FILE__.PHP_VERSION | |
| 417 | . isset($_SERVER['SERVER_SIGNATURE']) ? $_SERVER['SERVER_SIGNATURE'] : 'unknown' | |
| 418 | . isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'AGENT' | |
| 419 | . $this->calcClientIpHash($sClientIp) | |
| 420 | ; | |
| 415 | $aTmp = array_chunk(stat(__FILE__), 11); | |
| 416 | unset($aTmp[0][8]); | |
| 417 | return md5( | |
| 418 |             __FILE__ . PHP_VERSION . implode('', $aTmp[0])
 | |
| 419 |             . (array_key_exists('HTTP_USER_AGENT', $_SERVER) ? $_SERVER['HTTP_USER_AGENT'] : 'AGENT')
 | |
| 420 | . $this->calcClientIpHash($sClientIp) | |
| 421 | ); | |
| 421 | 422 | } | 
| 422 | 423 |  | 
| 423 | 424 | /** | 
| ... | ... | |
| 449 | 450 | // check if IP includes a IPv4 part and convert this into IPv6 format | 
| 450 | 451 |             $sPattern = '/^([:a-f0-9]*?)\:([0-9]{1,3}(?:\.[0-9]{1,3}){3})$/is';
 | 
| 451 | 452 |             if (preg_match($sPattern, $sRawIp, $aMatches)) {
 | 
| 453 | // convert IPv4 into full size 32bit binary string | |
| 452 | 454 | $sIpV4Bin = str_pad((string)decbin(ip2long($aMatches[2])), 32, '0', STR_PAD_LEFT) ; | 
| 455 | // split into 2 parts of 16bit | |
| 453 | 456 | $aIpV6Hex = str_split($sIpV4Bin, 16); | 
| 457 | // concate the IPv6/96 part and hex of both IPv4 parts | |
| 454 | 458 | $sRawIp = $aMatches[1].':'.dechex(bindec($aIpV6Hex[0])).':'.dechex(bindec($aIpV6Hex[1])); | 
| 455 | 459 | } | 
| 456 | // calculate number of missing words | |
| 460 |             // calculate number of missing IPv6 words
 | |
| 457 | 461 |             $iWords = 8 - count(preg_split('/:/', $sRawIp, null, PREG_SPLIT_NO_EMPTY));
 | 
| 458 |             // build replacement for '::'
 | |
| 462 |             // build multiple ':0000:' replacements for '::'
 | |
| 459 | 463 |             $sReplacement = $iWords ? implode(':', array_fill(0, $iWords, '0000')) : '';
 | 
| 460 | 464 | // insert replacements and remove trailing/leading ':' | 
| 461 | 465 |             $sClientIp = trim(preg_replace('/\:\:/', ':'.$sReplacement.':', $sRawIp), ':');
 | 
| ... | ... | |
| 511 | 515 | $this->bUseFingerprint = isset($this->oReg->SecTokenFingerprint) | 
| 512 | 516 | ? $this->oReg->SecTokenFingerprint | 
| 513 | 517 | : $this->bUseFingerprint; | 
| 514 |         $this->iNetmaskLengthV4 = isset($this->oReg->SecTokenNetmask4)
 | |
| 515 |                                   ? $this->oReg->SecTokenNetmask4
 | |
| 518 |         $this->iNetmaskLengthV4 = isset($this->oReg->SecTokenIpv4Netmask)
 | |
| 519 |                                   ? $this->oReg->SecTokenIpv4Netmask
 | |
| 516 | 520 | : $this->iNetmaskLengthV4; | 
| 517 |         $this->iNetmaskLengthV6 = isset($this->oReg->SecTokenNetmask6)
 | |
| 518 |                                   ? $this->oReg->SecTokenNetmask6
 | |
| 521 |         $this->iNetmaskLengthV6 = isset($this->oReg->SecTokenIpv6PrefixLength)
 | |
| 522 |                                   ? $this->oReg->SecTokenIpv6PrefixLength
 | |
| 519 | 523 | : $this->iNetmaskLengthV6; | 
| 520 | 524 | $this->iTokenLifeTime = isset($this->oReg->SecTokenLifeTime) | 
| 521 | 525 | ? $this->oReg->SecTokenLifeTime | 
Also available in: Unified diff