Вход Регистрация
Файл: oc-includes/osclass/helpers/hSecurity.php
Строк: 374
<?php

/*
 * Copyright 2014 Osclass
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

    
if(!defined('BCRYPT_COST')) { define('BCRYPT_COST'15); };

    
/**
    * Helper Security
    * @package Osclass
    * @subpackage Helpers
    * @author Osclass
    */

    /**
     * Creates a random password.
     * @param int password $length. Default to 8.
     * @return string
     */
    
function osc_genRandomPassword($length 8) {
        
$dict array_merge(range('a''z'), range('0''9'), range('A''Z'));
        
shuffle($dict);

        
$pass '';
        for(
$i 0$i $length$i++)
            
$pass .= $dict[rand(0count($dict) - 1)];

        return 
$pass;
    }

    
/**
     * Create a CSRF token to be placed in a form
     *
     * @since 3.1
     * @return string
     */
    
function osc_csrf_token_form() {
        list(
$name$token) = osc_csrfguard_generate_token();
        return 
"<input type='hidden' name='CSRFName' value='".$name."' />
        <input type='hidden' name='CSRFToken' value='"
.$token."' />";
    }

    
/**
     * Create a CSRF token to be placed in a url
     *
     * @since 3.1
     * @return string
     */
    
function osc_csrf_token_url() {
        list(
$name$token) = osc_csrfguard_generate_token();
        return 
"CSRFName=".$name."&CSRFToken=".$token;
    }

    
/**
     * Check is CSRF token is valid, die in other case
     *
     * @since 3.1
     */

    
function osc_csrf_check() {
        
$error      false;
        
$str_error  '';
        if(
Params::getParam('CSRFName')=='' || Params::getParam('CSRFToken')=='') {
            
$str_error _m('Probable invalid request.') ;
            
$error true;
        } else {
            
$name   Params::getParam('CSRFName');
            
$token  Params::getParam('CSRFToken');
            if (!
osc_csrfguard_validate_token($name$token)) {
                
$str_error _m('Invalid CSRF token.');
                
$error true;
            }
        }

        if( 
defined('IS_AJAX') ) {
            if(
$error && IS_AJAX === true ) {
                echo 
json_encode(array(
                    
'error' => 1,
                    
'msg'   => $str_error
                
));
                exit;
            }
        }

        
// ¿ check if is ajax request ?
        
if($error) {
            if(
OC_ADMIN) {
                
osc_add_flash_error_message($str_error'admin');
            } else {
                
osc_add_flash_error_message($str_error);
            }

            
$url osc_get_http_referer();
            
// be sure that drop session referer
            
Session::newInstance()->_dropReferer();
            if(
$url!='') {
                
osc_redirect_to($url);
            }

            if(
OC_ADMIN) {
                
osc_redirect_toosc_admin_base_url(true) );
            } else {
                
osc_redirect_toosc_base_url(true) );
            }
        }
    }

    
/**
     * Check is an email and IP are banned
     *
     * @param string $email
     * @param string $ip
     * @since 3.1
     * @return int 0: not banned, 1: email is banned, 2: IP is banned
     */
    
function osc_is_banned($email ''$ip null) {
        if(
$ip==null) {
            
$ip Params::getServerParam('REMOTE_ADDR');
        }
        
$rules BanRule::newInstance()->listAll();
        if(!
osc_is_ip_banned($ip$rules)) {
            if(
$email!='') {
                return 
osc_is_email_banned($email$rules)?1:0// 1:Email is banned, 0:not banned
            
}
            return 
0;
        }
        return 
2//IP is banned
    
}

    
/**
     * Check is an email and IP are banned
     *
     * @param string $ip
     * @param string $rules (optional, to savetime and resources)
     * @since 3.1
     * @return boolean
     */
    
function osc_is_ip_banned($ip$rules null) {
        if(
$rules==null) {
            
$rules BanRule::newInstance()->listAll();
        }
        
$ip_blocks explode("."$ip);
        if(
count($ip_blocks)==4) {
            foreach(
$rules as $rule) {
                if(
$rule['s_ip']!='') {
                    
$blocks explode("."$rule['s_ip']);
                    if(
count($blocks)==4) {
                        
$matched true;
                        for(
$k=0;$k<4;$k++) {
                            if(
preg_match('|([0-9]+)-([0-9]+)|'$blocks[$k], $match)) {
                                if(
$ip_blocks[$k]<$match[1] || $ip_blocks[$k]>$match[2]) {
                                    
$matched false;
                                    break;
                                }
                            } else if(
$blocks[$k]!="*" && $blocks[$k]!=$ip_blocks[$k]) {
                                
$matched false;
                                break;
                            }
                        }
                        if(
$matched) {
                            return 
true;
                        }
                    }
                }
            }
        }
        return 
false;
    }

    
/**
     * Check is an email and IP are banned
     *
     * @param string $email
     * @param string $rules (optional, to savetime and resources)
     * @since 3.1
     * @return boolean
     */
    
function osc_is_email_banned($email$rules null) {
        if(
$rules==null) {
            
$rules BanRule::newInstance()->listAll();
        }
        
$email strtolower($email);
        foreach(
$rules as $rule) {
            
$rule str_replace("*"".*"str_replace(".""."strtolower($rule['s_email'])));
            if(
$rule!='') {
                if(
substr($rule,0,1)=="!") {
                    
$rule '|^((?'.$rule.').*)$|';
                } else {
                    
$rule '|^'.$rule.'$|';
                }
                if(
preg_match($rule$email)) {
                    return 
true;
                }
            }
        }
        return 
false;
    }

    
/**
     * Check is an username is blacklisted
     *
     * @param string $username
     * @since 3.1
     * @return boolean
     */
    
function osc_is_username_blacklisted($username) {
        
// Avoid numbers only usernames, this will collide with future users leaving the username field empty
        
if(preg_replace('|(d+)|'''$username)=='') {
         return 
true;
        }
        
$blacklist explode(","osc_username_blacklist());
        foreach(
$blacklist as $bl) {
            if(
stripos($username$bl)!==false) {
                return 
true;
            }
        }
        return 
false;
    }

    
/*
     * Verify an user's password
     *
     * @param $password plain-text
     * @hash bcrypt/sha1
     * @since 3.3
     * @return boolean
     */
    
function osc_verify_password($password$hash) {
        if(
version_compare(PHP_VERSION'5.3.7')>=0) {
            return 
password_verify($password$hash)?true:(sha1($password)==$hash);
        }

        require_once 
LIB_PATH 'Bcrypt.php';
        if(
CRYPT_BLOWFISH==1) {
            
$bcrypt = new Bcrypt(BCRYPT_COST);
            return 
$bcrypt->verify($password$hash)?true:(sha1($password)==$hash);
        }
        return (
sha1($password)==$hash);
    }

    
/*
     * Hash a password in available method (bcrypt/sha1)
     *
     * @param $password plain-text
     * @since 3.3
     * @return string hashed password
     */
    
function osc_hash_password($password) {
        if(
version_compare(PHP_VERSION'5.3.7')>=0) {
            
$options = array('cost' => BCRYPT_COST);
            return 
password_hash($passwordPASSWORD_BCRYPT$options);
        }

        require_once 
LIB_PATH 'Bcrypt.php';
        if(
CRYPT_BLOWFISH==1) {
            
$bcrypt = new Bcrypt(BCRYPT_COST);
            return 
$bcrypt->hash($password);
        }
        return 
sha1($password);
    }

    function 
osc_encrypt_alert($alert) {
        
$string osc_genRandomPassword(32) . $alert;
        
osc_set_alert_private_key(); // renew private key and
        
osc_set_alert_public_key();  // public key
        
$key hash("sha256"osc_get_alert_private_key(), true);
        if(
function_exists('mcrypt_module_open')) {
            
$cipher mcrypt_module_open(MCRYPT_RIJNDAEL_256''MCRYPT_MODE_CBC'');
            
$cipherText '';
            if (
mcrypt_generic_init($cipher$key$key) != -1) {
                
$cipherText mcrypt_generic($cipher$string);
                
mcrypt_generic_deinit($cipher);
            }
            return 
$cipherText;
        };

        while (
strlen($string) % 32 != 0) {
            
$string .= "";
        }
        require_once 
LIB_PATH 'phpseclib/Crypt/Rijndael.php';
        
$cipher = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CBC);
        
$cipher->disablePadding();
        
$cipher->setBlockLength(256);
        
$cipher->setKey($key);
        
$cipher->setIV($key);
        return 
$cipher->encrypt($string);
    }

    function 
osc_decrypt_alert($string) {
        
$key hash("sha256"osc_get_alert_private_key(), true);
        if(
function_exists('mcrypt_module_open')) {
            
$cipher mcrypt_module_open(MCRYPT_RIJNDAEL_256''MCRYPT_MODE_CBC'');
            
$cipherText '';
            if (
mcrypt_generic_init($cipher$key$key) != -1) {
                
$cipherText mdecrypt_generic($cipher$string);
                
mcrypt_generic_deinit($cipher);
            }
            return 
trim(substr($cipherText32));
        };
        require_once 
LIB_PATH 'phpseclib/Crypt/Rijndael.php';
        
$cipher = new Crypt_Rijndael(CRYPT_RIJNDAEL_MODE_CBC);
        
$cipher->disablePadding();
        
$cipher->setBlockLength(256);
        
$cipher->setKey($key);
        
$cipher->setIV($key);
        return 
trim(substr($cipher->decrypt($string), 32));
    }

    function 
osc_set_alert_public_key() {
        if(!
View::newInstance()->_exists('alert_public_key')) {
            
Session::newInstance()->_set('alert_public_key'osc_random_string(32) );
        }
    }

    function 
osc_get_alert_public_key() {
        return 
Session::newInstance()->_get('alert_public_key');
    }

    function 
osc_set_alert_private_key() {
        if(!
View::newInstance()->_exists('alert_private_key')) {
            
Session::newInstance()->_set('alert_private_key'osc_random_string(32) );
        }
    }

    function 
osc_get_alert_private_key() {
        return 
Session::newInstance()->_get('alert_private_key');
    }

    function 
osc_random_string($length) {
        
$buffer '';
        
$buffer_valid false;
        if (
function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
            
$buffer mcrypt_create_iv($lengthMCRYPT_DEV_URANDOM);
            if (
$buffer) {
                
$buffer_valid true;
            }
        }
        if (!
$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
            
$buffer openssl_random_pseudo_bytes($length);
            if (
$buffer) {
                
$buffer_valid true;
            }
        }
        if (!
$buffer_valid && is_readable('/dev/urandom')) {
            
$f fopen('/dev/urandom''r');
            
$read strlen($buffer);
            while (
$read $length) {
                
$buffer .= fread($f$length $read);
                
$read strlen($buffer);
            }
            
fclose($f);
            if (
$read >= $length) {
                
$buffer_valid true;
            }
        }
        if (!
$buffer_valid || strlen($buffer) < $length) {
            
$bl strlen($buffer);
            for (
$i 0$i $length$i++) {
                if (
$i $bl) {
                    
$buffer[$i] = $buffer[$i] ^ chr(mt_rand(0255));
                } else {
                    
$buffer .= chr(mt_rand(0255));
                }
            }
        }
        if(!
$buffer_valid) {
            
$buffer osc_genRandomPassword(2*$length);
        }
        return 
substr(str_replace('+''.'base64_encode($buffer)), 0$length);
    }
Онлайн: 1
Реклама