Вход Регистрация
Файл: contao-3.5.8/system/modules/core/library/Contao/RequestToken.php
Строк: 151
<?php

/**
 * Contao Open Source CMS
 *
 * Copyright (c) 2005-2016 Leo Feyer
 *
 * @license LGPL-3.0+
 */

namespace Contao;


/**
 * Generates and validates request tokens
 *
 * The class tries to read and validate the request token from the user session
 * and creates a new token if there is none.
 *
 * Usage:
 *
 *     echo RequestToken::get();
 *
 *     if (!RequestToken::validate('TOKEN'))
 *     {
 *         throw new Exception("Invalid request token");
 *     }
 *
 * @author Leo Feyer <https://github.com/leofeyer>
 */
class RequestToken
{

    
/**
     * Object instance (Singleton)
     * @var RequestToken
     */
    
protected static $objInstance;

    
/**
     * Token
     * @var string
     */
    
protected static $strToken;


    
/**
     * Read the token from the session or generate a new one
     */
    
public static function initialize()
    {
        static::
$strToken = @$_SESSION['REQUEST_TOKEN'];

        
// Backwards compatibility
        
if (is_array(static::$strToken))
        {
            static::
$strToken null;
            unset(
$_SESSION['REQUEST_TOKEN']);
        }

        
// Generate a new token
        
if (static::$strToken == '')
        {
            static::
$strToken md5(uniqid(mt_rand(), true));
            
$_SESSION['REQUEST_TOKEN'] = static::$strToken;
        }

        
// Set the REQUEST_TOKEN constant
        
if (!defined('REQUEST_TOKEN'))
        {
            
define('REQUEST_TOKEN', static::$strToken);
        }
    }


    
/**
     * Return the token
     *
     * @return string The request token
     */
    
public static function get()
    {
        return static::
$strToken;
    }


    
/**
     * Validate a token
     *
     * @param string $strToken The request token
     *
     * @return boolean True if the token matches the stored one
     */
    
public static function validate($strToken)
    {
        
// The feature has been disabled
        
if (Config::get('disableRefererCheck') || defined('BYPASS_TOKEN_CHECK'))
        {
            return 
true;
        }

        
// Validate the token
        
if ($strToken != '' && static::$strToken != '' && $strToken == static::$strToken)
        {
            return 
true;
        }

        
// Check against the whitelist (thanks to Tristan Lins) (see #3164)
        
if (Config::get('requestTokenWhitelist'))
        {
            
$strHostname gethostbyaddr($_SERVER['REMOTE_ADDR']);

            foreach (
Config::get('requestTokenWhitelist') as $strDomain)
            {
                if (
$strDomain == $strHostname || preg_match('/.' preg_quote($strDomain'/') . '$/'$strHostname))
                {
                    return 
true;
                }
            }
        }

        return 
false;
    }


    
/**
     * Load the token or generate a new one
     *
     * @deprecated RequestToken is now a static class
     */
    
protected function __construct()
    {
        static::
initialize();
    }


    
/**
     * Prevent cloning of the object (Singleton)
     *
     * @deprecated RequestToken is now a static class
     */
    
final public function __clone() {}


    
/**
     * Return the object instance (Singleton)
     *
     * @return RequestToken The object instance
     *
     * @deprecated RequestToken is now a static class
     */
    
public static function getInstance()
    {
        if (static::
$objInstance === null)
        {
            static::
$objInstance = new static();
        }

        return static::
$objInstance;
    }
}
Онлайн: 0
Реклама