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