PluginProbe
WebTotem Security / 2.3.11
WebTotem Security v2.3.11
3.0.2 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 All 110 releases
wt-security / library / App.php

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

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