PluginProbe ʕ •ᴥ•ʔ
SiteGuard WP Plugin / 1.8.7
SiteGuard WP Plugin v1.8.7
1.8.7 1.8.6 1.8.6-beta1 1.8.6-beta2 1.8.4 1.8.5 1.8.3 1.8.2 1.8.1 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.4.3 1.5.0 1.5.1 1.5.2 1.6.0 1.6.1 1.7.0 1.7.1 1.7.10 1.7.11 1.7.12 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.0-beta1 1.8.0-beta2 1.8.0-beta3 1.8.0-beta4
siteguard / classes / siteguard-waf-exclude-rule.php
siteguard / classes Last commit date
siteguard-admin-filter.php 1 month ago siteguard-base.php 1 month ago siteguard-captcha.php 1 month ago siteguard-config.php 11 months ago siteguard-disable-author-query.php 2 weeks ago siteguard-disable-pingback.php 1 month ago siteguard-disable-xmlrpc.php 1 month ago siteguard-htaccess.php 2 weeks ago siteguard-login-alert.php 1 month ago siteguard-login-history.php 1 month ago siteguard-login-lock.php 1 month ago siteguard-rename-login.php 1 week ago siteguard-updates-notify.php 1 month ago siteguard-waf-exclude-rule.php 1 month ago
siteguard-waf-exclude-rule.php
245 lines
1 <?php
2
3 define( 'SITEGUARD_WAF_EXCLUDE_RULE', 'waf_exclude_rule' );
4
5 class SiteGuard_WAF_Exclude_Rule extends SiteGuard_Base {
6 const HTACCESS_MARK = '#==== SITEGUARD_SG_WHITE_LIST_SETTINGS';
7
8 function __construct() {
9 }
10 static function get_mark() {
11 return self::HTACCESS_MARK;
12 }
13 function init() {
14 global $siteguard_config;
15 $siteguard_config->set( 'waf_exclude_rule_enable', '0' );
16 $this->clear_rules();
17 $siteguard_config->update();
18 }
19 function get_enable() {
20 global $siteguard_config;
21 $enable = $siteguard_config->get( 'waf_exclude_rule_enable' );
22 return $enable;
23 }
24 function set_enable( $enable ) {
25 global $siteguard_config;
26 $values = array( '0', '1' );
27 if ( ! in_array( $enable, $values ) ) {
28 return false;
29 }
30 $siteguard_config->set( 'waf_exclude_rule_enable', $enable );
31 $siteguard_config->update();
32 return true;
33 }
34 function cvt_exclude( $exclude ) {
35 return str_replace( ',', '|', $exclude );
36 }
37 function get_max_id( $rules ) {
38 $result = 0;
39 if ( ! is_array( $rules ) ) {
40 return $result;
41 }
42 foreach ( $rules as $rule ) {
43 if ( isset( $rule['ID'] ) && $result < $rule['ID'] ) {
44 $result = $rule['ID'];
45 }
46 }
47 return $result;
48 }
49 function input_check( $id, $filename, &$sig, $comment ) {
50 $errors = new WP_Error();
51 if ( ! is_numeric( $id ) ) {
52 $errors->add( 'white_list_error', esc_html__( 'ERROR: Invalid input value.', 'siteguard' ) );
53 }
54 if ( empty( $sig ) ) {
55 $errors->add( 'white_list_error', esc_html__( 'ERROR: Signature is required', 'siteguard' ) );
56 } else {
57 $tmp_sig = str_ireplace( 'SiteGuard_User_ExcludeSig ', '', $sig );
58 $tmp_sig = str_replace( ' ', '', $tmp_sig );
59 $tmp_sig = preg_replace( "/\r\n(\r\n)+/", "\r\n", $tmp_sig );
60 $tmp_sig = preg_replace( "/\r\n$/", '', $tmp_sig );
61 $tmp_sig = preg_replace( "/\n\n+/", "\n", $tmp_sig );
62 $tmp_sig = preg_replace( "/\n$/", '', $tmp_sig );
63 if ( 1 != preg_match( '/^[a-zA-Z0-9-\r\n]+$/', $tmp_sig ) ) {
64 $errors->add( 'white_list_error', esc_html__( 'ERROR: Syntax Error in Signature', 'siteguard' ) );
65 } else {
66 $sig = $tmp_sig;
67 }
68 }
69
70 if ( count( $errors->errors ) > 0 ) {
71 return $errors;
72 }
73 return true;
74 }
75 function add_rule( $filename, $sig, $comment ) {
76 global $siteguard_config;
77
78 // check
79 $errors = $this->input_check( 1, $filename, $sig, $comment );
80 if ( is_wp_error( $errors ) ) {
81 return $errors;
82 }
83 $sig = str_ireplace( 'SiteGuard_User_ExcludeSig', '', $sig );
84 $sig = str_replace( ' ', '', $sig );
85 $rules = $siteguard_config->get( SITEGUARD_WAF_EXCLUDE_RULE );
86 $rule = array(
87 'ID' => $this->get_max_id( $rules ) + 1,
88 'filename' => $filename,
89 'sig' => $sig,
90 'comment' => $comment,
91 );
92 if ( ! is_array( $rules ) ) {
93 $rules = (array) $rules;
94 }
95 array_push( $rules, $rule );
96 $siteguard_config->set( SITEGUARD_WAF_EXCLUDE_RULE, $rules );
97 $siteguard_config->update();
98 return true;
99 }
100 function clear_rules() {
101 global $siteguard_config;
102 $empty = array();
103 $siteguard_config->set( SITEGUARD_WAF_EXCLUDE_RULE, $empty );
104 $siteguard_config->update();
105 }
106 function get_rules() {
107 global $siteguard_config;
108 $rules = $siteguard_config->get( SITEGUARD_WAF_EXCLUDE_RULE );
109 return $rules;
110 }
111 function get_rule( $id, &$offset ) {
112 global $siteguard_config;
113 $rules = $siteguard_config->get( SITEGUARD_WAF_EXCLUDE_RULE );
114 $idx = 0;
115 foreach ( $rules as $rule ) {
116 if ( isset( $rule['ID'] ) && $rule['ID'] == $id ) {
117 $offset = $idx;
118 return $rule;
119 }
120 ++$idx;
121 }
122 $offset = -1;
123 return false;
124 }
125 function delete_rule( $ids ) {
126 global $siteguard_config;
127 $rules = $siteguard_config->get( SITEGUARD_WAF_EXCLUDE_RULE );
128 if ( ! is_array( $ids ) ) {
129 $ids = (array) $ids;
130 }
131 foreach ( $ids as $id ) {
132 $offset = 0;
133 $rule = $this->get_rule( sanitize_text_field( $id ), $offset );
134 if ( false === $rule ) {
135 continue;
136 }
137 array_splice( $rules, $offset, 1 );
138 $siteguard_config->set( SITEGUARD_WAF_EXCLUDE_RULE, $rules );
139 }
140 $siteguard_config->update();
141 return true;
142 }
143 function update_rule_itr( $new_rule ) {
144 global $siteguard_config;
145 $errors = new WP_Error();
146
147 $rules = $siteguard_config->get( SITEGUARD_WAF_EXCLUDE_RULE );
148 if ( isset( $new_rule['ID'] ) ) {
149 $id = $new_rule['ID'];
150 } else {
151 $errors->add( 'white_list_error', esc_html__( 'ERROR: Invalid input value.', 'siteguard' ) );
152 return $errors;
153 }
154 $offset = 0;
155 $rule = $this->get_rule( $id, $offset );
156 if ( false === $rule ) {
157 $errors->add( 'white_list_error', esc_html__( 'ERROR: Invalid input value.', 'siteguard' ) );
158 return $errors;
159 }
160 array_splice( $rules, $offset, 1, array( $new_rule ) );
161 $siteguard_config->set( SITEGUARD_WAF_EXCLUDE_RULE, $rules );
162 $siteguard_config->update();
163 return true;
164 }
165 function update_rule( $id, $filename, $sig, $comment ) {
166 // check
167 $errors = $this->input_check( $id, $filename, $sig, $comment );
168 if ( is_wp_error( $errors ) ) {
169 return $errors;
170 }
171
172 $new_rule = array(
173 'ID' => (int) $id,
174 'filename' => $filename,
175 'sig' => $sig,
176 'comment' => $comment,
177 );
178 return $this->update_rule_itr( $new_rule );
179 }
180 function cvt_csrf2comma( $signatures ) {
181 $result = preg_replace( "/(\r\n)+/", "\r\n", $signatures );
182 $result = str_replace( "\r\n", ',', $result );
183 $result = str_replace( "\r\n", ',', $result );
184 $result = str_replace( "\r", ',', $result );
185 $result = str_replace( "\n", ',', $result );
186 return $result;
187 }
188 // for SiteGuard Ver1.x
189 function output_exclude_sig_1( $sig_str ) {
190 $result = '';
191 $csv = $this->cvt_csrf2comma( $sig_str );
192 $sigs = preg_split( '/,/', $csv );
193 foreach ( $sigs as $sig ) {
194 $sig = str_replace( ' ', '', $sig );
195 if ( strlen( $sig ) > 0 ) {
196 $result .= ' SiteGuard_User_ExcludeSig ' . $sig . "\n";
197 }
198 }
199 return $result;
200 }
201 // for SiteGuard Ver2.x
202 function output_exclude_sig_2( $sig_str ) {
203 return ' SiteGuard_User_ExcludeSig ' . $this->cvt_csrf2comma( $sig_str ) . "\n";
204 }
205 function update_settings() {
206 global $siteguard_config, $siteguard_server_type;
207 $htaccess_str = '';
208 $rules = $siteguard_config->get( SITEGUARD_WAF_EXCLUDE_RULE );
209 if ( '' === $rules || ! is_array( $rules ) ) {
210 return;
211 }
212
213 $htaccess_str .= "<IfModule mod_siteguard.c>\n";
214 foreach ( $rules as $rule ) {
215 if ( isset( $rule['filename'] ) && isset( $rule['sig'] ) ) {
216 $filename = $rule['filename'];
217 $sig = $rule['sig'];
218 if ( ! empty( $filename ) ) {
219 $htaccess_str .= " <Files \"$filename\" >\n";
220 $htaccess_str .= $this->output_exclude_sig_1( $sig );
221 $htaccess_str .= " </Files>\n";
222 } else {
223 $htaccess_str .= $this->output_exclude_sig_1( $sig );
224 }
225 }
226 }
227 $htaccess_str .= "</IfModule>\n";
228
229 return $htaccess_str;
230 }
231 function feature_on() {
232 global $siteguard_htaccess;
233 if ( false === SiteGuard_Htaccess::check_permission() ) {
234 return false;
235 }
236 $data = $this->update_settings();
237 $mark = $this->get_mark();
238 return $siteguard_htaccess->update_settings( $mark, $data );
239 }
240 static function feature_off() {
241 $mark = self::get_mark();
242 return SiteGuard_Htaccess::clear_settings( $mark );
243 }
244 }
245