PluginProbe
WebTotem Security / 2.3.14
WebTotem Security v2.3.14
3.0.1 3.0.0 trunk 1.0 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 2.0 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.1 2.2.2 2.2.3 2.2.4 All 109 releases
wt-security / library / App.php

App.php in WebTotem Security 2.3.14, at library/App.php

193 lines 6.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php defined('ABSPATH') or die("Protected By WT!");
2
3
4 class WTSEC_LIBRARY_App
5 {
6
7 public function __construct()
8 {
9 $this->auth();
10 }
11
12 public function auth(){
13 if(self::getOption('authorized') === false && (defined('WTSEC_DEACTIVATED') && !WTSEC_DEACTIVATED)){
14 wp_safe_redirect(admin_url('admin.php?page=' . WTSEC_PAGE_PREFIX . 'login'));
15 exit;
16 }
17 }
18
19 public static function authorized(){
20 return (boolean) self::getOption('authorized');
21 }
22
23 public static function login($token){
24 define("WTSEC_DEACTIVATED", false);
25 self::_set('authorized', true);
26 self::_set('authToken', $token);
27 }
28
29 public static function logout(){
30 self::_delete(['authToken','authorized','api_key']);
31 //self::_set('am_installed', false);
32 }
33
34 public function getLocalDomains(){
35 return [];
36 }
37
38 public static function _set($name,$value){
39 return update_option(WTSEC_PLUGIN_PREFIX.$name,$value);
40 }
41
42 public static function _get($name){
43 return get_option(WTSEC_PLUGIN_PREFIX.$name);
44 }
45
46 public static function _delete($options){
47 if(is_array($options)){
48 foreach ($options as $option) {
49 if ( ! delete_option(WTSEC_PLUGIN_PREFIX.$option))
50 return FALSE;
51 }
52 } else{
53 delete_option(WTSEC_PLUGIN_PREFIX.$options);
54 }
55 }
56
57 public function set($name,$value){
58 return update_option(WTSEC_PLUGIN_PREFIX.$name,$value);
59 }
60
61 public function get($name){
62 return get_option(WTSEC_PLUGIN_PREFIX.$name);
63 }
64
65 public static function getOption($name){
66 return get_option(WTSEC_PLUGIN_PREFIX.$name);
67 }
68
69 public static function deleteOption($name){
70 return delete_option(WTSEC_PLUGIN_PREFIX.$name);
71 }
72
73 public static function getToken(){
74 return self::getOption('authToken');
75 }
76
77 public static function getName(){
78 return self::getOption('username');
79 }
80
81
82 // Limit login attempt
83 public function wtsec_login_check(){
84
85 if( ! $this->wtsec_is_need_check() )
86 return;
87
88 $massage = wtsec_locale('login_attempt_message');
89
90 $options = (object) [
91 // время снятия блокировки в секуда�
92
93 'lock_time' => 1800, // 1800
94 // Количество попыток авторизоваться
95 'lock_num' => 5,
96 // Сообщение о блокировке
97 'massage' => $massage,
98 // время полной очистки файла - 4 дня
99 'expire_time' => 3600 * 24 * 4,
100 // добавить в названия файлов запрос REQUEST_URI - может пригодится для дебага
101 'add_uri' => false,
102 // использовать ли мякгий метод получения IP?
103 'soft_get_ip' => false,
104 ];
105
106 // чтобы установить имя файла
107 $action = @ $_GET['action'];
108 if( ! in_array( $action, array( 'postpass', 'logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login' ), true ) )
109 $action = 'login';
110
111 // создаем директорию кэша если надо
112 $cache_dir = plugin_dir_path(__FILE__) . 'cache';
113 if( ! file_exists($cache_dir) )
114 mkdir( $cache_dir, 0777 );
115
116 // оперделим название файла
117 $REQUEST_URI = $options->add_uri ? ( '___'. preg_replace('/[^a-zA-Z0-9:=?_-]/', '-', $_SERVER['REQUEST_URI'] ) /*все на -*/ ) : '';
118 $domen = str_replace('www.', '', $_SERVER['HTTP_HOST'] );
119 $file_path = $cache_dir . "/{$domen}___{$action}{$REQUEST_URI}.ini";
120
121 // оперделим ip
122 if( ! $ip = $this->wtsec_get_ip( $options->soft_get_ip ) )
123 die( 'No IP...' );
124
125 // парсим данные
126 $data = @ parse_ini_file( $file_path );
127 $data = (!$data) ? [] : $data;
128 $attempts = array_key_exists($ip,$data) ? count($data[$ip]) + 1 : 1;
129 $last_access_time = array_key_exists($ip,$data) ? max( $data[$ip] ) : 0;
130 $blocked_time = $last_access_time + ($options->lock_time * floor( $attempts / $options->lock_num) );
131
132 if ( $data['status'][$ip] == 'blocked' && $blocked_time > time() ){
133 $blocked_time = ($blocked_time - time()) / 60;
134 //return new WP_Error('incorrect_password', $options->massage);
135 die( sprintf($options->massage, $options->lock_num, $blocked_time) ); // блокируем
136 } else{
137 file_put_contents( $file_path, sprintf("{$ip}[] = %d\n", time()), FILE_APPEND ); // добавляем ip и время
138
139 if ($data['status'][$ip] == 'blocked'){
140 $new_content = preg_replace("~status\[" . $ip . "\] = [a-z]+\n~", '', file_get_contents($file_path) );
141 file_put_contents( $file_path, $new_content ); // снимает блокировку
142 }
143
144 if($attempts >= $options->lock_num && ( $attempts % $options->lock_num ) == 0)
145 file_put_contents( $file_path, "status[{$ip}] = blocked\n", FILE_APPEND); // добавляем блокировку
146 }
147
148 // полная очистка файла
149 if( empty($data['expire']) ){
150 file_put_contents( $file_path, 'expire = ' . time() . "\n", FILE_APPEND );
151 }
152 elseif( $data['expire'] + $options->expire_time < time() ){
153 $content = 'expire = '. time() . "\n";
154 file_put_contents( $file_path, $content ); // очищаем файл полностью
155 }
156 }
157
158
159 protected function wtsec_is_need_check(){
160
161 // работает только для POST запросов.
162 if( empty($_POST) )
163 return false;
164
165 $need_check = false;
166 $settings_value = self::_get('check_login_attempt');
167
168 // для страницы '/wp-login.php'
169 if( false !== strpos($_SERVER['REQUEST_URI'], '/wp-login.php') && $settings_value )
170 $need_check = true;
171
172
173 return $need_check;
174 }
175
176 protected function wtsec_get_ip( $soft = false ){
177
178 if( $soft ){
179 $ip = isset($_SERVER['HTTP_CF_CONNECTING_IP']) ? $_SERVER['HTTP_CF_CONNECTING_IP'] : ''; // cloudflare IP support
180 if( ! filter_var($ip, FILTER_VALIDATE_IP) ) $ip = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : '';
181 if( ! filter_var($ip, FILTER_VALIDATE_IP) ) $ip = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
182 if( ! filter_var($ip, FILTER_VALIDATE_IP) ) $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
183 }
184 else {
185 $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
186 }
187
188 return $ip;
189 }
190
191
192
193 }