public function execute() { $user = Loader::get_user(); $user->get_module('secret_key')->unset_secret_key(); Session::destroy(Session::get_sid()); $user->reset(0); self::set_client_command('unset_secret_key', array()); self::set_client_command('refresh', array('url' => 'self')); }
public static function check_signature($client_sig) { $user = Loader::get_user(); if (!$client_sig) { return FALSE; } if (!$user->get_module(User::M_SECRET_KEY)->check_secret_key()) { $user->get_module(User::M_SECRET_KEY)->unset_secret_key(); Session::destroy(Session::get_sid(), Session::ST_INCORRECT); return FALSE; } //Создаём серверную сигнатуру //1. получаем все параметры и удаляем параметр с сигнатурой $all_params = Buffer::get_post(); unset($all_params['sig']); $elements_sig = array(); //2. извлекаем значения из пришедших параметров в обязательный список параметров на серврере $params = config('web', 'sig_params'); foreach ($params as $param) { //некоторые параметрый дублируем в ручную, по тем правилам, по которомы они дложны были создаваться на клиенте switch ($param) { case Session::COOKIE_ID: $elements_sig[$param] = Session::get_sid(); break; case 'location': $elements_sig[$param] = get_full_url(); $elements_sig[$param] = str_replace('/www.', '/', $elements_sig[$param]); break; default: $elements_sig[$param] = isset($all_params[$param]) ? $all_params[$param] : ''; } if (isset($all_params[$param])) { unset($all_params[$param]); } } //Если в запросе остались какие-то параметры то добавляем их в конец массива if (!empty($all_params)) { $elements_sig = array_merge($elements_sig, $all_params); } //3. получаем секретный ключ текущего пользователя $elements_sig[self::NAME_SECRET_KEY] = $user->get_secret_key(); //4. Сортируем и собираем в строку элементы запроса $server_sig = array(); ksort($elements_sig); foreach ($elements_sig as $key => $value) { $server_sig[] = $key . '=' . $value; } //5. Формируем сигнатуру сервера $server_sig = md5(implode('&', $server_sig)); //6. Сравниваем результаты if ($server_sig == $client_sig) { return TRUE; } return FALSE; }
public static function log_error($exc, $tag = '') { $uid = Session::get_uid(); if ($uid > 0) { $uid = 'UID: ' . $uid; } else { $uid = 'SID:' . Session::get_sid(); } $uid .= ' ;IP: ' . get_ip(); if (is_a($exc, 'Exception')) { $sql_query = sprintf(self::Q_INSERT_ERROR, $exc->getCode(), $exc->getLine(), $uid, $tag, addslashes($exc->getFile()), addslashes($exc->getMessage()), addslashes($exc->getTraceAsString())); } elseif (is_array($exc)) { $sql_query = sprintf(self::Q_INSERT_ERROR, isset($exc['type']) ? $exc['type'] : 0, isset($exc['line']) ? $exc['line'] : 0, $uid, $tag, addslashes(isset($exc['file']) ? $exc['file'] : ''), addslashes(isset($exc['message']) ? $exc['message'] : ''), addslashes(isset($exc['trace']) ? $exc['trace'] : '')); } else { $sql_query = sprintf(self::Q_INSERT_ERROR, 0, __LINE__, $uid, 'MESSAGE', addslashes(__FILE__), '', addslashes(print_r($exc, true))); } db::simple_query($sql_query); }
public function regenerate_secret_key() { $id = $this->_user->get_id(); if (!$id or $this->_user->is_visitor()) { return FALSE; } $sc =& $this->_special_chars; $salt0 = uniqid('wx__'); $salt1 = $sc[array_rand($sc)]; $salt2 = $sc[array_rand($sc)]; $salt3 = $sc[array_rand($sc)]; $session_id = Session::get_sid(); $lifetime = get_time() + config('session', 'lifetime_secret_key'); $raw_data = array($salt0, $id, time(), $session_id, $lifetime, $salt1, $salt2 . $salt1, $salt2 . $salt1 . $salt3); shuffle($raw_data); $non_format_key = md5(implode(uniqid(), $raw_data)); //Заменяем повторяющиеся символы в коде на спец символы $length = strlen($non_format_key); for ($i = 0; $i < $length; $i++) { $test_char = $non_format_key[$i]; for ($j = 0; $j < $length; $j++) { if ($i == $j) { continue; } if ($test_char == $non_format_key[$j]) { if (!is_numeric($non_format_key[$j]) and mt_rand(0, 100) >= 50) { $non_format_key[$j] = ucfirst($non_format_key[$j]); continue; } $key = array_rand($sc); $non_format_key[$j] = $sc[$key]; } } } $secret_key = $non_format_key; $secret_data = array('secret_key' => $secret_key); Session::set_server_data($secret_data); db::simple_query(self::Q_UPDATE_USER_KEY, array('%user_id' => $id, '%secret_key' => $secret_key)); return $secret_data['secret_key']; }