Version Description
- Removing deprecated get_magic_quotes_gpc function
- Improving Firewall Logging
Download this release
Release Info
| Developer | ritesh.soni36 |
| Plugin | |
| Version | 3.7 |
| Comparing to | |
| See all releases | |
Code changes from version 3.6 to 3.7
- admin/dashboard.php +4 -0
- admin/{main_page.php → registration.php} +1 -8
- admin/top_box.php +0 -4
- callback/handler.php +5 -4
- callback/wings/db.php +26 -4
- callback/wings/fs.php +23 -1
- callback/wings/misc.php +3 -0
- callback/wings/protect.php +3 -3
- info.php +7 -2
- malcare.php +5 -5
- protect/fw/config.php +31 -9
- protect/fw/fw.php +54 -51
- protect/fw/request.php +14 -30
- protect/prepend/protect.php +2 -2
- protect/wp/protect.php +4 -4
- readme.txt +6 -2
- wp_admin.php +16 -6
- wp_site_info.php +4 -0
admin/dashboard.php
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<div>
|
| 2 |
+
<iframe style="width: 99%; height: 1900px; padding-top: 13px;"src="<?=$this->account->authenticatedUrl('/malcare/access')?>">
|
| 3 |
+
</iframe>
|
| 4 |
+
</div>
|
admin/{main_page.php → registration.php}
RENAMED
|
@@ -1,9 +1,3 @@
|
|
| 1 |
-
<?php if (MCAccount::isConfigured($this->settings)) { ?>
|
| 2 |
-
<div>
|
| 3 |
-
<iframe style="width: 99%; height: 1900px; padding-top: 13px;"src="<?=$this->account->authenticatedUrl('/malcare/access')?>">
|
| 4 |
-
</iframe>
|
| 5 |
-
</div>
|
| 6 |
-
<?php } else { ?>
|
| 7 |
<div id="content-wrapper" style="width: 99%;">
|
| 8 |
<!-- Content HTML goes here -->
|
| 9 |
<div class="mui-container-fluid">
|
|
@@ -94,5 +88,4 @@
|
|
| 94 |
<div class="mui-container mui--text-center" style="margin-top: 10px;">
|
| 95 |
Made with ♥ by <a href="https://blogvault.net"><img src="<?php echo plugins_url('../img/bv.png', __FILE__); ?>" /></a>
|
| 96 |
</div>
|
| 97 |
-
</footer>
|
| 98 |
-
<?php } ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
<div id="content-wrapper" style="width: 99%;">
|
| 2 |
<!-- Content HTML goes here -->
|
| 3 |
<div class="mui-container-fluid">
|
| 88 |
<div class="mui-container mui--text-center" style="margin-top: 10px;">
|
| 89 |
Made with ♥ by <a href="https://blogvault.net"><img src="<?php echo plugins_url('../img/bv.png', __FILE__); ?>" /></a>
|
| 90 |
</div>
|
| 91 |
+
</footer>
|
|
|
admin/top_box.php
CHANGED
|
@@ -1,7 +1,3 @@
|
|
| 1 |
-
<?php if (!MCAccount::isConfigured($this->settings)) { ?>
|
| 2 |
-
<div class="mui--text-title main-title">Are you Hacked? Scan Your Website for FREE.</div>
|
| 3 |
-
<br/><br/>
|
| 4 |
-
<?php } ?>
|
| 5 |
<div style= "width: 800px; margin: 20px auto; overflow: hidden;">
|
| 6 |
<div style="width: 49%; float: left; border-right: 2px solid #333;">
|
| 7 |
<iframe width="380" height="215" src="https://www.youtube.com/embed/rBuYh2dIadk"></iframe>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
<div style= "width: 800px; margin: 20px auto; overflow: hidden;">
|
| 2 |
<div style="width: 49%; float: left; border-right: 2px solid #333;">
|
| 3 |
<iframe width="380" height="215" src="https://www.youtube.com/embed/rBuYh2dIadk"></iframe>
|
callback/handler.php
CHANGED
|
@@ -10,6 +10,7 @@ if (!class_exists('BVCallbackHandler')) :
|
|
| 10 |
public $request;
|
| 11 |
public $account;
|
| 12 |
public $response;
|
|
|
|
| 13 |
|
| 14 |
public function __construct($db, $settings, $siteinfo, $request, $account, $response) {
|
| 15 |
$this->db = $db;
|
|
@@ -18,6 +19,7 @@ if (!class_exists('BVCallbackHandler')) :
|
|
| 18 |
$this->request = $request;
|
| 19 |
$this->account = $account;
|
| 20 |
$this->response = $response;
|
|
|
|
| 21 |
}
|
| 22 |
|
| 23 |
public function bvAdmExecuteWithoutUser() {
|
|
@@ -30,17 +32,16 @@ if (!class_exists('BVCallbackHandler')) :
|
|
| 30 |
|
| 31 |
public function execute($resp = array()) {
|
| 32 |
$this->routeRequest();
|
| 33 |
-
$bvinfo = new MCInfo($this->settings);
|
| 34 |
$resp = array(
|
| 35 |
"request_info" => $this->request->info(),
|
| 36 |
"site_info" => $this->siteinfo->info(),
|
| 37 |
"account_info" => $this->account->info(),
|
| 38 |
-
"bvinfo" => $bvinfo->info(),
|
| 39 |
"api_pubkey" => substr(MCAccount::getApiPublicKey($this->settings), 0, 8)
|
| 40 |
);
|
| 41 |
$this->response->terminate($resp);
|
| 42 |
}
|
| 43 |
-
|
| 44 |
public function routeRequest() {
|
| 45 |
switch ($this->request->wing) {
|
| 46 |
case 'manage':
|
|
@@ -103,4 +104,4 @@ if (!class_exists('BVCallbackHandler')) :
|
|
| 103 |
return 1;
|
| 104 |
}
|
| 105 |
}
|
| 106 |
-
endif;
|
| 10 |
public $request;
|
| 11 |
public $account;
|
| 12 |
public $response;
|
| 13 |
+
public $bvinfo;
|
| 14 |
|
| 15 |
public function __construct($db, $settings, $siteinfo, $request, $account, $response) {
|
| 16 |
$this->db = $db;
|
| 19 |
$this->request = $request;
|
| 20 |
$this->account = $account;
|
| 21 |
$this->response = $response;
|
| 22 |
+
$this->bvinfo = new MCInfo($this->settings);
|
| 23 |
}
|
| 24 |
|
| 25 |
public function bvAdmExecuteWithoutUser() {
|
| 32 |
|
| 33 |
public function execute($resp = array()) {
|
| 34 |
$this->routeRequest();
|
|
|
|
| 35 |
$resp = array(
|
| 36 |
"request_info" => $this->request->info(),
|
| 37 |
"site_info" => $this->siteinfo->info(),
|
| 38 |
"account_info" => $this->account->info(),
|
| 39 |
+
"bvinfo" => $this->bvinfo->info(),
|
| 40 |
"api_pubkey" => substr(MCAccount::getApiPublicKey($this->settings), 0, 8)
|
| 41 |
);
|
| 42 |
$this->response->terminate($resp);
|
| 43 |
}
|
| 44 |
+
|
| 45 |
public function routeRequest() {
|
| 46 |
switch ($this->request->wing) {
|
| 47 |
case 'manage':
|
| 104 |
return 1;
|
| 105 |
}
|
| 106 |
}
|
| 107 |
+
endif;
|
callback/wings/db.php
CHANGED
|
@@ -9,9 +9,13 @@ class BVDBCallback extends BVCallbackBase {
|
|
| 9 |
public $stream;
|
| 10 |
public $account;
|
| 11 |
|
|
|
|
|
|
|
| 12 |
public function __construct($callback_handler) {
|
| 13 |
$this->db = $callback_handler->db;
|
| 14 |
$this->account = $callback_handler->account;
|
|
|
|
|
|
|
| 15 |
}
|
| 16 |
|
| 17 |
public function getLastID($pkeys, $end_row) {
|
|
@@ -64,6 +68,24 @@ class BVDBCallback extends BVCallbackBase {
|
|
| 64 |
$db = $this->db;
|
| 65 |
$params = $request->params;
|
| 66 |
$stream_init_info = BVStream::startStream($this->account, $request);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
if (array_key_exists('stream', $stream_init_info)) {
|
| 68 |
$this->stream = $stream_init_info['stream'];
|
| 69 |
switch ($request->method) {
|
|
@@ -140,17 +162,17 @@ class BVDBCallback extends BVCallbackBase {
|
|
| 140 |
$resp = $this->getTableData($table, $tname, $rcount, $offset, $limit, $bsize, $filter, $pkeys, true);
|
| 141 |
break;
|
| 142 |
case "tblexists":
|
| 143 |
-
$resp = array("tblexists" => $db->isTablePresent($params['
|
| 144 |
break;
|
| 145 |
case "crttbl":
|
| 146 |
$usedbdelta = array_key_exists('usedbdelta', $params);
|
| 147 |
-
$resp = array("crttbl" => $db->createTable($params['query'], $params['
|
| 148 |
break;
|
| 149 |
case "drptbl":
|
| 150 |
-
$resp = array("drptbl" => $db->dropBVTable($params['
|
| 151 |
break;
|
| 152 |
case "trttbl":
|
| 153 |
-
$resp = array("trttbl" => $db->truncateBVTable($params['
|
| 154 |
break;
|
| 155 |
case "altrtbl":
|
| 156 |
$resp = array("altrtbl" => $db->alterBVTable($params['query'], $params['query']));
|
| 9 |
public $stream;
|
| 10 |
public $account;
|
| 11 |
|
| 12 |
+
public static $bvTables = array("fw_requests", "lp_requests", "ip_store");
|
| 13 |
+
|
| 14 |
public function __construct($callback_handler) {
|
| 15 |
$this->db = $callback_handler->db;
|
| 16 |
$this->account = $callback_handler->account;
|
| 17 |
+
$this->siteinfo = $callback_handler->siteinfo;
|
| 18 |
+
$this->bvinfo = $callback_handler->bvinfo;
|
| 19 |
}
|
| 20 |
|
| 21 |
public function getLastID($pkeys, $end_row) {
|
| 68 |
$db = $this->db;
|
| 69 |
$params = $request->params;
|
| 70 |
$stream_init_info = BVStream::startStream($this->account, $request);
|
| 71 |
+
|
| 72 |
+
if($this->siteinfo->isCWServer() && !$this->bvinfo->canOverrideCW()) {
|
| 73 |
+
$bv_table = $params['table'];
|
| 74 |
+
if (!empty($bv_table)) {
|
| 75 |
+
$allowed = false;
|
| 76 |
+
foreach(BVDBCallback::$bvTables as $table) {
|
| 77 |
+
if ($bv_table == $table || $bv_table == $db->getBVTable($table)) {
|
| 78 |
+
$allowed = true;
|
| 79 |
+
break;
|
| 80 |
+
}
|
| 81 |
+
}
|
| 82 |
+
if (!$allowed) {
|
| 83 |
+
return $stream_init_info;
|
| 84 |
+
}
|
| 85 |
+
}
|
| 86 |
+
}
|
| 87 |
+
|
| 88 |
+
|
| 89 |
if (array_key_exists('stream', $stream_init_info)) {
|
| 90 |
$this->stream = $stream_init_info['stream'];
|
| 91 |
switch ($request->method) {
|
| 162 |
$resp = $this->getTableData($table, $tname, $rcount, $offset, $limit, $bsize, $filter, $pkeys, true);
|
| 163 |
break;
|
| 164 |
case "tblexists":
|
| 165 |
+
$resp = array("tblexists" => $db->isTablePresent($params['table']));
|
| 166 |
break;
|
| 167 |
case "crttbl":
|
| 168 |
$usedbdelta = array_key_exists('usedbdelta', $params);
|
| 169 |
+
$resp = array("crttbl" => $db->createTable($params['query'], $params['table'], $usedbdelta));
|
| 170 |
break;
|
| 171 |
case "drptbl":
|
| 172 |
+
$resp = array("drptbl" => $db->dropBVTable($params['table']));
|
| 173 |
break;
|
| 174 |
case "trttbl":
|
| 175 |
+
$resp = array("trttbl" => $db->truncateBVTable($params['table']));
|
| 176 |
break;
|
| 177 |
case "altrtbl":
|
| 178 |
$resp = array("altrtbl" => $db->alterBVTable($params['query'], $params['query']));
|
callback/wings/fs.php
CHANGED
|
@@ -8,8 +8,12 @@ class BVFSCallback extends BVCallbackBase {
|
|
| 8 |
public $stream;
|
| 9 |
public $account;
|
| 10 |
|
|
|
|
|
|
|
| 11 |
public function __construct($callback_handler) {
|
| 12 |
$this->account = $callback_handler->account;
|
|
|
|
|
|
|
| 13 |
}
|
| 14 |
|
| 15 |
function fileStat($relfile) {
|
|
@@ -262,6 +266,24 @@ class BVFSCallback extends BVCallbackBase {
|
|
| 262 |
function process($request) {
|
| 263 |
$params = $request->params;
|
| 264 |
$stream_init_info = BVStream::startStream($this->account, $request);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 265 |
if (array_key_exists('stream', $stream_init_info)) {
|
| 266 |
$this->stream = $stream_init_info['stream'];
|
| 267 |
switch ($request->method) {
|
|
@@ -356,4 +378,4 @@ class BVFSCallback extends BVCallbackBase {
|
|
| 356 |
return $resp;
|
| 357 |
}
|
| 358 |
}
|
| 359 |
-
endif;
|
| 8 |
public $stream;
|
| 9 |
public $account;
|
| 10 |
|
| 11 |
+
public static $cwAllowedFiles = array(".htaccess", ".user.ini", "malcare-waf.php");
|
| 12 |
+
|
| 13 |
public function __construct($callback_handler) {
|
| 14 |
$this->account = $callback_handler->account;
|
| 15 |
+
$this->siteinfo = $callback_handler->siteinfo;
|
| 16 |
+
$this->bvinfo = $callback_handler->bvinfo;
|
| 17 |
}
|
| 18 |
|
| 19 |
function fileStat($relfile) {
|
| 266 |
function process($request) {
|
| 267 |
$params = $request->params;
|
| 268 |
$stream_init_info = BVStream::startStream($this->account, $request);
|
| 269 |
+
|
| 270 |
+
if($this->siteinfo->isCWServer() && !$this->bvinfo->canOverrideCW()) {
|
| 271 |
+
if(array_key_exists('initdir', $params)) {
|
| 272 |
+
return $stream_init_info;
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
if (array_key_exists('files', $params)) {
|
| 276 |
+
$files = $params['files'];
|
| 277 |
+
|
| 278 |
+
foreach($files as $file) {
|
| 279 |
+
if (!in_array($file, BVFSCallback::$cwAllowedFiles)) {
|
| 280 |
+
return $stream_init_info;
|
| 281 |
+
}
|
| 282 |
+
}
|
| 283 |
+
}
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
|
| 287 |
if (array_key_exists('stream', $stream_init_info)) {
|
| 288 |
$this->stream = $stream_init_info['stream'];
|
| 289 |
switch ($request->method) {
|
| 378 |
return $resp;
|
| 379 |
}
|
| 380 |
}
|
| 381 |
+
endif;
|
callback/wings/misc.php
CHANGED
|
@@ -68,6 +68,9 @@ class BVMiscCallback extends BVCallbackBase {
|
|
| 68 |
case "dlttrsnt":
|
| 69 |
$resp = array("dlttrsnt" => $settings->deleteTransient($params['key']));
|
| 70 |
break;
|
|
|
|
|
|
|
|
|
|
| 71 |
default:
|
| 72 |
$resp = false;
|
| 73 |
}
|
| 68 |
case "dlttrsnt":
|
| 69 |
$resp = array("dlttrsnt" => $settings->deleteTransient($params['key']));
|
| 70 |
break;
|
| 71 |
+
case "ovrcwoptn":
|
| 72 |
+
$resp = array("ovrcwoptn" => $settings->updateOption('bvoverridecw', true));
|
| 73 |
+
break;
|
| 74 |
default:
|
| 75 |
$resp = false;
|
| 76 |
}
|
callback/wings/protect.php
CHANGED
|
@@ -90,7 +90,7 @@ class BVProtectCallback extends BVCallbackBase {
|
|
| 90 |
|
| 91 |
public function writeToMcDataFile($fname, $content, $confkey, $permissions) {
|
| 92 |
$result = array();
|
| 93 |
-
if (in_array($fname, BVFWConfig
|
| 94 |
|
| 95 |
$mcDataPath = $this->mcDataPath();
|
| 96 |
|
|
@@ -435,7 +435,7 @@ auto_prepend_file = '%s'
|
|
| 435 |
break;
|
| 436 |
case "rmmcdta":
|
| 437 |
$name = $params['name'];
|
| 438 |
-
if (in_array($name, BVFWConfig
|
| 439 |
switch($name) {
|
| 440 |
case "mc.conf":
|
| 441 |
$name = $this->mcConfigFilePath($params['confkey']);
|
|
@@ -508,4 +508,4 @@ auto_prepend_file = '%s'
|
|
| 508 |
return $resp;
|
| 509 |
}
|
| 510 |
}
|
| 511 |
-
endif;
|
| 90 |
|
| 91 |
public function writeToMcDataFile($fname, $content, $confkey, $permissions) {
|
| 92 |
$result = array();
|
| 93 |
+
if (in_array($fname, BVFWConfig::$validMcDataFilenames)) {
|
| 94 |
|
| 95 |
$mcDataPath = $this->mcDataPath();
|
| 96 |
|
| 435 |
break;
|
| 436 |
case "rmmcdta":
|
| 437 |
$name = $params['name'];
|
| 438 |
+
if (in_array($name, BVFWConfig::$validDeletableFiles)) {
|
| 439 |
switch($name) {
|
| 440 |
case "mc.conf":
|
| 441 |
$name = $this->mcConfigFilePath($params['confkey']);
|
| 508 |
return $resp;
|
| 509 |
}
|
| 510 |
}
|
| 511 |
+
endif;
|
info.php
CHANGED
|
@@ -9,7 +9,7 @@ if (!class_exists('MCInfo')) :
|
|
| 9 |
public $badgeinfo = 'mcbadge';
|
| 10 |
public $ip_header_option = 'mcipheader';
|
| 11 |
public $brand_option = 'mcbrand';
|
| 12 |
-
public $version = '3.
|
| 13 |
public $webpage = 'https://www.malcare.com';
|
| 14 |
public $appurl = 'https://app.malcare.com';
|
| 15 |
public $slug = 'malcare-security/malcare.php';
|
|
@@ -21,6 +21,11 @@ if (!class_exists('MCInfo')) :
|
|
| 21 |
$this->settings = $settings;
|
| 22 |
}
|
| 23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
public function getBrandInfo() {
|
| 25 |
return $this->settings->getOption($this->brand_option);
|
| 26 |
}
|
|
@@ -93,4 +98,4 @@ if (!class_exists('MCInfo')) :
|
|
| 93 |
);
|
| 94 |
}
|
| 95 |
}
|
| 96 |
-
endif;
|
| 9 |
public $badgeinfo = 'mcbadge';
|
| 10 |
public $ip_header_option = 'mcipheader';
|
| 11 |
public $brand_option = 'mcbrand';
|
| 12 |
+
public $version = '3.7';
|
| 13 |
public $webpage = 'https://www.malcare.com';
|
| 14 |
public $appurl = 'https://app.malcare.com';
|
| 15 |
public $slug = 'malcare-security/malcare.php';
|
| 21 |
$this->settings = $settings;
|
| 22 |
}
|
| 23 |
|
| 24 |
+
public function canOverrideCW() {
|
| 25 |
+
$scanOption = $this->settings->getOption('bvoverridecw');
|
| 26 |
+
return (isset($scanOption) && $scanOption == 1);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
public function getBrandInfo() {
|
| 30 |
return $this->settings->getOption($this->brand_option);
|
| 31 |
}
|
| 98 |
);
|
| 99 |
}
|
| 100 |
}
|
| 101 |
+
endif;
|
malcare.php
CHANGED
|
@@ -5,7 +5,7 @@ Plugin URI: https://www.malcare.com
|
|
| 5 |
Description: WordPress Security, Firewall and Malware Scanner
|
| 6 |
Author: MalCare Security
|
| 7 |
Author URI: https://www.malcare.com
|
| 8 |
-
Version: 3.
|
| 9 |
Network: True
|
| 10 |
*/
|
| 11 |
|
|
@@ -54,10 +54,10 @@ register_deactivation_hook(__FILE__, array($wp_action, 'deactivate'));
|
|
| 54 |
add_action('wp_footer', array($wp_action, 'footerHandler'), 100);
|
| 55 |
|
| 56 |
if (defined('WP_CLI') && WP_CLI) {
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
|
| 62 |
if (is_admin()) {
|
| 63 |
require_once dirname( __FILE__ ) . '/wp_admin.php';
|
| 5 |
Description: WordPress Security, Firewall and Malware Scanner
|
| 6 |
Author: MalCare Security
|
| 7 |
Author URI: https://www.malcare.com
|
| 8 |
+
Version: 3.7
|
| 9 |
Network: True
|
| 10 |
*/
|
| 11 |
|
| 54 |
add_action('wp_footer', array($wp_action, 'footerHandler'), 100);
|
| 55 |
|
| 56 |
if (defined('WP_CLI') && WP_CLI) {
|
| 57 |
+
require_once dirname( __FILE__ ) . '/wp_cli.php';
|
| 58 |
+
$wp_cli = new MCWPCli($bvsettings, $bvinfo, $bvsiteinfo, $bvapi);
|
| 59 |
+
WP_CLI::add_command('malcare', $wp_cli);
|
| 60 |
+
}
|
| 61 |
|
| 62 |
if (is_admin()) {
|
| 63 |
require_once dirname( __FILE__ ) . '/wp_admin.php';
|
protect/fw/config.php
CHANGED
|
@@ -7,12 +7,14 @@ class BVFWConfig {
|
|
| 7 |
public $mode;
|
| 8 |
public $requestProfilingMode;
|
| 9 |
public $roleLevel;
|
| 10 |
-
public $
|
|
|
|
| 11 |
public $bypassLevel;
|
| 12 |
public $customRoles;
|
| 13 |
public $cookieKey;
|
| 14 |
public $cookiePath;
|
| 15 |
public $cookieDomain;
|
|
|
|
| 16 |
|
| 17 |
public static $requests_table = 'fw_requests';
|
| 18 |
public static $roleLevels = array(
|
|
@@ -26,7 +28,9 @@ class BVFWConfig {
|
|
| 26 |
function __construct($confHash) {
|
| 27 |
$this->mode = array_key_exists('mode', $confHash) ? intval($confHash['mode']) : BVFWConfig::DISABLED;
|
| 28 |
$this->requestProfilingMode = array_key_exists('reqprofilingmode', $confHash) ? intval($confHash['reqprofilingmode']) : BVFWConfig::REQ_PROFILING_MODE_DISABLED;
|
| 29 |
-
$this->
|
|
|
|
|
|
|
| 30 |
$this->bypassLevel = array_key_exists('bypasslevel', $confHash) ? intval($confHash['bypasslevel']) : BVFWConfig::ROLE_LEVEL_CONTRIBUTOR;
|
| 31 |
$this->customRoles = array_key_exists('customroles', $confHash) ? $confHash['customroles'] : array();
|
| 32 |
$this->cookieKey = array_key_exists('cookiekey', $confHash) ? $confHash['cookiekey'] : "";
|
|
@@ -44,9 +48,13 @@ class BVFWConfig {
|
|
| 44 |
const REQ_PROFILING_MODE_NORMAL = 2;
|
| 45 |
const REQ_PROFILING_MODE_DEBUG = 3;
|
| 46 |
|
| 47 |
-
#Cookie Mode
|
| 48 |
-
const
|
| 49 |
-
const
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
|
| 51 |
#Role Level
|
| 52 |
const ROLE_LEVEL_SUBSCRIBER = 1;
|
|
@@ -63,10 +71,16 @@ class BVFWConfig {
|
|
| 63 |
const MODE_NGINX = 4;
|
| 64 |
const MODE_LITESPEED = 5;
|
| 65 |
const MODE_IIS = 6;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 66 |
|
| 67 |
#Valid mc_data filenames
|
| 68 |
-
|
| 69 |
-
|
| 70 |
|
| 71 |
public function isActive() {
|
| 72 |
return ($this->mode !== BVFWConfig::DISABLED);
|
|
@@ -88,8 +102,16 @@ class BVFWConfig {
|
|
| 88 |
return ($this->requestProfilingMode !== BVFWConfig::REQ_PROFILING_MODE_DISABLED);
|
| 89 |
}
|
| 90 |
|
| 91 |
-
public function
|
| 92 |
-
return ($this->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
}
|
| 94 |
}
|
| 95 |
endif;
|
| 7 |
public $mode;
|
| 8 |
public $requestProfilingMode;
|
| 9 |
public $roleLevel;
|
| 10 |
+
public $ipCookieMode;
|
| 11 |
+
public $adminCookieMode;
|
| 12 |
public $bypassLevel;
|
| 13 |
public $customRoles;
|
| 14 |
public $cookieKey;
|
| 15 |
public $cookiePath;
|
| 16 |
public $cookieDomain;
|
| 17 |
+
public $loggingMode;
|
| 18 |
|
| 19 |
public static $requests_table = 'fw_requests';
|
| 20 |
public static $roleLevels = array(
|
| 28 |
function __construct($confHash) {
|
| 29 |
$this->mode = array_key_exists('mode', $confHash) ? intval($confHash['mode']) : BVFWConfig::DISABLED;
|
| 30 |
$this->requestProfilingMode = array_key_exists('reqprofilingmode', $confHash) ? intval($confHash['reqprofilingmode']) : BVFWConfig::REQ_PROFILING_MODE_DISABLED;
|
| 31 |
+
$this->ipCookieMode = array_key_exists('ipcookiemode', $confHash) ? intval($confHash['ipcookiemode']) : BVFWConfig::IP_COOKIE_MODE_DISABLED;
|
| 32 |
+
$this->adminCookieMode = array_key_exists('admincookiemode', $confHash) ? intval($confHash['admincookiemode']) : BVFWConfig::ADMIN_COOKIE_MODE_DISABLED;
|
| 33 |
+
$this->loggingMode = array_key_exists('loggingmode', $confHash) ? intval($confHash['loggingmode']) : BVFWConfig::LOGGING_MODE_VISITOR;
|
| 34 |
$this->bypassLevel = array_key_exists('bypasslevel', $confHash) ? intval($confHash['bypasslevel']) : BVFWConfig::ROLE_LEVEL_CONTRIBUTOR;
|
| 35 |
$this->customRoles = array_key_exists('customroles', $confHash) ? $confHash['customroles'] : array();
|
| 36 |
$this->cookieKey = array_key_exists('cookiekey', $confHash) ? $confHash['cookiekey'] : "";
|
| 48 |
const REQ_PROFILING_MODE_NORMAL = 2;
|
| 49 |
const REQ_PROFILING_MODE_DEBUG = 3;
|
| 50 |
|
| 51 |
+
#IP Cookie Mode
|
| 52 |
+
const IP_COOKIE_MODE_ENABLED = 1;
|
| 53 |
+
const IP_COOKIE_MODE_DISABLED = 2;
|
| 54 |
+
|
| 55 |
+
#Admin Cookie Mode
|
| 56 |
+
const ADMIN_COOKIE_MODE_ENABLED = 1;
|
| 57 |
+
const ADMIN_COOKIE_MODE_DISABLED = 2;
|
| 58 |
|
| 59 |
#Role Level
|
| 60 |
const ROLE_LEVEL_SUBSCRIBER = 1;
|
| 71 |
const MODE_NGINX = 4;
|
| 72 |
const MODE_LITESPEED = 5;
|
| 73 |
const MODE_IIS = 6;
|
| 74 |
+
|
| 75 |
+
#Logging Mode
|
| 76 |
+
const LOGGING_MODE_VISITOR = 1;
|
| 77 |
+
const LOGGING_MODE_COMPLETE = 2;
|
| 78 |
+
const LOGGING_MODE_DISABLED = 3;
|
| 79 |
+
|
| 80 |
|
| 81 |
#Valid mc_data filenames
|
| 82 |
+
public static $validMcDataFilenames = array('mc.conf', 'mc_ips.conf');
|
| 83 |
+
public static $validDeletableFiles = array('mc.conf', 'mc_ips.conf', 'malcare-waf.php', 'mc.log', 'mc_data');
|
| 84 |
|
| 85 |
public function isActive() {
|
| 86 |
return ($this->mode !== BVFWConfig::DISABLED);
|
| 102 |
return ($this->requestProfilingMode !== BVFWConfig::REQ_PROFILING_MODE_DISABLED);
|
| 103 |
}
|
| 104 |
|
| 105 |
+
public function isCompleteLoggingEnabled() {
|
| 106 |
+
return ($this->loggingMode === BVFWConfig::LOGGING_MODE_COMPLETE);
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
public function isVisitorLoggingEnabled() {
|
| 110 |
+
return ($this->loggingMode === BVFWConfig::LOGGING_MODE_VISITOR);
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
public function isLoggingDisabled() {
|
| 114 |
+
return ($this->loggingMode === BVFWConfig::LOGGING_MODE_DISABLED);
|
| 115 |
}
|
| 116 |
}
|
| 117 |
endif;
|
protect/fw/fw.php
CHANGED
|
@@ -87,7 +87,7 @@ class BVFW {
|
|
| 87 |
|
| 88 |
public function hasValidBypassCookie() {
|
| 89 |
$cookie = (string) $this->request->getCookies(BVFW::BYPASS_COOKIE);
|
| 90 |
-
return ($this->
|
| 91 |
}
|
| 92 |
|
| 93 |
public function setIPCookie() {
|
|
@@ -102,7 +102,9 @@ class BVFW {
|
|
| 102 |
|
| 103 |
public function getBVCookies() {
|
| 104 |
$cookies = array();
|
| 105 |
-
|
|
|
|
|
|
|
| 106 |
return $cookies;
|
| 107 |
}
|
| 108 |
|
|
@@ -128,9 +130,12 @@ class BVFW {
|
|
| 128 |
public function isActive() {
|
| 129 |
return $this->config->isActive();
|
| 130 |
}
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
-
public function
|
| 133 |
-
return $this->config->
|
| 134 |
}
|
| 135 |
|
| 136 |
public function setResponseCode() {
|
|
@@ -142,16 +147,21 @@ class BVFW {
|
|
| 142 |
return true;
|
| 143 |
}
|
| 144 |
|
| 145 |
-
public function
|
| 146 |
-
$
|
| 147 |
|
| 148 |
-
if ($this->config->
|
| 149 |
-
$canlog =
|
| 150 |
-
} else {
|
| 151 |
-
$canlog = (
|
|
|
|
| 152 |
}
|
|
|
|
|
|
|
| 153 |
|
| 154 |
-
|
|
|
|
|
|
|
| 155 |
$this->logger->log($this->request->getDataToLog());
|
| 156 |
}
|
| 157 |
}
|
|
@@ -195,28 +205,20 @@ class BVFW {
|
|
| 195 |
public function execute() {
|
| 196 |
if ($this->config->canProfileReqInfo()) {
|
| 197 |
$result = array();
|
| 198 |
-
$result += $this->profileRequestInfo($this->request->getBody(),
|
| 199 |
-
$this->config->isReqProfilingModeDebug(), 'BODY_');
|
| 200 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 201 |
$result += $this->profileRequestInfo($this->request->getQueryString(),
|
| 202 |
-
true, '
|
| 203 |
-
|
| 204 |
$result += $this->profileRequestInfo($this->request->getFiles(),
|
| 205 |
-
true, '
|
| 206 |
-
|
| 207 |
$result += $this->profileRequestInfo($this->getBVCookies(),
|
| 208 |
-
true, '
|
| 209 |
-
|
| 210 |
-
if (strpos($this->request->getPath(), 'admin-ajax.php') !== false) {
|
| 211 |
-
$result += array('BODY_ADMIN_AJAX_ACTION' => $this->request->getBody('action'));
|
| 212 |
-
$result += array('GET_ADMIN_AJAX_ACTION' => $this->request->getQueryString('action'));
|
| 213 |
-
}
|
| 214 |
-
|
| 215 |
-
if (strpos($this->request->getPath(), 'admin-post.php') !== false) {
|
| 216 |
-
$result += array('BODY_ADMIN_POST_ACTION' => $this->request->getBody('action'));
|
| 217 |
-
$result += array('GET_ADMIN_POST_ACTION' => $this->request->getQueryString('action'));
|
| 218 |
-
}
|
| 219 |
-
|
| 220 |
$this->request->updateReqInfo($result);
|
| 221 |
}
|
| 222 |
|
|
@@ -252,40 +254,41 @@ class BVFW {
|
|
| 252 |
}
|
| 253 |
}
|
| 254 |
|
| 255 |
-
public function profileRequestInfo($params, $debug = false, $prefix = '') {
|
| 256 |
$result = array();
|
| 257 |
if (is_array($params)) {
|
| 258 |
foreach ($params as $key => $value) {
|
| 259 |
-
$
|
| 260 |
if (is_array($value)) {
|
| 261 |
-
$result = $result + $this->profileRequestInfo($value, $debug, $
|
| 262 |
} else {
|
| 263 |
-
$
|
|
|
|
| 264 |
$valsize = $this->getLength($value);
|
| 265 |
-
$result[$
|
| 266 |
if ($debug === true && $valsize < 256) {
|
| 267 |
-
$result[$
|
| 268 |
continue;
|
| 269 |
}
|
| 270 |
|
| 271 |
if (preg_match('/^\d+$/', $value)) {
|
| 272 |
-
$result[$
|
| 273 |
} else if (preg_match('/^\w+$/', $value)) {
|
| 274 |
-
$result[$
|
| 275 |
} else if (preg_match('/^\S+$/', $value)) {
|
| 276 |
-
$result[$
|
| 277 |
} else if (preg_match('/^[\w\s]+$/', $value)) {
|
| 278 |
-
$result[$
|
| 279 |
} else if (preg_match('/^[\w\W]+$/', $value)) {
|
| 280 |
-
$result[$
|
| 281 |
}
|
| 282 |
|
| 283 |
if (preg_match('/^\b((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}
|
| 284 |
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b$/x', $value)) {
|
| 285 |
-
$result[$
|
| 286 |
} else if (preg_match('/\b((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}
|
| 287 |
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b/x', $value)) {
|
| 288 |
-
$result[$
|
| 289 |
} else if (preg_match('/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|
|
| 290 |
([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|
|
| 291 |
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}
|
|
@@ -295,7 +298,7 @@ class BVFW {
|
|
| 295 |
::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}
|
| 296 |
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|
|
| 297 |
(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/x', $value)) {
|
| 298 |
-
$result[$
|
| 299 |
} else if (preg_match('/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|
|
| 300 |
([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|
|
| 301 |
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}
|
|
@@ -305,35 +308,35 @@ class BVFW {
|
|
| 305 |
::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}
|
| 306 |
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|
|
| 307 |
(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/x', $value)) {
|
| 308 |
-
$result[$
|
| 309 |
}
|
| 310 |
|
| 311 |
if (preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/', $value)) {
|
| 312 |
-
$result[$
|
| 313 |
} else if (preg_match('/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/', $value)) {
|
| 314 |
-
$result[$
|
| 315 |
}
|
| 316 |
|
| 317 |
if (preg_match('/^(http|ftp)s?:\/\/\S+$/i', $value)) {
|
| 318 |
-
$result[$
|
| 319 |
} else if (preg_match('/(http|ftp)s?:\/\/\S+$/i', $value)) {
|
| 320 |
-
$result[$
|
| 321 |
}
|
| 322 |
|
| 323 |
if (preg_match('/<(html|head|title|base|link|meta|style|picture|source|img|
|
| 324 |
iframe|embed|object|param|video|audio|track|map|area|form|label|input|button|
|
| 325 |
select|datalist|optgroup|option|textarea|output|progress|meter|fieldset|legend|
|
| 326 |
script|noscript|template|slot|canvas)/ix', $value)) {
|
| 327 |
-
$result[$
|
| 328 |
}
|
| 329 |
|
| 330 |
if (preg_match('/\.(jpg|jpeg|png|gif|ico|pdf|doc|docx|ppt|pptx|pps|ppsx|odt|xls|zip|gzip|
|
| 331 |
xlsx|psd|mp3|m4a|ogg|wav|mp4|m4v|mov|wmv|avi|mpg|ogv|3gp|3g2|php|html|phtml|js|css)/ix', $value)) {
|
| 332 |
-
$result[$
|
| 333 |
}
|
| 334 |
|
| 335 |
if ($this->matchCount(BVFW::SQLIREGEX, $value) >= 2) {
|
| 336 |
-
$result[$
|
| 337 |
}
|
| 338 |
}
|
| 339 |
}
|
| 87 |
|
| 88 |
public function hasValidBypassCookie() {
|
| 89 |
$cookie = (string) $this->request->getCookies(BVFW::BYPASS_COOKIE);
|
| 90 |
+
return ($this->canSetAdminCookie() && ($cookie === $this->generateBypassCookie()));
|
| 91 |
}
|
| 92 |
|
| 93 |
public function setIPCookie() {
|
| 102 |
|
| 103 |
public function getBVCookies() {
|
| 104 |
$cookies = array();
|
| 105 |
+
if ($this->request->getCookies(BVFW::IP_COOKIE) !== NULL) {
|
| 106 |
+
$cookies[BVFW::IP_COOKIE] = (string) $this->request->getCookies(BVFW::IP_COOKIE);
|
| 107 |
+
}
|
| 108 |
return $cookies;
|
| 109 |
}
|
| 110 |
|
| 130 |
public function isActive() {
|
| 131 |
return $this->config->isActive();
|
| 132 |
}
|
| 133 |
+
public function canSetAdminCookie() {
|
| 134 |
+
return ($this->config->adminCookieMode === BVFWConfig::ADMIN_COOKIE_MODE_ENABLED);
|
| 135 |
+
}
|
| 136 |
|
| 137 |
+
public function canSetIPCookie() {
|
| 138 |
+
return ($this->config->ipCookieMode === BVFWConfig::IP_COOKIE_MODE_ENABLED);
|
| 139 |
}
|
| 140 |
|
| 141 |
public function setResponseCode() {
|
| 147 |
return true;
|
| 148 |
}
|
| 149 |
|
| 150 |
+
public function canLog() {
|
| 151 |
+
$canlog = false;
|
| 152 |
|
| 153 |
+
if ($this->config->isCompleteLoggingEnabled()) {
|
| 154 |
+
$canlog = true;
|
| 155 |
+
} else if ($this->config->isVisitorLoggingEnabled()) {
|
| 156 |
+
$canlog = !$this->hasValidBypassCookie() &&
|
| 157 |
+
(!function_exists('is_user_logged_in') || !is_user_logged_in());
|
| 158 |
}
|
| 159 |
+
return $canlog;
|
| 160 |
+
}
|
| 161 |
|
| 162 |
+
public function log() {
|
| 163 |
+
if ($this->canLog()) {
|
| 164 |
+
$this->setResponseCode();
|
| 165 |
$this->logger->log($this->request->getDataToLog());
|
| 166 |
}
|
| 167 |
}
|
| 205 |
public function execute() {
|
| 206 |
if ($this->config->canProfileReqInfo()) {
|
| 207 |
$result = array();
|
|
|
|
|
|
|
| 208 |
|
| 209 |
+
if ($this->request->getMethod() === 'POST' &&
|
| 210 |
+
preg_match('/(admin-ajax.php|admin-post.php)$/', $this->request->getPath())) {
|
| 211 |
+
$result += $this->profileRequestInfo(array("action" => $this->request->getBody('action')),
|
| 212 |
+
true, 'BODY[');
|
| 213 |
+
}
|
| 214 |
+
$result += $this->profileRequestInfo($this->request->getBody(),
|
| 215 |
+
$this->config->isReqProfilingModeDebug(), 'BODY[');
|
| 216 |
$result += $this->profileRequestInfo($this->request->getQueryString(),
|
| 217 |
+
true, 'GET[');
|
|
|
|
| 218 |
$result += $this->profileRequestInfo($this->request->getFiles(),
|
| 219 |
+
true, 'FILES[');
|
|
|
|
| 220 |
$result += $this->profileRequestInfo($this->getBVCookies(),
|
| 221 |
+
true, 'COOKIES[');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
$this->request->updateReqInfo($result);
|
| 223 |
}
|
| 224 |
|
| 254 |
}
|
| 255 |
}
|
| 256 |
|
| 257 |
+
public function profileRequestInfo($params, $debug = false, $prefix = '', $obraces = 1) {
|
| 258 |
$result = array();
|
| 259 |
if (is_array($params)) {
|
| 260 |
foreach ($params as $key => $value) {
|
| 261 |
+
$key = $prefix . $key;
|
| 262 |
if (is_array($value)) {
|
| 263 |
+
$result = $result + $this->profileRequestInfo($value, $debug, $key . '[', $obraces + 1);
|
| 264 |
} else {
|
| 265 |
+
$key = $key . str_repeat(']', $obraces);
|
| 266 |
+
$result[$key] = array();
|
| 267 |
$valsize = $this->getLength($value);
|
| 268 |
+
$result[$key]["size"] = $valsize;
|
| 269 |
if ($debug === true && $valsize < 256) {
|
| 270 |
+
$result[$key]["value"] = $value;
|
| 271 |
continue;
|
| 272 |
}
|
| 273 |
|
| 274 |
if (preg_match('/^\d+$/', $value)) {
|
| 275 |
+
$result[$key]["numeric"] = true;
|
| 276 |
} else if (preg_match('/^\w+$/', $value)) {
|
| 277 |
+
$result[$key]["regular_word"] = true;
|
| 278 |
} else if (preg_match('/^\S+$/', $value)) {
|
| 279 |
+
$result[$key]["special_word"] = true;
|
| 280 |
} else if (preg_match('/^[\w\s]+$/', $value)) {
|
| 281 |
+
$result[$key]["regular_sentence"] = true;
|
| 282 |
} else if (preg_match('/^[\w\W]+$/', $value)) {
|
| 283 |
+
$result[$key]["special_chars_sentence"] = true;
|
| 284 |
}
|
| 285 |
|
| 286 |
if (preg_match('/^\b((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}
|
| 287 |
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b$/x', $value)) {
|
| 288 |
+
$result[$key]["ipv4"] = true;
|
| 289 |
} else if (preg_match('/\b((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}
|
| 290 |
(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b/x', $value)) {
|
| 291 |
+
$result[$key]["embeded_ipv4"] = true;
|
| 292 |
} else if (preg_match('/^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|
|
| 293 |
([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|
|
| 294 |
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}
|
| 298 |
::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}
|
| 299 |
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|
|
| 300 |
(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/x', $value)) {
|
| 301 |
+
$result[$key]["ipv6"] = true;
|
| 302 |
} else if (preg_match('/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|
|
| 303 |
([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|
|
| 304 |
([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}
|
| 308 |
::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}
|
| 309 |
(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|
|
| 310 |
(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/x', $value)) {
|
| 311 |
+
$result[$key]["embeded_ipv6"] = true;
|
| 312 |
}
|
| 313 |
|
| 314 |
if (preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/', $value)) {
|
| 315 |
+
$result[$key]["email"] = true;
|
| 316 |
} else if (preg_match('/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/', $value)) {
|
| 317 |
+
$result[$key]["embeded_email"] = true;
|
| 318 |
}
|
| 319 |
|
| 320 |
if (preg_match('/^(http|ftp)s?:\/\/\S+$/i', $value)) {
|
| 321 |
+
$result[$key]["link"] = true;
|
| 322 |
} else if (preg_match('/(http|ftp)s?:\/\/\S+$/i', $value)) {
|
| 323 |
+
$result[$key]["embeded_link"] = true;
|
| 324 |
}
|
| 325 |
|
| 326 |
if (preg_match('/<(html|head|title|base|link|meta|style|picture|source|img|
|
| 327 |
iframe|embed|object|param|video|audio|track|map|area|form|label|input|button|
|
| 328 |
select|datalist|optgroup|option|textarea|output|progress|meter|fieldset|legend|
|
| 329 |
script|noscript|template|slot|canvas)/ix', $value)) {
|
| 330 |
+
$result[$key]["embeded_html"] = true;
|
| 331 |
}
|
| 332 |
|
| 333 |
if (preg_match('/\.(jpg|jpeg|png|gif|ico|pdf|doc|docx|ppt|pptx|pps|ppsx|odt|xls|zip|gzip|
|
| 334 |
xlsx|psd|mp3|m4a|ogg|wav|mp4|m4v|mov|wmv|avi|mpg|ogv|3gp|3g2|php|html|phtml|js|css)/ix', $value)) {
|
| 335 |
+
$result[$key]["file"] = true;
|
| 336 |
}
|
| 337 |
|
| 338 |
if ($this->matchCount(BVFW::SQLIREGEX, $value) >= 2) {
|
| 339 |
+
$result[$key]["sql"] = true;
|
| 340 |
}
|
| 341 |
}
|
| 342 |
}
|
protect/fw/request.php
CHANGED
|
@@ -44,13 +44,13 @@ class BVWPRequest {
|
|
| 44 |
$this->setCategory(BVWPRequest::NORMAL);
|
| 45 |
$this->setStatus(BVWpRequest::ALLOWED);
|
| 46 |
$this->setTimestamp(time());
|
| 47 |
-
$this->setQueryString(
|
| 48 |
-
$this->setCookies(
|
| 49 |
-
$this->setBody(
|
| 50 |
-
$this->setFiles(
|
| 51 |
if (!empty($_FILES)) {
|
| 52 |
foreach ($_FILES as $input => $file) {
|
| 53 |
-
$fileNames[$input] =
|
| 54 |
}
|
| 55 |
}
|
| 56 |
$this->setFileNames($fileNames);
|
|
@@ -61,30 +61,30 @@ class BVWPRequest {
|
|
| 61 |
$header = str_replace(array(' ', '_'), array('', ' '), $header);
|
| 62 |
$header = ucwords(strtolower($header));
|
| 63 |
$header = str_replace(' ', '-', $header);
|
| 64 |
-
$headers[$header] =
|
| 65 |
}
|
| 66 |
}
|
| 67 |
if (array_key_exists('CONTENT_TYPE', $_SERVER)) {
|
| 68 |
-
$headers['Content-Type'] =
|
| 69 |
}
|
| 70 |
if (array_key_exists('CONTENT_LENGTH', $_SERVER)) {
|
| 71 |
-
$headers['Content-Length'] =
|
| 72 |
}
|
| 73 |
if (array_key_exists('REFERER', $_SERVER)) {
|
| 74 |
-
$headers['Referer'] =
|
| 75 |
}
|
| 76 |
if (array_key_exists('HTTP_USER_AGENT', $_SERVER)) {
|
| 77 |
-
$headers['User-Agent'] =
|
| 78 |
}
|
| 79 |
|
| 80 |
if (array_key_exists('Host', $headers)) {
|
| 81 |
$host = $headers['Host'];
|
| 82 |
} else if (array_key_exists('SERVER_NAME', $_SERVER)) {
|
| 83 |
-
$host =
|
| 84 |
}
|
| 85 |
|
| 86 |
-
$method = array_key_exists('REQUEST_METHOD', $_SERVER) ?
|
| 87 |
-
$uri = array_key_exists('REQUEST_URI', $_SERVER) ?
|
| 88 |
$_uri = parse_url($uri);
|
| 89 |
$path = (is_array($_uri) && array_key_exists('path', $_uri)) ? $_uri['path'] : $uri;
|
| 90 |
}
|
|
@@ -298,21 +298,5 @@ class BVWPRequest {
|
|
| 298 |
public function getTimestamp() {
|
| 299 |
return $this->timestamp;
|
| 300 |
}
|
| 301 |
-
|
| 302 |
-
public static function removeMagicQuotes($value) {
|
| 303 |
-
if (function_exists("get_magic_quotes_gpc") && get_magic_quotes_gpc()) {
|
| 304 |
-
return BVWPRequest::removeSlashesRecursively($value);
|
| 305 |
-
}
|
| 306 |
-
return $value;
|
| 307 |
-
}
|
| 308 |
-
|
| 309 |
-
public static function removeSlashesRecursively($value) {
|
| 310 |
-
if (is_array($value)) {
|
| 311 |
-
$value = array_map(array('self', 'removeSlashesRecursively',), $value);
|
| 312 |
-
} else if (is_string($value)) {
|
| 313 |
-
$value = stripslashes($value);
|
| 314 |
-
}
|
| 315 |
-
return $value;
|
| 316 |
-
}
|
| 317 |
}
|
| 318 |
-
endif;
|
| 44 |
$this->setCategory(BVWPRequest::NORMAL);
|
| 45 |
$this->setStatus(BVWpRequest::ALLOWED);
|
| 46 |
$this->setTimestamp(time());
|
| 47 |
+
$this->setQueryString($_GET);
|
| 48 |
+
$this->setCookies($_COOKIE);
|
| 49 |
+
$this->setBody($_POST);
|
| 50 |
+
$this->setFiles($_FILES);
|
| 51 |
if (!empty($_FILES)) {
|
| 52 |
foreach ($_FILES as $input => $file) {
|
| 53 |
+
$fileNames[$input] = $file['name'];
|
| 54 |
}
|
| 55 |
}
|
| 56 |
$this->setFileNames($fileNames);
|
| 61 |
$header = str_replace(array(' ', '_'), array('', ' '), $header);
|
| 62 |
$header = ucwords(strtolower($header));
|
| 63 |
$header = str_replace(' ', '-', $header);
|
| 64 |
+
$headers[$header] = $value;
|
| 65 |
}
|
| 66 |
}
|
| 67 |
if (array_key_exists('CONTENT_TYPE', $_SERVER)) {
|
| 68 |
+
$headers['Content-Type'] = $_SERVER['CONTENT_TYPE'];
|
| 69 |
}
|
| 70 |
if (array_key_exists('CONTENT_LENGTH', $_SERVER)) {
|
| 71 |
+
$headers['Content-Length'] = $_SERVER['CONTENT_LENGTH'];
|
| 72 |
}
|
| 73 |
if (array_key_exists('REFERER', $_SERVER)) {
|
| 74 |
+
$headers['Referer'] = $_SERVER['REFERER'];
|
| 75 |
}
|
| 76 |
if (array_key_exists('HTTP_USER_AGENT', $_SERVER)) {
|
| 77 |
+
$headers['User-Agent'] = $_SERVER['HTTP_USER_AGENT'];
|
| 78 |
}
|
| 79 |
|
| 80 |
if (array_key_exists('Host', $headers)) {
|
| 81 |
$host = $headers['Host'];
|
| 82 |
} else if (array_key_exists('SERVER_NAME', $_SERVER)) {
|
| 83 |
+
$host = $_SERVER['SERVER_NAME'];
|
| 84 |
}
|
| 85 |
|
| 86 |
+
$method = array_key_exists('REQUEST_METHOD', $_SERVER) ? $_SERVER['REQUEST_METHOD'] : 'GET';
|
| 87 |
+
$uri = array_key_exists('REQUEST_URI', $_SERVER) ? $_SERVER['REQUEST_URI'] : '';
|
| 88 |
$_uri = parse_url($uri);
|
| 89 |
$path = (is_array($_uri) && array_key_exists('path', $_uri)) ? $_uri['path'] : $uri;
|
| 90 |
}
|
| 298 |
public function getTimestamp() {
|
| 299 |
return $this->timestamp;
|
| 300 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 301 |
}
|
| 302 |
+
endif;
|
protect/prepend/protect.php
CHANGED
|
@@ -59,7 +59,7 @@ require_once dirname( __FILE__ ) . '/logger.php';
|
|
| 59 |
|
| 60 |
if ($fw->isActive()) {
|
| 61 |
|
| 62 |
-
if ($fw->
|
| 63 |
$fw->setIPCookie();
|
| 64 |
}
|
| 65 |
|
|
@@ -73,4 +73,4 @@ require_once dirname( __FILE__ ) . '/logger.php';
|
|
| 73 |
}
|
| 74 |
|
| 75 |
}
|
| 76 |
-
endif;
|
| 59 |
|
| 60 |
if ($fw->isActive()) {
|
| 61 |
|
| 62 |
+
if ($fw->canSetIPCookie()) {
|
| 63 |
$fw->setIPCookie();
|
| 64 |
}
|
| 65 |
|
| 73 |
}
|
| 74 |
|
| 75 |
}
|
| 76 |
+
endif;
|
protect/wp/protect.php
CHANGED
|
@@ -40,12 +40,12 @@ class BVProtect {
|
|
| 40 |
|
| 41 |
if ($fw->isActive()) {
|
| 42 |
|
| 43 |
-
if ($fw->
|
| 44 |
add_action('init', array($fw, 'setBypassCookie'));
|
|
|
|
| 45 |
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
}
|
| 49 |
}
|
| 50 |
|
| 51 |
if (!defined('MCFWLOADED')) {
|
| 40 |
|
| 41 |
if ($fw->isActive()) {
|
| 42 |
|
| 43 |
+
if ($fw->canSetAdminCookie()) {
|
| 44 |
add_action('init', array($fw, 'setBypassCookie'));
|
| 45 |
+
}
|
| 46 |
|
| 47 |
+
if (!defined('MCFWLOADED') && $fw->canSetIPCookie()) {
|
| 48 |
+
$fw->setIPCookie();
|
|
|
|
| 49 |
}
|
| 50 |
|
| 51 |
if (!defined('MCFWLOADED')) {
|
readme.txt
CHANGED
|
@@ -5,8 +5,8 @@ Plugin URI: https://www.malcare.com
|
|
| 5 |
Donate link: https://www.malcare.com
|
| 6 |
Requires at least: 4.0
|
| 7 |
Tested up to: 5.3
|
| 8 |
-
Requires PHP: 5.
|
| 9 |
-
Stable tag: 3.
|
| 10 |
License: GPLv2 or later
|
| 11 |
License URI: [http://www.gnu.org/licenses/gpl-2.0.html](http://www.gnu.org/licenses/gpl-2.0.html)
|
| 12 |
|
|
@@ -218,6 +218,10 @@ FTP details input into MalCare is processed on our servers. We need your FTP cre
|
|
| 218 |
8. With BlogVault's White-Label Solution you can showcase our service under your own brilliant brand.
|
| 219 |
|
| 220 |
== CHANGELOG ==
|
|
|
|
|
|
|
|
|
|
|
|
|
| 221 |
= 3.6 =
|
| 222 |
* WPCli to server request path updated
|
| 223 |
* Authentication header added in wpcli request param
|
| 5 |
Donate link: https://www.malcare.com
|
| 6 |
Requires at least: 4.0
|
| 7 |
Tested up to: 5.3
|
| 8 |
+
Requires PHP: 5.4.0
|
| 9 |
+
Stable tag: 3.7
|
| 10 |
License: GPLv2 or later
|
| 11 |
License URI: [http://www.gnu.org/licenses/gpl-2.0.html](http://www.gnu.org/licenses/gpl-2.0.html)
|
| 12 |
|
| 218 |
8. With BlogVault's White-Label Solution you can showcase our service under your own brilliant brand.
|
| 219 |
|
| 220 |
== CHANGELOG ==
|
| 221 |
+
= 3.7 =
|
| 222 |
+
* Removing deprecated get_magic_quotes_gpc function
|
| 223 |
+
* Improving Firewall Logging
|
| 224 |
+
|
| 225 |
= 3.6 =
|
| 226 |
* WPCli to server request path updated
|
| 227 |
* Authentication header added in wpcli request param
|
wp_admin.php
CHANGED
|
@@ -81,15 +81,17 @@ class MCWPAdmin {
|
|
| 81 |
public function menu() {
|
| 82 |
$bname = $this->bvinfo->getBrandName();
|
| 83 |
$icon = $this->bvinfo->getBrandIcon();
|
| 84 |
-
if (
|
| 85 |
$brandinfo = $this->cwBrandInfo();
|
| 86 |
$bname = $brandinfo["menuname"];
|
| 87 |
$icon = $brandinfo["brand_icon"];
|
| 88 |
}
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
|
|
|
| 92 |
}
|
|
|
|
| 93 |
add_menu_page($bname, $bname, 'manage_options', $this->bvinfo->plugname,
|
| 94 |
array($this, 'adminPage'), plugins_url($icon, __FILE__ ));
|
| 95 |
}
|
|
@@ -158,7 +160,15 @@ class MCWPAdmin {
|
|
| 158 |
}
|
| 159 |
|
| 160 |
public function adminPage() {
|
| 161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
}
|
| 163 |
|
| 164 |
public function initBranding($plugins) {
|
|
@@ -168,7 +178,7 @@ class MCWPAdmin {
|
|
| 168 |
return $plugins;
|
| 169 |
}
|
| 170 |
|
| 171 |
-
if (
|
| 172 |
$brand = $this->cwBrandInfo();
|
| 173 |
if (array_key_exists('name', $brand)) {
|
| 174 |
$plugins[$slug]['Name'] = $brand['name'];
|
| 81 |
public function menu() {
|
| 82 |
$bname = $this->bvinfo->getBrandName();
|
| 83 |
$icon = $this->bvinfo->getBrandIcon();
|
| 84 |
+
if ($this->siteinfo->isCWServer()) {
|
| 85 |
$brandinfo = $this->cwBrandInfo();
|
| 86 |
$bname = $brandinfo["menuname"];
|
| 87 |
$icon = $brandinfo["brand_icon"];
|
| 88 |
}
|
| 89 |
+
|
| 90 |
+
$pub_key = MCAccount::getApiPublicKey($this->settings);
|
| 91 |
+
if ($pub_key && isset($pub_key)) {
|
| 92 |
+
$this->account = MCAccount::find($this->settings, $pub_key);
|
| 93 |
}
|
| 94 |
+
|
| 95 |
add_menu_page($bname, $bname, 'manage_options', $this->bvinfo->plugname,
|
| 96 |
array($this, 'adminPage'), plugins_url($icon, __FILE__ ));
|
| 97 |
}
|
| 160 |
}
|
| 161 |
|
| 162 |
public function adminPage() {
|
| 163 |
+
if (isset($_REQUEST['add_account'])) {
|
| 164 |
+
$this->settings->updateOption('bvoverridecw', true);
|
| 165 |
+
require_once dirname( __FILE__ ) . "/admin/registration.php";
|
| 166 |
+
} else if(MCAccount::isConfigured($this->settings)) {
|
| 167 |
+
require_once dirname( __FILE__ ) . "/admin/dashboard.php";
|
| 168 |
+
} else {
|
| 169 |
+
$this->settings->updateOption('bvoverridecw', true);
|
| 170 |
+
require_once dirname( __FILE__ ) . "/admin/registration.php";
|
| 171 |
+
}
|
| 172 |
}
|
| 173 |
|
| 174 |
public function initBranding($plugins) {
|
| 178 |
return $plugins;
|
| 179 |
}
|
| 180 |
|
| 181 |
+
if ($this->siteinfo->isCWServer()) {
|
| 182 |
$brand = $this->cwBrandInfo();
|
| 183 |
if (array_key_exists('name', $brand)) {
|
| 184 |
$plugins[$slug]['Name'] = $brand['name'];
|
wp_site_info.php
CHANGED
|
@@ -81,5 +81,9 @@ class MCWPSiteInfo {
|
|
| 81 |
else
|
| 82 |
return substr($sig, 0, 6);
|
| 83 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
}
|
| 85 |
endif;
|
| 81 |
else
|
| 82 |
return substr($sig, 0, 6);
|
| 83 |
}
|
| 84 |
+
|
| 85 |
+
public function isCWServer() {
|
| 86 |
+
return isset($_SERVER['cw_allowed_ip']);
|
| 87 |
+
}
|
| 88 |
}
|
| 89 |
endif;
|
