Version Description
- Improved the landing pages.
- Enhanced future vulnerability protection
- IP Blocking Improvements
- Improved firewall configuration for migrations
Download this release
Release Info
Developer | ritesh.soni36 |
Plugin | MalCare WordPress Security Plugin – Malware Scanner, Cleaner, Security Firewall |
Version | 4.77 |
Comparing to | |
See all releases |
Code changes from version 4.76 to 4.77
- admin/account_details.php +11 -52
- admin/add_new_account.php +17 -0
- admin/components/features_list.php +77 -0
- admin/components/footer.php +20 -0
- admin/components/form.php +20 -0
- admin/components/header_top.php +35 -0
- admin/components/list_accounts.php +29 -0
- admin/components/mc_testimony.php +34 -0
- admin/components/testimony.php +17 -0
- admin/dashboard.php +1 -2
- admin/registration.php +0 -172
- css/bvnew.min.css +0 -1
- css/bvplugin.min.css +1 -0
- img/{gowp.png → gowp_new.png} +0 -0
- img/icon.png +0 -0
- img/logo.png +0 -0
- img/{main-image.png → mc-features-list.png} +0 -0
- img/mc-full-logo.png +0 -0
- img/mc-testimony-armand-girard.jpg +0 -0
- img/mc-testimony-david-mccan.jpg +0 -0
- img/mc-testimony-ivica-delic.jpg +0 -0
- img/mc-testimony-miriam-schwab.jpg +0 -0
- img/{mc-top-logo.svg → mclogo.svg} +0 -0
- info.php +14 -3
- malcare.php +3 -3
- protect/base.php +81 -0
- protect/fw/fw.php +103 -31
- protect/fw/request.php +5 -0
- protect/fw/rule_evaluator.php +123 -6
- protect/prepend/protect.php +3 -2
- protect/wp/ipstore.php +1 -50
- protect/wp/lp/lp.php +3 -0
- protect/wp/protect.php +8 -5
- readme.txt +7 -1
- wp_admin.php +37 -45
admin/account_details.php
CHANGED
@@ -1,55 +1,14 @@
|
|
1 |
-
<div
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
<div class="mui-row">
|
7 |
-
<div style="background: #4686f5; overflow: hidden;">
|
8 |
-
<a href="https://www.malcare.com/?utm_source=mc_free_plugin_lp_logo&utm_medium=logo_link&utm_campaign=mc_free_plugin_lp_header&utm_term=header_logo&utm_content=image_link"><img src="<?php echo plugins_url($this->getPluginLogo(), __FILE__); ?>" style="padding: 10px;"></a>
|
9 |
-
<div class="top-links" style="width:400px;float: right;margin-top: 15px;">
|
10 |
-
<span class="bv-top-button" style="padding: 5px;margin:5px;border: 1px solid #17252A;display:inline-block;background:ghostwhite;border-radius: 5px;float:right;"><a href="https://wordpress.org/support/plugin/malcare-security/reviews/#new-post">Leave a Review</a></span>
|
11 |
-
<span class="bv-top-button" style="padding: 5px;margin:5px;border: 1px solid #17252A;display:inline-block;background:ghostwhite;border-radius: 5px;float:right;"><a href="https://wordpress.org/support/plugin/malcare-security/">Need Help?</a></span>
|
12 |
-
</div>
|
13 |
</div>
|
14 |
-
</
|
|
|
|
|
|
|
|
|
|
|
15 |
</div>
|
16 |
-
|
17 |
-
|
18 |
-
</br> </br>
|
19 |
-
<div class="mui-container-fluid">
|
20 |
-
<?php $accounts = MCAccount::accountsByPlugname($this->settings);?>
|
21 |
-
<div class="mui-panel" style="width:800px; margin:0 auto;border:1px solid #CCC;">
|
22 |
-
<div class="mui--text-body1" style="text-align:center;font-size:18px;">Accounts associated with this website.</div><br/>
|
23 |
-
<table cellpadding="10" style="width:700px; margin:0 auto;border:1px solid black;">
|
24 |
-
<tr style="text-align:center;font-size:15px;border: 1px solid black;"> <th> Account Email</th><th>Last Scanned At</th><th></th></tr>
|
25 |
-
<?php
|
26 |
-
$nonce = wp_create_nonce( 'bvnonce' );
|
27 |
-
foreach($accounts as $key => $value){
|
28 |
-
?>
|
29 |
-
<form dummy=">" action="" style="padding:0 2% 2em 1%;" method="post">
|
30 |
-
<input type='hidden' name='bvnonce' value="<?php echo $nonce ?>" />
|
31 |
-
<input type='hidden' name='pubkey' value="<?php echo $key ?>" />
|
32 |
-
<tr style="text-align:center;font-size:15px;border: 1px solid black;">
|
33 |
-
<td >
|
34 |
-
<?php echo $value['email'] ?>
|
35 |
-
</td>
|
36 |
-
<td>
|
37 |
-
<?php echo date('Y-m-d H:i:s', $value['lastbackuptime']); ?>
|
38 |
-
</td>
|
39 |
-
<td >
|
40 |
-
<input type='submit' class="button-primary" value='Disconnect' name='disconnect'>
|
41 |
-
</td>
|
42 |
-
</tr>
|
43 |
-
</form>
|
44 |
-
<?php } ?>
|
45 |
-
</table>
|
46 |
-
<div class="mui-col-md-12 mui-col-md-offset-3" style="padding-top:2%;">
|
47 |
-
|
48 |
-
<?php if(isset($this->account)) { ?>
|
49 |
-
<a class="mui-btn mui-btn--raised mui-btn--primary" href=<?php echo $this->account->authenticatedUrl('/malcare/access') ?> target="_blank">Visit Dashboard</a>
|
50 |
-
<?php } ?>
|
51 |
-
<a class="mui-btn mui-btn--raised mui-btn--primary" href=<?php echo $this->mainUrl('&add_account=true'); ?> >Connect New Account</a>
|
52 |
-
</div>
|
53 |
-
</div>
|
54 |
-
</div>
|
55 |
</div>
|
1 |
+
<div class="malcare">
|
2 |
+
<div id="main-page">
|
3 |
+
<section id="header">
|
4 |
+
<div class="custom-container">
|
5 |
+
<?php require_once dirname( __FILE__ ) . "/components/header_top.php"; ?>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6 |
</div>
|
7 |
+
</section>
|
8 |
+
<?php
|
9 |
+
require_once dirname( __FILE__ ) . "/components/list_accounts.php";
|
10 |
+
require_once dirname( __FILE__ ) . "/components/testimony.php";
|
11 |
+
require_once dirname( __FILE__ ) . "/components/footer.php";
|
12 |
+
?>
|
13 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
14 |
</div>
|
admin/add_new_account.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<div class="malcare">
|
2 |
+
<div id="add-new-account">
|
3 |
+
<section id="header">
|
4 |
+
<div class="custom-container">
|
5 |
+
<?php
|
6 |
+
require_once dirname( __FILE__ ) . "/components/header_top.php";
|
7 |
+
require_once dirname( __FILE__ ) . "/components/form.php";
|
8 |
+
?>
|
9 |
+
</div>
|
10 |
+
</section>
|
11 |
+
<?php
|
12 |
+
require_once dirname( __FILE__ ) . "/components/features_list.php";
|
13 |
+
require_once dirname( __FILE__ ) . "/components/testimony.php";
|
14 |
+
require_once dirname( __FILE__ ) . "/components/footer.php";
|
15 |
+
?>
|
16 |
+
</div>
|
17 |
+
</div>
|
admin/components/features_list.php
ADDED
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$heading = "MALCARE 360 DEGREE PROTECTION";
|
3 |
+
$subheading = "How can Malcare help protect your site?";
|
4 |
+
$img_url = plugins_url("/../../img/mc-features-list.png", __FILE__);
|
5 |
+
$intro_video_url = "https://youtu.be/rBuYh2dIadk";
|
6 |
+
$brand_name = "MalCare";
|
7 |
+
?>
|
8 |
+
<section id="list-features">
|
9 |
+
<div class="custom-container">
|
10 |
+
<div class="heading text-center">
|
11 |
+
<h5><?php echo $heading; ?></h5>
|
12 |
+
<h4><?php echo $subheading; ?></h4>
|
13 |
+
</div>
|
14 |
+
<div class="row">
|
15 |
+
<div class="col-xs-12 d-flex">
|
16 |
+
<div class="col-xs-12 col-lg-6">
|
17 |
+
<div>
|
18 |
+
<img class="main-image" src="<?php echo $img_url; ?>"/>
|
19 |
+
</div>
|
20 |
+
<div class="text-center intro-video d-flex">
|
21 |
+
<a href="<?php echo $intro_video_url; ?>" target="_blank" rel="noopener noreferrer">
|
22 |
+
<img src="<?php echo plugins_url("/../../img/play-video.png", __FILE__); ?>"/>
|
23 |
+
Watch the <?php echo $brand_name; ?> Video
|
24 |
+
</a>
|
25 |
+
</div>
|
26 |
+
</div>
|
27 |
+
<div class="col-xs-12 col-lg-6 d-flex">
|
28 |
+
<div id="accordion">
|
29 |
+
<div>
|
30 |
+
<input type="radio" name="accordion-group" id="option-1" checked />
|
31 |
+
<div class="acc-card">
|
32 |
+
<label for="option-1">
|
33 |
+
<h5>MALCARE SCANNER</h5>
|
34 |
+
<h4>WordPress Malware Scanner that will NEVER slow down your website.</h4>
|
35 |
+
</label>
|
36 |
+
<div class="article">
|
37 |
+
<p>MalCare’s “Early Detection Technology” finds WordPress Malware that other popular plugins miss!
|
38 |
+
It uses 100+ signals to accurately detect and pinpoint even “Unknown” malware. You can now scan your website
|
39 |
+
for malware automatically, with ZERO overload on your server!</p>
|
40 |
+
</div>
|
41 |
+
</div>
|
42 |
+
</div>
|
43 |
+
<div>
|
44 |
+
<input type="radio" name="accordion-group" id="option-2" />
|
45 |
+
<div class="acc-card">
|
46 |
+
<label for="option-2">
|
47 |
+
<h5>MALCARE FIREWALL</h5>
|
48 |
+
<h4>Get 100% Protection from Hackers with our Advanced WordPress Firewall </h4>
|
49 |
+
</label>
|
50 |
+
<div class="article">
|
51 |
+
<p>Automatically block malicious traffic with MalCare’s intelligent visitor pattern detection.
|
52 |
+
With CAPTCHA-based Login Protection, Timely alerts for suspicious logins and Security Features
|
53 |
+
recommended by WordPress - you can say Goodbye to Hackers!</p>
|
54 |
+
</div>
|
55 |
+
</div>
|
56 |
+
</div>
|
57 |
+
<div>
|
58 |
+
<input type="radio" name="accordion-group" id="option-3" />
|
59 |
+
<div class="acc-card">
|
60 |
+
<label for="option-3">
|
61 |
+
<h5>MALCARE CLEANER</h5>
|
62 |
+
<h4>Instant Malware Removal that takes less than 60 Seconds in just 1-Click!</h4>
|
63 |
+
</label>
|
64 |
+
<div class="article">
|
65 |
+
<p>No more waiting for hours or days to clean your hacked website. With MalCare’s fully automated
|
66 |
+
malware removal, you malware will be gone in a jiffy! Our powerful cleaner removes even complex &
|
67 |
+
unknown malware in a matter of seconds. Leave the heavy lifting to us while you sit back and
|
68 |
+
relax - your site is in safe hands!</p>
|
69 |
+
</div>
|
70 |
+
</div>
|
71 |
+
</div>
|
72 |
+
</div>
|
73 |
+
</div>
|
74 |
+
</div>
|
75 |
+
</div>
|
76 |
+
</div>
|
77 |
+
</section>
|
admin/components/footer.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php $subtitle = "25,000 happy customers and counting"; ?>
|
2 |
+
<section id="footer">
|
3 |
+
<div class="custom-container text-center" id="">
|
4 |
+
<div class="row">
|
5 |
+
<div class="col-lg-12">
|
6 |
+
<div class="heading">
|
7 |
+
<h5>TRUSTED BY BRANDS WORLDWIDE</h5>
|
8 |
+
<h4><?php echo $subtitle; ?></h4>
|
9 |
+
</div>
|
10 |
+
<div class="heading text-center brand d-flex ">
|
11 |
+
<img src="<?php echo plugins_url("/../../img/wpbuffs.png", __FILE__); ?>" style="height: 42px;"/>
|
12 |
+
<img src="<?php echo plugins_url("/../../img/cloudways.png", __FILE__); ?>" style="height: 42px;" />
|
13 |
+
<img src="<?php echo plugins_url("/../../img/gowp_new.png", __FILE__); ?>" style="height: 42px;"/>
|
14 |
+
<img src="<?php echo plugins_url("/../../img/sitecare.png", __FILE__); ?>" style="height: 42px;" />
|
15 |
+
<img src="<?php echo plugins_url("/../../img/astra.png", __FILE__); ?>" style="height: 42px;" />
|
16 |
+
</div>
|
17 |
+
</div>
|
18 |
+
</div>
|
19 |
+
</div>
|
20 |
+
</section>
|
admin/components/form.php
ADDED
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$brand_name = "MalCare";
|
3 |
+
$webpage = "https://www.malcare.com";
|
4 |
+
?>
|
5 |
+
<div class="email-form">
|
6 |
+
<div class="row">
|
7 |
+
<div class="col-xs-12 form-container">
|
8 |
+
<div class="search-container text-center ">
|
9 |
+
<form action="<?php echo $this->bvinfo->appUrl(); ?>/plugin/signup" style="padding-top:10px; margin: 0px;" onsubmit="document.getElementById('get-started').disabled = true;" method="post" name="signup">
|
10 |
+
<input type='hidden' name='bvsrc' value='wpplugin'/>
|
11 |
+
<input type='hidden' name='origin' value='protect'/>
|
12 |
+
<?php echo $this->siteInfoTags(); ?>
|
13 |
+
<input type="text" placeholder="Enter your email address to continue" id="email" name="email" class="search" required>
|
14 |
+
<h5 class="check-box-text mt-2"><input type="checkbox" class="check-box" name="consent" value="1" required>
|
15 |
+
<label>I agree to <?php echo $brand_name; ?> <a href="<?php echo $webpage.'/tos'; ?>" target="_blank" rel="noopener noreferrer">Terms of Service</a> and <a href="<?php echo $webpage.'/privacy'; ?>" target="_blank" rel="noopener noreferrer">Privacy Policy</a></label></h5>
|
16 |
+
<button id="get-started" type="submit" class="e-mail-button"><span class="text-white">Submit</span></button>
|
17 |
+
</form>
|
18 |
+
</div>
|
19 |
+
</div>
|
20 |
+
</div>
|
admin/components/header_top.php
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
$plugin_slug = "malcare-security";
|
3 |
+
$brand_name = "MalCare";
|
4 |
+
$plugin_logo = plugins_url("/../../img/mclogo.svg", __FILE__);
|
5 |
+
$title = "Secure your website with MalCare's 360 degree protection";
|
6 |
+
$intro_video_url = "https://youtu.be/rBuYh2dIadk";
|
7 |
+
$header_logo_link = "https://malcare.com/?utm_source=mc_plugin_lp_logo&utm_medium=logo_link&utm_campaign=mc_plugin_lp_header&utm_term=header_logo&utm_content=image_link";
|
8 |
+
?>
|
9 |
+
<div class="header-top">
|
10 |
+
<div class="top-links">
|
11 |
+
<span>
|
12 |
+
<a href="https://wordpress.org/support/plugin/<?php echo $plugin_slug; ?>/reviews/#new-post" target="_blank" rel="noopener noreferrer">
|
13 |
+
Leave a Review
|
14 |
+
</a>
|
15 |
+
</span>
|
16 |
+
|
17 |
+
<span>
|
18 |
+
<a href="https://wordpress.org/support/plugin/<?php echo $plugin_slug; ?>/" target="_blank" rel="noopener noreferrer">
|
19 |
+
Need Help?
|
20 |
+
</a>
|
21 |
+
</span>
|
22 |
+
</div>
|
23 |
+
<div class="logo-img">
|
24 |
+
<a href="<?php echo $header_logo_link; ?>" target="_blank" rel="noopener noreferrer">
|
25 |
+
<img height="65" src="<?php echo $plugin_logo; ?>" alt="Logo">
|
26 |
+
</a>
|
27 |
+
</div>
|
28 |
+
<h2 class="text-center heading"><?php echo $title; ?></h2>
|
29 |
+
<div class="text-center intro-video">
|
30 |
+
<a href="<?php echo $intro_video_url; ?>" target="_blank" rel="noopener noreferrer">
|
31 |
+
<img src="<?php echo plugins_url("/../../img/play-video.png", __FILE__); ?>"/>
|
32 |
+
Watch the <?php echo $brand_name; ?> Video
|
33 |
+
</a>
|
34 |
+
</div>
|
35 |
+
</div>
|
admin/components/list_accounts.php
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<section id="account-list">
|
2 |
+
<?php $accounts = MCAccount::accountsByPlugname($this->settings); ?>
|
3 |
+
<div class="account-list-container custom-container text-center">
|
4 |
+
<h4>Accounts associated with this website</h4>
|
5 |
+
<div class="table-container">
|
6 |
+
<table>
|
7 |
+
<tr><th>Account Email</th><th>Last Synced At</th><th></th></tr>
|
8 |
+
<?php
|
9 |
+
$nonce = wp_create_nonce('bvnonce');
|
10 |
+
foreach($accounts as $key => $value) {
|
11 |
+
?>
|
12 |
+
<form action="" method="post">
|
13 |
+
<input type='hidden' name='bvnonce' value="<?php echo $nonce; ?>" />
|
14 |
+
<input type='hidden' name='pubkey' value="<?php echo $key; ?>" />
|
15 |
+
<tr>
|
16 |
+
<td><?php echo $value['email']; ?></td>
|
17 |
+
<td><?php echo date('Y-m-d H:i:s', $value['lastbackuptime']); ?></td>
|
18 |
+
<td><input type='submit' class="button-primary" value='Disconnect' name='disconnect' onclick="return confirm('Are you sure?');"></td>
|
19 |
+
</tr>
|
20 |
+
</form>
|
21 |
+
<?php } ?>
|
22 |
+
</table>
|
23 |
+
</div>
|
24 |
+
<div style="margin: 15px;">
|
25 |
+
<a class="btn btn-primary" href="<?php echo $this->bvinfo->appUrl(); ?>" target="_blank">Visit Dashboard</a>
|
26 |
+
<a class="btn btn-primary" style="margin-left: 15px;" href="<?php echo $this->mainUrl('&add_account=true'); ?>">Connect New Account</a>
|
27 |
+
</div>
|
28 |
+
</div>
|
29 |
+
</section>
|
admin/components/mc_testimony.php
ADDED
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<ul class="slides text-center">
|
2 |
+
<li class="slide text-center">
|
3 |
+
<img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-ivica-delic.jpg", __FILE__); ?>"/><br/>
|
4 |
+
<p>
|
5 |
+
<h1>“</h1>
|
6 |
+
<h4>Incredibly simple but powerful plugin. I am amazed how smooth its all going, scanning is very fast and I am so happy that I found it 🙂</h4>
|
7 |
+
<h5>Ivica Delic</h5>
|
8 |
+
</p>
|
9 |
+
</li>
|
10 |
+
<li class="slide text-center">
|
11 |
+
<img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-miriam-schwab.jpg", __FILE__); ?>"/><br/>
|
12 |
+
<p>
|
13 |
+
<h1>“</h1>
|
14 |
+
<h4>When you are backing up a site MalCare tells you if that site is infected & cleans it up for you. Another way for us web developers to save valuable time & resources! MalCare is magical.</h4>
|
15 |
+
<h5>Miriam Schwab, Strattic</h5>
|
16 |
+
</p>
|
17 |
+
</li>
|
18 |
+
<li class="slide text-center">
|
19 |
+
<img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-david-mccan.jpg", __FILE__); ?>"/><br/>
|
20 |
+
<p>
|
21 |
+
<h1>“</h1>
|
22 |
+
<h4>I’m very pleased. This has reduced server load since the scans are run from their server. Setup took 5 minutes. The team has been very responsive.</h4>
|
23 |
+
<h5>David McCan, WebTNG</h5>
|
24 |
+
</p>
|
25 |
+
</li>
|
26 |
+
<li class="slide text-center">
|
27 |
+
<img class="user" src="<?php echo plugins_url("/../../img/mc-testimony-armand-girard.jpg", __FILE__); ?>"/><br/>
|
28 |
+
<p>
|
29 |
+
<h1>“</h1>
|
30 |
+
<h4>It’s nice to know that my site is being monitored by MalCare. It’s one less thing I have to worry about thereby giving me more time to work on my business.</h4>
|
31 |
+
<h5>Armand Girard, Central Florida Promo</h5>
|
32 |
+
</p>
|
33 |
+
</li>
|
34 |
+
</ul>
|
admin/components/testimony.php
ADDED
@@ -0,0 +1,17 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<section id="testimony">
|
2 |
+
<div class="carousel text-center">
|
3 |
+
<div class="slide-div text-center">
|
4 |
+
<input type="radio" name="slides" id="radio-1" checked>
|
5 |
+
<input type="radio" name="slides" id="radio-2">
|
6 |
+
<input type="radio" name="slides" id="radio-3">
|
7 |
+
<input type="radio" name="slides" id="radio-4">
|
8 |
+
<?php require_once dirname( __FILE__ ) . "/mc_testimony.php"; ?>
|
9 |
+
<div class="slidesNavigation text-center">
|
10 |
+
<label for="radio-1" id="dotForRadio-1"></label>
|
11 |
+
<label for="radio-2" id="dotForRadio-2"></label>
|
12 |
+
<label for="radio-3" id="dotForRadio-3"></label>
|
13 |
+
<label for="radio-4" id="dotForRadio-4"></label>
|
14 |
+
</div>
|
15 |
+
</div>
|
16 |
+
</div>
|
17 |
+
</section>
|
admin/dashboard.php
CHANGED
@@ -1,4 +1,3 @@
|
|
1 |
<div>
|
2 |
-
<iframe style="width: 100%; min-height: 100vh;" src="<?=$this->account->authenticatedUrl('/malcare/access')?>"
|
3 |
-
</iframe>
|
4 |
</div>
|
1 |
<div>
|
2 |
+
<iframe style="width: 100%; min-height: 100vh;" src="<?=$this->account->authenticatedUrl('/malcare/access')?>"/>
|
|
|
3 |
</div>
|
admin/registration.php
DELETED
@@ -1,172 +0,0 @@
|
|
1 |
-
<div class="malcare9">
|
2 |
-
<section id="malcare-1">
|
3 |
-
<div class="malcare-logo-img text-center">
|
4 |
-
<img height="70" width="240" src="<?php echo plugins_url("/../img/mc-top-logo.svg", __FILE__); ?>" alt="">
|
5 |
-
</div>
|
6 |
-
<div class="container-malcare" id="">
|
7 |
-
<div class="row">
|
8 |
-
<div class="col-xs-12 malcare-1-container">
|
9 |
-
<h2 class="text-center heading">Signup to secure your website with MalCare's 360 degree protection</h2>
|
10 |
-
<?php $this->showErrors(); ?>
|
11 |
-
<div class="search-container text-center ">
|
12 |
-
<form dummy=">" action="<?php echo $this->bvinfo->appUrl(); ?>/plugin/signup" style="padding-top:10px; margin: 0px;" onsubmit="document.getElementById('get-started').disabled = true;" method="post" name="signup">
|
13 |
-
<input type='hidden' name='bvsrc' value='wpplugin' />
|
14 |
-
<input type='hidden' name='origin' value='protect' />
|
15 |
-
<?php echo $this->siteInfoTags(); ?>
|
16 |
-
<input type="text" placeholder="Enter your email address to continue" id="email" name="email" class="search" required>
|
17 |
-
<h5 class="check-box-text mt-2"><input type="checkbox" class="check-box" name="consent" value="1">
|
18 |
-
<label>I agree to MalCare <a href="https://www.malcare.com/tos" target="_blank" rel="noopener noreferrer">Terms of Service</a> and <a href="https://www.malcare.com/privacy" target="_blank" rel="noopener noreferrer">Privacy Policy</a></label></h5>
|
19 |
-
<button id="get-started" type="submit" class="e-mail-button"><span class="text-white">Submit</span></button>
|
20 |
-
</form>
|
21 |
-
</div>
|
22 |
-
</div>
|
23 |
-
</div>
|
24 |
-
</div>
|
25 |
-
</section>
|
26 |
-
|
27 |
-
<section id="malcare-3">
|
28 |
-
<div class="container-malcare" id="">
|
29 |
-
<div class="heading-malcare text-center">
|
30 |
-
<h5>MALCARE 360 DEGREE PROTECTION</h5>
|
31 |
-
<h4>How can Malcare help protect your site?</h4>
|
32 |
-
</div>
|
33 |
-
<div class="row">
|
34 |
-
<div class="col-xs-12 d-flex">
|
35 |
-
<div class="col-xs-12 col-lg-6">
|
36 |
-
<div>
|
37 |
-
<img class = "main-image" src="<?php echo plugins_url("/../img/main-image.png", __FILE__); ?>"/>
|
38 |
-
</div>
|
39 |
-
<div class="text-center malcare-video">
|
40 |
-
<a href="https://www.youtube.com/watch?v=rBuYh2dIadk" target="_blank">
|
41 |
-
<img src="<?php echo plugins_url("/../img/play-video.png", __FILE__); ?>"/>
|
42 |
-
Watch the Malcare Video
|
43 |
-
</a>
|
44 |
-
</div>
|
45 |
-
</div>
|
46 |
-
<div class="col-xs-12 col-lg-6 d-flex">
|
47 |
-
<div id="accordion">
|
48 |
-
<div>
|
49 |
-
<input type="radio" name="accordion-group" id="option-1" checked />
|
50 |
-
<div class="acc-card">
|
51 |
-
<label for="option-1">
|
52 |
-
<h5>MALCARE SCANNER</h5>
|
53 |
-
<h4>WordPress Malware Scanner that will NEVER slow down your website.</h4>
|
54 |
-
</label>
|
55 |
-
<div class="article">
|
56 |
-
<p>MalCare’s “Early Detection Technology” finds WordPress Malware that other popular plugins miss!
|
57 |
-
It uses 100+ signals to accurately detect and pinpoint even “Unknown” malware. You can now scan your website
|
58 |
-
for malware automatically, with ZERO overload on your server!</p>
|
59 |
-
</div>
|
60 |
-
</div>
|
61 |
-
</div>
|
62 |
-
<div>
|
63 |
-
<input type="radio" name="accordion-group" id="option-2" />
|
64 |
-
<div class="acc-card">
|
65 |
-
<label for="option-2">
|
66 |
-
<h5>MALCARE FIREWALL</h5>
|
67 |
-
<h4>Get 100% Protection from Hackers with our Advanced WordPress Firewall </h4>
|
68 |
-
</label>
|
69 |
-
<div class="article">
|
70 |
-
<p>Automatically block malicious traffic with MalCare’s intelligent visitor pattern detection.
|
71 |
-
With CAPTCHA-based Login Protection, Timely alerts for suspicious logins and Security Features
|
72 |
-
recommended by WordPress - you can say Goodbye to Hackers!</p>
|
73 |
-
</div>
|
74 |
-
</div>
|
75 |
-
</div>
|
76 |
-
<div>
|
77 |
-
<input type="radio" name="accordion-group" id="option-3" />
|
78 |
-
<div class="acc-card">
|
79 |
-
<label for="option-3">
|
80 |
-
<h5>MALCARE CLEANER</h5>
|
81 |
-
<h4>Instant Malware Removal that takes less than 60 Seconds in just 1-Click!</h4>
|
82 |
-
</label>
|
83 |
-
<div class="article">
|
84 |
-
<p>No more waiting for hours or days to clean your hacked website. With MalCare’s fully automated
|
85 |
-
malware removal, you malware will be gone in a jiffy! Our powerful cleaner removes even complex &
|
86 |
-
unknown malware in a matter of seconds. Leave the heavy lifting to us while you sit back and
|
87 |
-
relax - your site is in safe hands!</p>
|
88 |
-
</div>
|
89 |
-
</div>
|
90 |
-
</div>
|
91 |
-
</div>
|
92 |
-
</div>
|
93 |
-
</div>
|
94 |
-
</div>
|
95 |
-
</div>
|
96 |
-
</section>
|
97 |
-
|
98 |
-
<section id="malcare-9">
|
99 |
-
<div class="carousel text-center">
|
100 |
-
<div class="left-fig"></div>
|
101 |
-
<div class="slide-div text-center">
|
102 |
-
<input type="radio" name="slides" id="radio-1" checked>
|
103 |
-
<input type="radio" name="slides" id="radio-2">
|
104 |
-
<input type="radio" name="slides" id="radio-3">
|
105 |
-
<input type="radio" name="slides" id="radio-4">
|
106 |
-
<ul class="slides text-center">
|
107 |
-
<li class="slide text-center">
|
108 |
-
<img class="user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/09/Ivica-Delic-1.jpg"/><br/>
|
109 |
-
<p>
|
110 |
-
<h1>“</h1>
|
111 |
-
<h4>Incredibly simple but powerful plugin. I am amazed how smooth its all going, scanning is very fast and I am so happy that I found it🙂</h4>
|
112 |
-
<h5>Ivica Delic</h5>
|
113 |
-
</p>
|
114 |
-
</li>
|
115 |
-
<li class="slide text-center">
|
116 |
-
<img class = "user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/01/Miriam-Schwab-2.jpg"/><br/>
|
117 |
-
|
118 |
-
<p>
|
119 |
-
<h1>“</h1>
|
120 |
-
<h4>When you are backing up a site MalCare tells you if that site is infected & cleans it up for you. Another way for us web developers to save valuable time & resources! MalCare is magical.</h4>
|
121 |
-
<h5>Miriam Schwab, Strattic</h5>
|
122 |
-
</p>
|
123 |
-
</li>
|
124 |
-
<li class="slide text-center">
|
125 |
-
<img class = "user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/09/david-mccan-wordpress-cpt-1-1.jpg"/><br/>
|
126 |
-
|
127 |
-
<p>
|
128 |
-
<h1>“</h1>
|
129 |
-
<h4>I’m very pleased. This has reduced server load since the scans are run from their server. Setup took 5 minutes. The team has been very responsive.</h4>
|
130 |
-
<h5>David McCan, WebTNG</h5>
|
131 |
-
</p>
|
132 |
-
</li>
|
133 |
-
<li class="slide text-center">
|
134 |
-
<img class = "user" src="https://mk0malcaredecgig0d6a.kinstacdn.com/wp-content/uploads/2019/09/Armand-Girard-1.jpg"/><br/>
|
135 |
-
|
136 |
-
<p>
|
137 |
-
<h1>“</h1>
|
138 |
-
<h4>It’s nice to know that my site is being monitored by MalCare. It’s one less thing I have to worry about thereby giving me more time to work on my business.</h4>
|
139 |
-
<h5>Armand Girard, Central Florida Promo</h5>
|
140 |
-
</p>
|
141 |
-
</li>
|
142 |
-
</ul>
|
143 |
-
<div class="slidesNavigation text-center">
|
144 |
-
<label for="radio-1" id="dotForRadio-1"></label>
|
145 |
-
<label for="radio-2" id="dotForRadio-2"></label>
|
146 |
-
<label for="radio-3" id="dotForRadio-3"></label>
|
147 |
-
<label for="radio-4" id="dotForRadio-4"></label>
|
148 |
-
</div>
|
149 |
-
</div>
|
150 |
-
</div>
|
151 |
-
</section>
|
152 |
-
|
153 |
-
<section id="malcare-4">
|
154 |
-
<div class="container-malcare text-center" id="">
|
155 |
-
<div class="row">
|
156 |
-
<div class="col-lg-12">
|
157 |
-
<div class="heading-malcare">
|
158 |
-
<h5>TRUSTED BY BRANDS WORLDWIDE</h5>
|
159 |
-
<h4>25,000 happy customers and counting</h4>
|
160 |
-
</div>
|
161 |
-
<div class="heading-malcare text-center brand d-flex ">
|
162 |
-
<img src="<?php echo plugins_url("/../img/wpbuffs.png", __FILE__); ?>" style="height: 42px;"/>
|
163 |
-
<img src="<?php echo plugins_url("/../img/cloudways.png", __FILE__); ?>" style="height: 42px;" />
|
164 |
-
<img src="<?php echo plugins_url("/../img/gowp.png", __FILE__); ?>" style="height: 42px;"/>
|
165 |
-
<img src="<?php echo plugins_url("/../img/sitecare.png", __FILE__); ?>" style="height: 42px;" />
|
166 |
-
<img src="<?php echo plugins_url("/../img/astra.png", __FILE__); ?>" style="height: 42px;" />
|
167 |
-
</div>
|
168 |
-
</div>
|
169 |
-
</div>
|
170 |
-
</div>
|
171 |
-
</section>
|
172 |
-
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
css/bvnew.min.css
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
@import url(https://fonts.googleapis.com/css?family=Roboto:400,500);@import url(https://fonts.googleapis.com/css2?family=Noto+Serif&display=swap);.text-center{text-align:center}.text-right{text-align:right}.d-flex{display:flex}.testimonial_subtitle{color:#0aaa7a;font-size:12px}.testimonial_btn{background-color:#373d4b!important;color:#fff!important}.seprator{height:2px;width:56px;background-color:#0aaa7a;margin:7px 0 10px 0}.center-align-dflex{align-items:center;display:flex;justify-content:center;flex-direction:column}.card-title img{height:100px;width:125px}.h-100{height:100%}.mb-2{margin-bottom:20px}.mr-1{margin-right:10px}.mt-1{margin-top:10px}.float-right{float:right}.fw-600{font-weight:600}.malcare-logo-img{margin-top:72px}.search-container label>a{color:red;text-decoration:underline}#malcare-1{padding-top:20px;padding-bottom:70px;background-color:#f6f6ff;height:100%;position:relative}.container-malcare{max-width:1440px;margin:auto}#malcare-1 a:hover{color:red}.text-white{color:#fff!important}a.malcare-top{font-size:14px;line-height:20px;letter-spacing:.25px;font-weight:600;text-decoration-line:underline!important;color:#fff;mix-blend-mode:normal;opacity:.73}#malcare-1 .e-mail-button{background:#7b7afe;border:1px solid #e5e5e5;box-sizing:border-box;padding:25px;max-width:600px;width:100%;border-radius:8px;font-style:normal;font-weight:600;font-size:17px;line-height:1px;text-align:center;letter-spacing:.333333px;color:#4a4a4a}#malcare-1 .heading{font-family:Roboto;font-style:normal;font-weight:500}#malcare-1 .e-mail-button:hover,#malcare-5 .premium-subscription a:hover{color:#3a3a3a}#malcare-1 h4{line-height:24px;font-size:24px}#malcare-1 h2{line-height:28px;font-size:20px}#malcare-1 form img{margin-left:-20px;position:absolute;bottom:-98px;width:100%;max-width:225px}#malcare-1 input.search{background:#fff;border:1px solid rgba(101,99,255,.5);box-sizing:border-box;box-shadow:0 2px 10px rgba(204,203,203,.4);border-radius:8px;padding:25px;max-width:600px;width:100%;font-family:Roboto;font-weight:400;font-size:16px;line-height:10px;letter-spacing:.319444px;height:52px}#malcare-1 h5.check-box-text{font-style:normal;font-weight:400;font-size:14px;line-height:17px;text-align:center;letter-spacing:.291667px;color:#4a4a4a;margin:15px 5px}#malcare-2 h6.card-subtitle{margin:20px 0 0 0}#malcare-3 .heading-malcare{padding-bottom:20px}#malcare-3 .container-malcare .main-image{margin:5px 10px 100px 10px;padding:0px 10px 10px 10px}.heading-malcare h4{font-family:Roboto;font-weight:500;font-style:normal;font-size:24px;line-height:28px;text-align:center;letter-spacing:.416667px;color:#4a4a4a}.heading-malcare h5{font-family:Roboto;font-weight:400;font-style:normal;font-size:12px;line-height:28px;text-align:center;letter-spacing:.8px;color:#ee5151}input[type="checkbox"]:checked::before{width:2.3rem}input[type="checkbox"]:focus{outline:unset!important}#malcare-1 h5.check-box-text input.check-box{position:relative;width:20px;height:20px;margin:0 0 5px 0}#malcare-2 h1.number-malcare{margin:0;position:absolute;font-size:50px;color:#7683ad;top:110px;left:25px}#malcare-2,#malcare-3,#malcare-4{padding:5px 0;margin:50px 0 50px 0}#malcare-5{padding:30px 0}#malcare-2{padding-top:30px}#malcare-2 h6{font-style:normal;font-weight:700;font-size:20px;line-height:26px;text-align:center;letter-spacing:.333333px;color:#4a4a4a}#malcare-2 p{font-style:normal;font-weight:400;font-size:18px;line-height:22px;text-align:center;letter-spacing:.25px;color:#7683ad}#malcare-3 .embed-responsive{border-radius:10px}#malcare-5 .malcare-testimonial h4{font-size:22px;line-height:36px;margin-top:50px;text-align:center;color:#4a4a4a}#malcare-5 .malcare-testimonial h5.testimonial_subtitle{font-style:normal;font-weight:400;font-size:18px;line-height:36px;text-align:center;color:#4d50a7}#malcare-5 .malcare-testimonial p.testimonial_para{font-style:normal;font-weight:400;font-size:18px;line-height:27px;text-align:center;letter-spacing:.2px;color:#7683ad}.heading-malcare{margin-bottom:30px}#malcare-4 .brand{justify-content:center}#malcare-4 .brand img{margin:0 15px}#malcare-5 ul li{list-style:none}#malcare-5 ul li{font-style:normal;font-weight:400;font-size:18px;line-height:36px;text-align:initial;color:#4d50a7}#malcare-5 h6{font-size:22px;line-height:36px;text-align:center;font-family:AvenirNextLTPro-Regular,sans-serif;color:#4a4a4a}#malcare-5 ul{padding:0}#malcare-5 .premium-subscription a{background:#50e3c2;border:2px solid #17abff;box-sizing:border-box;border-radius:60px;font-style:normal;text-decoration:none;font-weight:600;font-size:24px;outline:0;line-height:31px;text-align:center;letter-spacing:.333333px;padding:20px;color:#4a4a4a}#malcare-5 .subscription{align-items:center;background:#fff;border:1px solid rgba(97,120,238,.487177);box-sizing:border-box;box-shadow:0 17px 40px rgba(217,223,252,.539883);border-radius:19px;overflow:hidden;height:330px}#malcare-5 .premium-subscription{align-items:center;display:flex}.bg-light-green{background-color:rgba(80,227,194,.18)}body.malcare9 a,body.malcare9 h1,body.malcare9 h2,body.malcare9 h3,body.malcare9 h4{font-family:Roboto,sans-serif}body.malcare9 button,body.malcare9 h5,body.malcare9 h6,body.malcare9 p,body.malcare9 ul li a{font-family:Roboto,sans-serif}#malcare-2-1{padding-top:80px;padding-bottom:350px;background:url(../img/malcare-heading-2.svg) no-repeat center;height:100%;background-size:cover;background-position:bottom}#malcare-2-3 .progress.custom-progress .progress-bar{background-color:#777}#malcare-2-3 .progress-heading p{font-size:12px;line-height:41px;text-align:center;color:#4a4a4a}.malcare-3 #malcare-1{padding-top:80px;padding-bottom:130px;background-color:#f6f6ff;height:100%}.color-grey{color:#4a4a4a!important}.color-blue{color:#7683ad!important}#wpcontent{padding:0!important}.malcare-video{padding:10px 35px;background:rgba(255,255,255,.25);border:1px solid #e3ebfd;box-sizing:border-box;border-radius:8px;max-width:40%;font-family:Lato;font-weight:400;font-style:normal;font-size:14px;line-height:17px;color:#7683ad}#malcare-3 #accordion input{display:none}#malcare-3 #accordion{background:#fff;font-family:Roboto;font-style:normal}#malcare-3 #accordion h4{color:#333;font-weight:500;font-size:18px;line-height:24px}#malcare-3 #accordion h5{color:#ff6459;font-weight:400;font-size:11px;line-height:22px;letter-spacing:.5px}#malcare-3 #accordion label{border-radius:8px;display:block;margin-bottom:.125em;padding:.25em 1em;z-index:20}#malcare-3 #accordion label:hover{text-decoration:underline}#malcare-3 #accordion .article{display:none;overflow:hidden;z-index:10;font-weight:400;font-size:14px;line-height:22px;padding:.25em 1em;color:#888}#malcare-3 #accordion input:checked~.acc-card{border:1px solid rgba(101,99,255,.3);box-sizing:border-box;box-shadow:0 2px 8px rgba(229,229,229,.25);border-radius:8px}#malcare-3 #accordion input:checked~.acc-card .article{display:block}#malcare-9{overflow:hidden}#malcare-9 .carousel{padding-top:80px;text-align:center;height:auto;width:100%;margin:auto;position:relative}#malcare-9 .slide h1{font-family:"Noto Serif";font-style:normal;font-weight:400;font-size:144px;line-height:51px;text-align:center;letter-spacing:.9px;color:#7b7afe;margin:20px}#malcare-9 .slide h4{font-family:Roboto;font-style:normal;font-weight:400;font-size:28px;line-height:46px;text-align:center;letter-spacing:.2px;color:#fff;margin:20px}#malcare-9 .slide h5{font-family:Roboto;font-style:normal;font-weight:400;font-size:18px;line-height:21px;text-align:center;letter-spacing:.15px;color:#fff;mix-blend-mode:normal;opacity:.58;margin:20px}#malcare-9 .carousel .slides{width:400%;left:0;padding-left:0;padding-top:1em;list-style:none;position:relative;-webkit-transition:transform 0.5s;-moz-transition:transform 0.5s;-o-transition:transform 0.5s;transition:transform 0.5s}#malcare-9 .carousel .slide .user{position:relative;top:-90px;border-radius:50%;height:140px;width:140px}#malcare-9 .carousel .slide-div{background:#2d3a67;width:100%}#malcare-9 .carousel .slides li{width:25%;position:relative;float:left}#malcare-9 .carousel li p{margin-top:0}#malcare-9 .carousel .slidesNavigation{display:inline-block;list-style:none;margin:40px}#malcare-9 .carousel input{display:none}#malcare-9 .carousel .slidesNavigation label{float:left;margin:6px;display:block;height:10px;width:10px;-webkit-border-radius:50%;border-radius:50%;border:solid 1px #fff;background:#fff;opacity:.4;font-size:0}#radio-1:checked~.slides{transform:translateX(0)}#radio-2:checked~.slides{transform:translateX(-25%)}#radio-3:checked~.slides{transform:translateX(-50%)}#radio-4:checked~.slides{transform:translateX(-75%)}#malcare-9 .carousel #radio-1:checked~.slidesNavigation label#dotForRadio-1,#malcare-9 .carousel #radio-2:checked~.slidesNavigation label#dotForRadio-2,#malcare-9 .carousel #radio-3:checked~.slidesNavigation label#dotForRadio-3,#malcare-9 .carousel #radio-4:checked~.slidesNavigation label#dotForRadio-4{opacity:1}@media (max-width:624px){#malcare-1 h5.check-box-text{font-size:11px!important}#get-started span{display:none}#get-started:before{font-size:13px;content:"Submit"}#malcare-1 h2{font-size:22px}#malcare-1 h4{font-size:20px}.malcare-logo-img img{height:47px;width:161px}#malcare-4 .brand{justify-content:center}#malcare-4 .brand img{margin:20px;display:inline-block}#malcare-1 .search-container{margin-top:20px}#malcare-3 .container-malcare .main-image{margin:5px 10px 100px 10px;padding:0px 10px 10px 10px;width:550px}.malcare-video{max-width:100%}}@media (max-width:1024px){.man-img{display:none}.d-flex{display:inline-block}.malcare-video{margin:auto;margin-bottom:70px}#malcare-1 .e-mail-button{width:80%!important}#malcare-1 input.search{width:80%!important}.malcare-1-container h2{margin-top:70px!important}}@media (min-width:1024px) and (max-width:1367px){#get-started span{display:none}#get-started:before{content:"Submit"}}@media (min-width:768px){.justify-content-center{justify-content:center}}@media (max-width:1440px){.row{margin-left:0!important;margin-right:0!important}}@media (min-width:1440px){.malcare-video{margin:auto}.malcare-testimonial{width:100%;margin-left:auto;margin-right:auto}}
|
|
css/bvplugin.min.css
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
@import url('https://fonts.googleapis.com/css?family=Roboto:400, 500');@import url(https://fonts.googleapis.com/css2?family=Noto+Serif&display=swap);body a,body h1,body h2,body h3,body h4{font-family:Roboto,sans-serif}body button,body h5,body h6,body li,body p,body ul li a{font-family:Roboto,sans-serif}.text-center{text-align:center}.text-right{text-align:right}.d-flex{display:flex}.center-align-dflex{align-items:center;display:flex;justify-content:center;flex-direction:column}.h-100{height:100%}.mb-2{margin-bottom:20px}.mr-1{margin-right:10px}.mt-1{margin-top:10px}.float-right{float:right}.fw-600{font-weight:600}.text-white{color:#fff!important}.text-capitalize{text-transform:capitalize}.text-uppercase{text-transform:uppercase}input[type=checkbox]:checked::before{width:2.3rem;margin:-1px 0 0 -4px}input[type=checkbox]:focus{outline:unset!important}.color-grey{color:#4a4a4a!important}.color-blue{color:#7683ad!important}a{outline:unset!important;box-shadow:none!important}.custom-container{max-width:1440px;margin:auto}#wpcontent{padding:0!important}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}#add-new-account #header .intro-video{display:none}#header{padding-top:77px;padding-bottom:40px;background-color:#f6f6ff;height:100%;position:relative;text-align:center}#header .top-links{position:absolute;top:15px;right:10px}#header .top-links a{text-decoration:underline}.blogvault #header .logo-img img{height:70px}.blogvault #header a:hover{color:#2f9d92}.malcare #header a:hover{color:#ee5151}#header .heading{font-family:Roboto;font-style:normal;font-size:22px;font-weight:500}#header .intro-video,#list-features .intro-video{padding:10px 25px;background:rgba(255,255,255);border:1px solid #e3ebfd;box-sizing:border-box;border-radius:8px;max-width:300px;font-family:Lato;font-weight:400;font-style:normal;font-size:14px;line-height:17px;color:#7683ad;margin:auto;margin-top:15px}#list-features .intro-video{margin:unset;margin-top:50px}.email-form{margin-top:10px}.email-form h5.check-box-text input.check-box{position:relative;width:20px;height:20px;margin:0 0 5px 0;border-radius:4px}.email-form h5.check-box-text{font-style:normal;font-weight:400;font-size:14px;line-height:17px;text-align:center;letter-spacing:.291667px;color:#4a4a4a;margin:15px 5px}.email-form .search-container label>a{text-decoration:underline}.blogvault .email-form .search-container label>a{color:#2f9d92}.malcare .email-form .search-container label>a{color:#ee5151}.email-form input.search{background:#fff;box-sizing:border-box;box-shadow:0 2px 10px rgba(204,203,203,.4);border-radius:8px;padding:25px;max-width:600px;width:100%;font-family:Roboto;font-weight:400;font-size:16px;line-height:10px;letter-spacing:.319444px;height:52px}.blogvault .email-form input.search{border:1px solid rgba(71,194,214,.5)}.malcare .email-form input.search{border:1px solid rgba(101,99,255,.5)}.email-form .e-mail-button{border:1px solid #e5e5e5;box-sizing:border-box;padding:25px;max-width:600px;width:100%;border-radius:8px;font-style:normal;font-weight:600;font-size:17px;line-height:1px;text-align:center;letter-spacing:.333333px;color:#4a4a4a}.email-form .e-mail-button:active{transform:translateY(.5px)}.blogvault .email-form .e-mail-button{background:#47c2d6}.malcare .email-form .e-mail-button{background:#7b7afe}#account-list h4,#footer h4,#list-features h4{font-family:Roboto;font-weight:500;font-style:normal;font-size:24px;line-height:28px;text-align:center;letter-spacing:.416667px;color:#4a4a4a}#account-list h5,#footer h5,#list-features h5{font-family:Roboto;font-weight:400;font-style:normal;font-size:12px;line-height:28px;text-align:center;letter-spacing:.8px;text-transform:uppercase}.blogvault h5{color:#2f9d92}.malcare h5{color:#ee5151}#footer .brand{justify-content:center}#footer .brand img{margin:0 15px}#footer .heading{margin-bottom:30px}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}#wpbody-content{padding-bottom:65px;float:left;width:100%;overflow:visible!important}#account-list,#footer,#list-features{padding:50px 0}#list-features .heading{padding-bottom:20px}.blogvault #list-features img.main-image{width:100%}#list-features ul{list-style:inside}#list-features li{font-size:12px}#list-features #accordion input{display:none}#list-features #accordion{background:#fff;font-family:Roboto;font-style:normal}#list-features #accordion h4{color:#333;font-weight:500;font-size:18px;line-height:24px;text-align:left}#list-features #accordion h5{color:#2f9d92;font-weight:400;font-size:11px;line-height:22px;letter-spacing:.5px}.blogvault #list-features #accordion h5{color:#2f9d92}.malcare #list-features #accordion h5{color:#ee5151}#list-features #accordion label{border-radius:8px;display:block;margin-bottom:.125em;padding:.25em 1em;z-index:20}#list-features #accordion label:hover{text-decoration:underline}#list-features #accordion .article{display:none;overflow:hidden;z-index:10;font-weight:400;font-size:14px;line-height:22px;padding:.25em 1em;color:#888}#list-features #accordion input:checked~.acc-card{border:1px solid rgba(101,99,255,.3);box-sizing:border-box;box-shadow:0 2px 8px rgba(229,229,229,.25);border-radius:8px}#list-features #accordion input:checked~.acc-card .article{display:block}#account-list .account-list-container{width:800px;margin:auto;padding:20px;box-sizing:border-box;box-shadow:2px 2px 9px rgb(212 212 212),0 0 9px rgb(212 212 212);border-radius:11.5px}#account-list table{min-width:700px;margin:auto;margin-top:30px}#account-list .table-container{max-height:340px;overflow:auto}#account-list table input.button-primary{box-shadow:unset}#account-list .table-container::-webkit-scrollbar{width:6px;height:6px}#account-list .table-container::-webkit-scrollbar-thumb{background:#ccc;border-radius:10px;width:6px;height:6px}#account-list table tr th{text-align:center}#account-list table tr td{padding:10px}#testimony{overflow:hidden}#testimony .carousel{padding-top:80px;text-align:center;height:auto;width:100%;margin:auto;position:relative}#testimony .slide h1{font-family:"Noto Serif";font-style:normal;font-weight:400;font-size:144px;line-height:51px;text-align:center;letter-spacing:.9px;color:#7b7afe;margin:20px}#testimony .slide h4{font-family:Roboto;font-style:normal;font-weight:400;font-size:28px;line-height:46px;text-align:center;letter-spacing:.2px;color:#fff;padding:20px;max-width:1440px;margin:auto}#testimony .slide h5{font-family:Roboto;font-style:normal;font-weight:400;font-size:18px;line-height:21px;text-align:center;letter-spacing:.15px;color:#fff;mix-blend-mode:normal;opacity:.58;padding:20px;max-width:1440px;margin:auto}#testimony .carousel .slides{width:400%;left:0;padding-left:0;padding-top:1em;list-style:none;position:relative;-webkit-transition:transform .5s;-moz-transition:transform .5s;-o-transition:transform .5s;transition:transform .5s}#testimony .carousel .slide .user{position:relative;top:-90px;border-radius:50%;height:140px;width:140px;object-fit:cover}#testimony .carousel .slide-div{background:#2d3a67;width:100%}#testimony .carousel .slides li{width:25%;position:relative;float:left}#testimony .carousel li p{margin-top:0}#testimony .carousel .slidesNavigation{display:inline-block;list-style:none;margin:40px}#testimony .carousel input{display:none}#testimony .carousel .slidesNavigation label{float:left;margin:6px;display:block;height:10px;width:10px;-webkit-border-radius:50%;border-radius:50%;border:solid 1px #fff;background:#fff;opacity:.4;font-size:0}#radio-1:checked~.slides{transform:translateX(0)}#radio-2:checked~.slides{transform:translateX(-25%)}#radio-3:checked~.slides{transform:translateX(-50%)}#radio-4:checked~.slides{transform:translateX(-75%)}#testimony .carousel #radio-1:checked~.slidesNavigation label#dotForRadio-1,#testimony .carousel #radio-2:checked~.slidesNavigation label#dotForRadio-2,#testimony .carousel #radio-3:checked~.slidesNavigation label#dotForRadio-3,#testimony .carousel #radio-4:checked~.slidesNavigation label#dotForRadio-4{opacity:1}@media (max-width:624px){#get-started span{display:none}#get-started:before{font-size:13px;content:"Submit"}#footer .brand{justify-content:center}#footer .brand img{margin:20px;display:inline-block}.email-form .search-container label{font-size:11px}#header .heading{font-size:18px}#header .logo-img img{height:60px}#header .intro-video,#list-features .intro-video{max-width:77%}slide #list-features .intro-video{margin-bottom:15px}#list-features img.main-image{width:100%}#account-list .account-list-container{width:unset;box-shadow:unset;margin:0 10px}#account-list a.btn{margin-bottom:10px}}@media (max-width:1024px){.man-img{display:none}.d-flex{display:inline-block}.intro-video{margin:auto;margin-bottom:70px}}@media (min-width:1024px) and (max-width:1367px){#get-started span{display:none}#get-started:before{content:"Submit"}}@media (min-width:768px){.justify-content-center{justify-content:center}}@media (max-width:1440px){.row{margin-left:0!important;margin-right:0!important}}
|
img/{gowp.png → gowp_new.png}
RENAMED
File without changes
|
img/icon.png
CHANGED
Binary file
|
img/logo.png
DELETED
Binary file
|
img/{main-image.png → mc-features-list.png}
RENAMED
File without changes
|
img/mc-full-logo.png
DELETED
Binary file
|
img/mc-testimony-armand-girard.jpg
ADDED
Binary file
|
img/mc-testimony-david-mccan.jpg
ADDED
Binary file
|
img/mc-testimony-ivica-delic.jpg
ADDED
Binary file
|
img/mc-testimony-miriam-schwab.jpg
ADDED
Binary file
|
img/{mc-top-logo.svg → mclogo.svg}
RENAMED
File without changes
|
info.php
CHANGED
@@ -10,7 +10,7 @@ if (!class_exists('MCInfo')) :
|
|
10 |
public $badgeinfo = 'mcbadge';
|
11 |
public $ip_header_option = 'mcipheader';
|
12 |
public $brand_option = 'mcbrand';
|
13 |
-
public $version = '4.
|
14 |
public $webpage = 'https://www.malcare.com';
|
15 |
public $appurl = 'https://app.malcare.com';
|
16 |
public $slug = 'malcare-security/malcare.php';
|
@@ -107,8 +107,19 @@ if ($bvinfo->canSetCWBranding()) {
|
|
107 |
return ($this->getWatchTime() > $expiry_time);
|
108 |
}
|
109 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
110 |
public function isProtectModuleEnabled() {
|
111 |
-
return $this->isServiceActive("protect");
|
112 |
}
|
113 |
|
114 |
public function isDynSyncModuleEnabled() {
|
@@ -134,7 +145,7 @@ if ($bvinfo->canSetCWBranding()) {
|
|
134 |
}
|
135 |
|
136 |
public function isMalcare() {
|
137 |
-
return $this->getBrandName() === 'MalCare
|
138 |
}
|
139 |
|
140 |
public function isBlogvault() {
|
10 |
public $badgeinfo = 'mcbadge';
|
11 |
public $ip_header_option = 'mcipheader';
|
12 |
public $brand_option = 'mcbrand';
|
13 |
+
public $version = '4.77';
|
14 |
public $webpage = 'https://www.malcare.com';
|
15 |
public $appurl = 'https://app.malcare.com';
|
16 |
public $slug = 'malcare-security/malcare.php';
|
107 |
return ($this->getWatchTime() > $expiry_time);
|
108 |
}
|
109 |
|
110 |
+
public function isValidEnvironment(){
|
111 |
+
$bvsiteinfo = new MCWPSiteInfo();
|
112 |
+
$siteurl = $bvsiteinfo->siteurl();
|
113 |
+
$bvconfig = $this->config;
|
114 |
+
if ($bvconfig && array_key_exists("abspath", $bvconfig) &&
|
115 |
+
array_key_exists("siteurl", $bvconfig) && !empty($siteurl)) {
|
116 |
+
return ($bvconfig["abspath"] == ABSPATH && $bvconfig["siteurl"] == $siteurl);
|
117 |
+
}
|
118 |
+
return true;
|
119 |
+
}
|
120 |
+
|
121 |
public function isProtectModuleEnabled() {
|
122 |
+
return $this->isServiceActive("protect") && $this->isValidEnvironment();
|
123 |
}
|
124 |
|
125 |
public function isDynSyncModuleEnabled() {
|
145 |
}
|
146 |
|
147 |
public function isMalcare() {
|
148 |
+
return $this->getBrandName() === 'MalCare';
|
149 |
}
|
150 |
|
151 |
public function isBlogvault() {
|
malcare.php
CHANGED
@@ -1,11 +1,11 @@
|
|
1 |
<?php
|
2 |
/*
|
3 |
-
Plugin Name: MalCare Security -
|
4 |
Plugin URI: https://www.malcare.com
|
5 |
-
Description: MalCare Security -
|
6 |
Author: MalCare Security
|
7 |
Author URI: https://www.malcare.com
|
8 |
-
Version: 4.
|
9 |
Network: True
|
10 |
*/
|
11 |
|
1 |
<?php
|
2 |
/*
|
3 |
+
Plugin Name: MalCare WordPress Security Plugin - Malware Scanner, Cleaner, Security Firewall
|
4 |
Plugin URI: https://www.malcare.com
|
5 |
+
Description: MalCare WordPress Security Plugin - Malware Scanner, Cleaner, Security Firewall
|
6 |
Author: MalCare Security
|
7 |
Author URI: https://www.malcare.com
|
8 |
+
Version: 4.77
|
9 |
Network: True
|
10 |
*/
|
11 |
|
protect/base.php
CHANGED
@@ -25,5 +25,86 @@ class BVProtectBase {
|
|
25 |
|
26 |
return $ip;
|
27 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
}
|
29 |
endif;
|
25 |
|
26 |
return $ip;
|
27 |
}
|
28 |
+
|
29 |
+
public static function hasIPv6Support() {
|
30 |
+
return defined('AF_INET6');
|
31 |
+
}
|
32 |
+
|
33 |
+
public static function isValidIP($ip) {
|
34 |
+
return filter_var($ip, FILTER_VALIDATE_IP) !== false;
|
35 |
+
}
|
36 |
+
|
37 |
+
public static function bvInetPton($ip) {
|
38 |
+
$pton = self::isValidIP($ip) ? (self::hasIPv6Support() ? inet_pton($ip) : self::_bvInetPton($ip)) : false;
|
39 |
+
return $pton;
|
40 |
+
}
|
41 |
+
|
42 |
+
public static function _bvInetPton($ip) {
|
43 |
+
if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) {
|
44 |
+
$octets = explode('.', $ip);
|
45 |
+
$bin = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
|
46 |
+
return $bin;
|
47 |
+
}
|
48 |
+
|
49 |
+
if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) {
|
50 |
+
if ($ip === '::') {
|
51 |
+
return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
|
52 |
+
}
|
53 |
+
$colon_count = substr_count($ip, ':');
|
54 |
+
$dbl_colon_pos = strpos($ip, '::');
|
55 |
+
if ($dbl_colon_pos !== false) {
|
56 |
+
$ip = str_replace('::', str_repeat(':0000',
|
57 |
+
(($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip);
|
58 |
+
$ip = trim($ip, ':');
|
59 |
+
}
|
60 |
+
|
61 |
+
$ip_groups = explode(':', $ip);
|
62 |
+
$ipv6_bin = '';
|
63 |
+
foreach ($ip_groups as $ip_group) {
|
64 |
+
$ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT));
|
65 |
+
}
|
66 |
+
|
67 |
+
return strlen($ipv6_bin) === 16 ? $ipv6_bin : false;
|
68 |
+
}
|
69 |
+
|
70 |
+
if (preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i', $ip, $matches)) {
|
71 |
+
$octets = explode('.', $matches[1]);
|
72 |
+
return chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
|
73 |
+
}
|
74 |
+
|
75 |
+
return false;
|
76 |
+
}
|
77 |
+
|
78 |
+
public static function isIPInRange($start_ip_range, $end_ip_range, $ip) {
|
79 |
+
$bin_ip = null;
|
80 |
+
if ($ip) {
|
81 |
+
$bin_ip = self::bvInetPton($ip);
|
82 |
+
}
|
83 |
+
if ($bin_ip && $bin_ip >= self::bvInetPton($start_ip_range)
|
84 |
+
&& $bin_ip <= self::bvInetPton($end_ip_range)) {
|
85 |
+
return true;
|
86 |
+
}
|
87 |
+
return false;
|
88 |
+
}
|
89 |
+
|
90 |
+
public static function isPrivateIP($ip) {
|
91 |
+
$private_ip_ranges = array(
|
92 |
+
array("10.0.0.0", "10.255.255.255"),
|
93 |
+
array("172.16.0.0", "172.31.255.255"),
|
94 |
+
array("192.168.0.0", "192.168.255.255"),
|
95 |
+
array("127.0.0.1", "127.255.255.255"),
|
96 |
+
array("::1","::1"),
|
97 |
+
array("fc00::","fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")
|
98 |
+
);
|
99 |
+
|
100 |
+
$result = false;
|
101 |
+
foreach ($private_ip_ranges as $ip_range) {
|
102 |
+
$result = self::isIPInRange($ip_range[0], $ip_range[1], $ip);
|
103 |
+
if($result) {
|
104 |
+
return $result;
|
105 |
+
}
|
106 |
+
}
|
107 |
+
return $result;
|
108 |
+
}
|
109 |
}
|
110 |
endif;
|
protect/fw/fw.php
CHANGED
@@ -12,9 +12,16 @@ class BVFW {
|
|
12 |
public $ipstore;
|
13 |
public $category;
|
14 |
public $logger;
|
15 |
-
public $
|
|
|
16 |
public $ruleEvaluator;
|
17 |
public $break_rule_evaluation;
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
const SQLIREGEX = '/(?:[^\\w<]|\\/\\*\\![0-9]*|^)(?:
|
20 |
@@HOSTNAME|
|
@@ -53,17 +60,26 @@ class BVFW {
|
|
53 |
const IP_COOKIE = "bvfw-ip-cookie";
|
54 |
const PREVENT_CACHE_COOKIE = "wp-bvfw-prevent-cache-cookie";
|
55 |
|
56 |
-
|
|
|
57 |
$this->config = new BVFWConfig($confHash);
|
58 |
$this->request = new BVWPRequest($ip);
|
59 |
$this->bvinfo = $bvinfo;
|
60 |
$this->ipstore = $ipstore;
|
61 |
$this->logger = $logger;
|
62 |
-
$this->
|
63 |
-
$this->ruleEvaluator = new BVFWRuleEvaluator($this
|
64 |
$this->break_rule_evaluation = false;
|
65 |
}
|
66 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
67 |
public function setcookie($name, $value, $expire) {
|
68 |
$path = $this->config->cookiePath;
|
69 |
$cookie_domain = $this->config->cookieDomain;
|
@@ -162,8 +178,8 @@ class BVFW {
|
|
162 |
if ($this->config->isCompleteLoggingEnabled()) {
|
163 |
$canlog = true;
|
164 |
} else if ($this->config->isVisitorLoggingEnabled()) {
|
165 |
-
$canlog = !$this->hasValidBypassCookie() &&
|
166 |
-
(!function_exists('is_user_logged_in') || !is_user_logged_in());
|
167 |
}
|
168 |
return $canlog;
|
169 |
}
|
@@ -215,6 +231,10 @@ class BVFW {
|
|
215 |
$this->request->setCategory(BVWPRequest::WHITELISTED);
|
216 |
$this->request->setStatus(BVWPRequest::BYPASSED);
|
217 |
return true;
|
|
|
|
|
|
|
|
|
218 |
}
|
219 |
return false;
|
220 |
}
|
@@ -251,16 +271,53 @@ class BVFW {
|
|
251 |
if ($this->isBlacklistedIP()) {
|
252 |
$this->terminateRequest(BVWPRequest::BLACKLISTED);
|
253 |
}
|
254 |
-
|
255 |
-
|
256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
} else {
|
258 |
-
$this->
|
259 |
}
|
260 |
}
|
261 |
}
|
262 |
}
|
263 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
264 |
public function matchCount($pattern, $subject) {
|
265 |
$count = 0;
|
266 |
if (is_array($subject)) {
|
@@ -389,52 +446,67 @@ class BVFW {
|
|
389 |
foreach ($ruleSet as $rule) {
|
390 |
$id = $rule["id"];
|
391 |
$ruleLogic = $rule["rule_logic"];
|
392 |
-
$
|
393 |
-
$min_rule_engine_ver = $rule["min_rule_engine_ver"];
|
394 |
$this->ruleEvaluator->resetErrors();
|
395 |
|
396 |
-
if (
|
397 |
-
|
398 |
-
|
399 |
-
|
400 |
-
} elseif (!empty($this->ruleEvaluator->getErrors())) {
|
401 |
-
$this->request->updateRulesInfo("errors", (string) $id, $this->ruleEvaluator->getErrors());
|
402 |
-
}
|
403 |
}
|
|
|
404 |
if ($this->break_rule_evaluation) {
|
405 |
return;
|
406 |
}
|
407 |
}
|
408 |
}
|
409 |
|
410 |
-
function
|
411 |
-
|
|
|
|
|
|
|
|
|
|
|
412 |
switch ($action["type"]) {
|
413 |
case "ALLOW":
|
414 |
$this->break_rule_evaluation = true;
|
415 |
$this->request->setCategory(BVWPRequest::RULE_ALLOWED);
|
416 |
return;
|
417 |
case "BLOCK":
|
418 |
-
$this->
|
|
|
|
|
419 |
return;
|
420 |
case "INSPECT":
|
421 |
$this->inspectRequest();
|
422 |
break;
|
423 |
-
case "DEBUG":
|
424 |
-
//TODO
|
425 |
-
break;
|
426 |
-
case "SCRUB":
|
427 |
-
//TODO
|
428 |
-
break;
|
429 |
-
case "FILTER":
|
430 |
-
//TODO
|
431 |
-
break;
|
432 |
}
|
433 |
}
|
434 |
}
|
435 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
436 |
public function inspectRequest() {
|
437 |
$this->request->updateRulesInfo('inspect', "headers", $this->request->getHeaders());
|
|
|
|
|
|
|
|
|
|
|
|
|
438 |
$this->request->updateRulesInfo('inspect', "getParams", $this->request->getGetParams());
|
439 |
$this->request->updateRulesInfo('inspect', "postParams", $this->getPostParamsToLog($this->request->getPostParams()));
|
440 |
$this->request->updateRulesInfo('inspect', "cookies", $this->request->getCookies());
|
12 |
public $ipstore;
|
13 |
public $category;
|
14 |
public $logger;
|
15 |
+
public $generic_rule_set = array();
|
16 |
+
public $wpf_rule_set = array();
|
17 |
public $ruleEvaluator;
|
18 |
public $break_rule_evaluation;
|
19 |
+
public $ruleActions = array();
|
20 |
+
private static $instance = null;
|
21 |
+
|
22 |
+
#RuleLevels
|
23 |
+
const GENERIC = 1;
|
24 |
+
const WPF = 2;
|
25 |
|
26 |
const SQLIREGEX = '/(?:[^\\w<]|\\/\\*\\![0-9]*|^)(?:
|
27 |
@@HOSTNAME|
|
60 |
const IP_COOKIE = "bvfw-ip-cookie";
|
61 |
const PREVENT_CACHE_COOKIE = "wp-bvfw-prevent-cache-cookie";
|
62 |
|
63 |
+
#singleton design
|
64 |
+
private function __construct($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet) {
|
65 |
$this->config = new BVFWConfig($confHash);
|
66 |
$this->request = new BVWPRequest($ip);
|
67 |
$this->bvinfo = $bvinfo;
|
68 |
$this->ipstore = $ipstore;
|
69 |
$this->logger = $logger;
|
70 |
+
$this->initializeLevelWiseRuleSets($ruleSet);
|
71 |
+
$this->ruleEvaluator = new BVFWRuleEvaluator($this);
|
72 |
$this->break_rule_evaluation = false;
|
73 |
}
|
74 |
|
75 |
+
public static function getInstance($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet) {
|
76 |
+
if (!isset(self::$instance)) {
|
77 |
+
self::$instance = new BVFW($logger, $confHash, $ip, $bvinfo, $ipstore, $ruleSet);
|
78 |
+
}
|
79 |
+
|
80 |
+
return self::$instance;
|
81 |
+
}
|
82 |
+
|
83 |
public function setcookie($name, $value, $expire) {
|
84 |
$path = $this->config->cookiePath;
|
85 |
$cookie_domain = $this->config->cookieDomain;
|
178 |
if ($this->config->isCompleteLoggingEnabled()) {
|
179 |
$canlog = true;
|
180 |
} else if ($this->config->isVisitorLoggingEnabled()) {
|
181 |
+
$canlog = ($this->request->hasMatchedRules()) || (!$this->hasValidBypassCookie() &&
|
182 |
+
(!function_exists('is_user_logged_in') || !is_user_logged_in()));
|
183 |
}
|
184 |
return $canlog;
|
185 |
}
|
231 |
$this->request->setCategory(BVWPRequest::WHITELISTED);
|
232 |
$this->request->setStatus(BVWPRequest::BYPASSED);
|
233 |
return true;
|
234 |
+
} else if(BVProtectBase::isPrivateIP($this->request->getIP())) {
|
235 |
+
$this->request->setCategory(BVWPRequest::PRIVATEIP);
|
236 |
+
$this->request->setStatus(BVWPRequest::BYPASSED);
|
237 |
+
return true;
|
238 |
}
|
239 |
return false;
|
240 |
}
|
271 |
if ($this->isBlacklistedIP()) {
|
272 |
$this->terminateRequest(BVWPRequest::BLACKLISTED);
|
273 |
}
|
274 |
+
}
|
275 |
+
}
|
276 |
+
|
277 |
+
public function canExecuteRules() {
|
278 |
+
if (!$this->isWhitelistedIP() && $this->config->isRulesModeEnabled()) {
|
279 |
+
return true;
|
280 |
+
}
|
281 |
+
return false;
|
282 |
+
}
|
283 |
+
|
284 |
+
public function initializeLevelWiseRuleSets($rule_set) {
|
285 |
+
if (!is_array($rule_set)) {
|
286 |
+
$this->request->updateRulesInfo('errors', 'ruleset', 'Invalid RuleSet');
|
287 |
+
return;
|
288 |
+
}
|
289 |
+
|
290 |
+
foreach ($rule_set as $rule) {
|
291 |
+
if (BVFWRuleEvaluator::VERSION >= $rule["min_rule_engine_ver"]) {
|
292 |
+
if (array_key_exists("level", $rule) && $rule["level"] == BVFW::WPF) {
|
293 |
+
array_push($this->wpf_rule_set, $rule);
|
294 |
} else {
|
295 |
+
array_push($this->generic_rule_set, $rule);
|
296 |
}
|
297 |
}
|
298 |
}
|
299 |
}
|
300 |
|
301 |
+
public function ruleSetToExecute() {
|
302 |
+
$rule_set = array();
|
303 |
+
if ($this->isWpLoaded()) {
|
304 |
+
$rule_set = $this->wpf_rule_set;
|
305 |
+
}
|
306 |
+
if (!defined('MCWAFLOADED') && !$this->hasValidBypassCookie()) {
|
307 |
+
$rule_set = array_merge($rule_set, $this->generic_rule_set);
|
308 |
+
}
|
309 |
+
return $rule_set;
|
310 |
+
}
|
311 |
+
|
312 |
+
public function executeRules() {
|
313 |
+
if (!$this->canExecuteRules()) {
|
314 |
+
return;
|
315 |
+
}
|
316 |
+
|
317 |
+
$rule_set = $this->ruleSetToExecute();
|
318 |
+
$this->evaluateRules($rule_set);
|
319 |
+
}
|
320 |
+
|
321 |
public function matchCount($pattern, $subject) {
|
322 |
$count = 0;
|
323 |
if (is_array($subject)) {
|
446 |
foreach ($ruleSet as $rule) {
|
447 |
$id = $rule["id"];
|
448 |
$ruleLogic = $rule["rule_logic"];
|
449 |
+
$this->ruleActions[$id] = $rule["actions"];
|
|
|
450 |
$this->ruleEvaluator->resetErrors();
|
451 |
|
452 |
+
if ($this->ruleEvaluator->evaluateRule($ruleLogic) && empty($this->ruleEvaluator->getErrors())) {
|
453 |
+
$this->handleMatchedRule($id);
|
454 |
+
} elseif (!empty($this->ruleEvaluator->getErrors())) {
|
455 |
+
$this->request->updateRulesInfo("errors", (string) $id, $this->ruleEvaluator->getErrors());
|
|
|
|
|
|
|
456 |
}
|
457 |
+
|
458 |
if ($this->break_rule_evaluation) {
|
459 |
return;
|
460 |
}
|
461 |
}
|
462 |
}
|
463 |
|
464 |
+
function handleMatchedRule($id) {
|
465 |
+
$this->request->updateMatchedRules($id);
|
466 |
+
$this->executeActions($id);
|
467 |
+
}
|
468 |
+
|
469 |
+
function executeActions($id){
|
470 |
+
foreach($this->ruleActions[$id] as $action) {
|
471 |
switch ($action["type"]) {
|
472 |
case "ALLOW":
|
473 |
$this->break_rule_evaluation = true;
|
474 |
$this->request->setCategory(BVWPRequest::RULE_ALLOWED);
|
475 |
return;
|
476 |
case "BLOCK":
|
477 |
+
if ($this->config->isProtecting()) {
|
478 |
+
$this->terminateRequest(BVWPRequest::RULE_BLOCKED);
|
479 |
+
}
|
480 |
return;
|
481 |
case "INSPECT":
|
482 |
$this->inspectRequest();
|
483 |
break;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
484 |
}
|
485 |
}
|
486 |
}
|
487 |
|
488 |
+
function isWPLoaded() {
|
489 |
+
return defined('BVWPLOADED');
|
490 |
+
}
|
491 |
+
|
492 |
+
function getCurrentWPUser() {
|
493 |
+
if (!$this->isWPLoaded()) {
|
494 |
+
return;
|
495 |
+
}
|
496 |
+
if (!function_exists('wp_get_current_user')) {
|
497 |
+
@include_once(ABSPATH . "wp-includes/pluggable.php");
|
498 |
+
}
|
499 |
+
return wp_get_current_user();
|
500 |
+
}
|
501 |
+
|
502 |
public function inspectRequest() {
|
503 |
$this->request->updateRulesInfo('inspect', "headers", $this->request->getHeaders());
|
504 |
+
|
505 |
+
$wp_user = $this->getCurrentWPUser();
|
506 |
+
if ($wp_user && isset($wp_user->ID)) {
|
507 |
+
$this->request->updateRulesInfo('inspect', "userID", $wp_user->ID);
|
508 |
+
}
|
509 |
+
|
510 |
$this->request->updateRulesInfo('inspect', "getParams", $this->request->getGetParams());
|
511 |
$this->request->updateRulesInfo('inspect', "postParams", $this->getPostParamsToLog($this->request->getPostParams()));
|
512 |
$this->request->updateRulesInfo('inspect', "cookies", $this->request->getCookies());
|
protect/fw/request.php
CHANGED
@@ -36,6 +36,7 @@ class BVWPRequest {
|
|
36 |
const USER_BLACKLISTED = 50;
|
37 |
const RULE_BLOCKED = 60;
|
38 |
const RULE_ALLOWED = 70;
|
|
|
39 |
|
40 |
public function __construct($ip) {
|
41 |
$fileNames = array();
|
@@ -180,6 +181,10 @@ class BVWPRequest {
|
|
180 |
return $this->matchedRules;
|
181 |
}
|
182 |
|
|
|
|
|
|
|
|
|
183 |
public function updateReqInfo($info) {
|
184 |
if (is_array($info)) {
|
185 |
$this->reqInfo = $this->reqInfo + $info;
|
36 |
const USER_BLACKLISTED = 50;
|
37 |
const RULE_BLOCKED = 60;
|
38 |
const RULE_ALLOWED = 70;
|
39 |
+
const PRIVATEIP = 80;
|
40 |
|
41 |
public function __construct($ip) {
|
42 |
$fileNames = array();
|
181 |
return $this->matchedRules;
|
182 |
}
|
183 |
|
184 |
+
public function hasMatchedRules() {
|
185 |
+
return !empty($this->matchedRules);
|
186 |
+
}
|
187 |
+
|
188 |
public function updateReqInfo($info) {
|
189 |
if (is_array($info)) {
|
190 |
$this->reqInfo = $this->reqInfo + $info;
|
protect/fw/rule_evaluator.php
CHANGED
@@ -6,10 +6,11 @@ if (!class_exists('BVFWRuleEvaluator')) :
|
|
6 |
class BVFWRuleEvaluator {
|
7 |
private $request;
|
8 |
|
9 |
-
const VERSION = 0.
|
10 |
|
11 |
-
public function __construct($
|
12 |
-
$this->
|
|
|
13 |
}
|
14 |
|
15 |
function getErrors() {
|
@@ -310,9 +311,8 @@ class BVFWRuleEvaluator {
|
|
310 |
function evaluateExpression($expr) {
|
311 |
switch ($expr["type"]) {
|
312 |
case "AND" :
|
313 |
-
|
314 |
-
|
315 |
-
return ($loperand && $roperand);
|
316 |
case "OR" :
|
317 |
$loperand = $this->getValue($expr["left_operand"]);
|
318 |
$roperand = $this->getValue($expr["right_operand"]);
|
@@ -343,6 +343,111 @@ class BVFWRuleEvaluator {
|
|
343 |
return $_args;
|
344 |
}
|
345 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
346 |
function executeFunctionCall($func) {
|
347 |
$name = $func["name"];
|
348 |
$handler = array($this, $name);
|
@@ -367,6 +472,18 @@ class BVFWRuleEvaluator {
|
|
367 |
return $this->fetchConstantValue($expr["value"]);
|
368 |
case "FUNCTION" :
|
369 |
return $this->executeFunctionCall($expr);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
370 |
default :
|
371 |
return $this->evaluateExpression($expr);
|
372 |
}
|
6 |
class BVFWRuleEvaluator {
|
7 |
private $request;
|
8 |
|
9 |
+
const VERSION = 0.3;
|
10 |
|
11 |
+
public function __construct($fw) {
|
12 |
+
$this->fw = $fw;
|
13 |
+
$this->request = $fw->request;
|
14 |
}
|
15 |
|
16 |
function getErrors() {
|
311 |
function evaluateExpression($expr) {
|
312 |
switch ($expr["type"]) {
|
313 |
case "AND" :
|
314 |
+
return ($this->getValue($expr["left_operand"]) &&
|
315 |
+
$this->getValue($expr["right_operand"]));
|
|
|
316 |
case "OR" :
|
317 |
$loperand = $this->getValue($expr["left_operand"]);
|
318 |
$roperand = $this->getValue($expr["right_operand"]);
|
343 |
return $_args;
|
344 |
}
|
345 |
|
346 |
+
function loadPluggable() {
|
347 |
+
if (!function_exists('wp_get_current_user')) {
|
348 |
+
@include_once(ABSPATH . "wp-includes/pluggable.php");
|
349 |
+
}
|
350 |
+
}
|
351 |
+
|
352 |
+
function addWPAction($hook_name, $func_name, $priority, $accepted_args, $config) {
|
353 |
+
$this->loadPluggable();
|
354 |
+
add_action($hook_name, array($this, $func_name), $priority, $accepted_args);
|
355 |
+
$this->setVariable($hook_name, $config);
|
356 |
+
return false;
|
357 |
+
}
|
358 |
+
|
359 |
+
function addWPFilter($hook_name, $func_name, $priority, $accepted_args, $config) {
|
360 |
+
$this->loadPluggable();
|
361 |
+
add_filter($hook_name, array($this, $func_name), $priority, $accepted_args);
|
362 |
+
$this->setVariable($hook_name, $config);
|
363 |
+
return false;
|
364 |
+
}
|
365 |
+
|
366 |
+
function setVariable($name, $value) {
|
367 |
+
$this->{$name} = $value;
|
368 |
+
}
|
369 |
+
|
370 |
+
function getVariable($name) {
|
371 |
+
return $this->{$name};
|
372 |
+
}
|
373 |
+
|
374 |
+
function preInsertUpdatePost($maybe_empty, $postarr) {
|
375 |
+
$curr_hook = current_filter();
|
376 |
+
$config = $this->getVariable($curr_hook);
|
377 |
+
$posts_to_consider = $config["posts_to_consider"];
|
378 |
+
$rule_id = $config["rule_id"];
|
379 |
+
if (in_array($postarr['post_type'], $posts_to_consider)) {
|
380 |
+
if ((!empty($postarr['ID']) && !current_user_can("edit_{$postarr['post_type']}", $postarr['ID']))
|
381 |
+
|| !current_user_can("edit_posts")) {
|
382 |
+
$log_data = array($postarr['post_type'], $postarr['ID']);
|
383 |
+
$this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
|
384 |
+
$this->fw->handleMatchedRule($rule_id);
|
385 |
+
}
|
386 |
+
}
|
387 |
+
return false;
|
388 |
+
}
|
389 |
+
|
390 |
+
function preDeletePost($delete, $post) {
|
391 |
+
$curr_hook = current_filter();
|
392 |
+
$config = $this->getVariable($curr_hook);
|
393 |
+
$posts_to_consider = $config["posts_to_consider"];
|
394 |
+
$rule_id = $config["rule_id"];
|
395 |
+
if (isset($post->post_type) && in_array($post->post_type, $posts_to_consider) &&
|
396 |
+
!current_user_can("delete_{$post->post_type}", $post->ID)) {
|
397 |
+
$log_data = array($post->post_type, $post->ID);
|
398 |
+
$this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
|
399 |
+
$this->fw->handleMatchedRule($rule_id);
|
400 |
+
}
|
401 |
+
}
|
402 |
+
|
403 |
+
function preUserCreation($user_login) {
|
404 |
+
$curr_hook = current_filter();
|
405 |
+
$config = $this->getVariable($curr_hook);
|
406 |
+
$rule_id = $config["rule_id"];
|
407 |
+
if (!username_exists($user_login) && !current_user_can('create_users')) {
|
408 |
+
$this->request->updateRulesInfo("wp_hook_info", $curr_hook, $user_login);
|
409 |
+
$this->fw->handleMatchedRule($rule_id);
|
410 |
+
}
|
411 |
+
return $user_login;
|
412 |
+
}
|
413 |
+
|
414 |
+
function preDeleteUser($id, $reassign, $user) {
|
415 |
+
$curr_hook = current_filter();
|
416 |
+
$config = $this->getVariable($curr_hook);
|
417 |
+
$rule_id = $config["rule_id"];
|
418 |
+
if (!current_user_can('delete_users')) {
|
419 |
+
$log_data = array($id, $reassign, array("ID" => $user->ID,
|
420 |
+
"username" => $user->user_login,
|
421 |
+
"user_email" => $user->user_email,
|
422 |
+
"caps" => $user->allcaps,
|
423 |
+
"roles" => $user->roles));
|
424 |
+
$this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
|
425 |
+
$this->fw->handleMatchedRule($rule_id);
|
426 |
+
}
|
427 |
+
}
|
428 |
+
|
429 |
+
function handleOption($option, $log_data) {
|
430 |
+
$curr_hook = current_filter();
|
431 |
+
$config = $this->getVariable($curr_hook);
|
432 |
+
$options_to_consider = $config["options_to_consider"];
|
433 |
+
$rule_id = $config["rule_id"];
|
434 |
+
if (in_array($option, $options_to_consider) && !current_user_can('manage_options')) {
|
435 |
+
$this->request->updateRulesInfo("wp_hook_info", $curr_hook, $log_data);
|
436 |
+
$this->fw->handleMatchedRule($rule_id);
|
437 |
+
}
|
438 |
+
}
|
439 |
+
|
440 |
+
function preUpdateOption($value, $option, $old_value) {
|
441 |
+
$log_data = array($value, $option, $old_value);
|
442 |
+
$this->handleOption($option, $log_data);
|
443 |
+
return $value;
|
444 |
+
}
|
445 |
+
|
446 |
+
function preDeleteOption($option) {
|
447 |
+
$this->handleOption($option, $option);
|
448 |
+
return $option;
|
449 |
+
}
|
450 |
+
|
451 |
function executeFunctionCall($func) {
|
452 |
$name = $func["name"];
|
453 |
$handler = array($this, $name);
|
472 |
return $this->fetchConstantValue($expr["value"]);
|
473 |
case "FUNCTION" :
|
474 |
return $this->executeFunctionCall($expr);
|
475 |
+
case "ARRAY" :
|
476 |
+
$arr = array();
|
477 |
+
foreach ($expr["value"] as $element) {
|
478 |
+
$arr[] = $this->getValue($element);
|
479 |
+
}
|
480 |
+
return $arr;
|
481 |
+
case "HASH" :
|
482 |
+
$hash = array();
|
483 |
+
foreach($expr["value"] as $key => $value) {
|
484 |
+
$hash[strval($key)] = $value;
|
485 |
+
}
|
486 |
+
return $hash;
|
487 |
default :
|
488 |
return $this->evaluateExpression($expr);
|
489 |
}
|
protect/prepend/protect.php
CHANGED
@@ -58,7 +58,7 @@ require_once dirname( __FILE__ ) . '/logger.php';
|
|
58 |
$fwlogger = new BVPrependLogger();
|
59 |
|
60 |
$fwConfHash = array_key_exists('fw', $mcConf) ? $mcConf['fw'] : array();
|
61 |
-
$fw =
|
62 |
|
63 |
if ($fw->isActive()) {
|
64 |
|
@@ -69,7 +69,8 @@ require_once dirname( __FILE__ ) . '/logger.php';
|
|
69 |
register_shutdown_function(array($fw, 'log'));
|
70 |
|
71 |
$fw->execute();
|
72 |
-
|
|
|
73 |
}
|
74 |
|
75 |
return true;
|
58 |
$fwlogger = new BVPrependLogger();
|
59 |
|
60 |
$fwConfHash = array_key_exists('fw', $mcConf) ? $mcConf['fw'] : array();
|
61 |
+
$fw = BVFW::getInstance($fwlogger, $fwConfHash, $ip, $bvinfo, $bvipstore, $mcRuleSet);
|
62 |
|
63 |
if ($fw->isActive()) {
|
64 |
|
69 |
register_shutdown_function(array($fw, 'log'));
|
70 |
|
71 |
$fw->execute();
|
72 |
+
$fw->executeRules();
|
73 |
+
define('MCWAFLOADED', true);
|
74 |
}
|
75 |
|
76 |
return true;
|
protect/wp/ipstore.php
CHANGED
@@ -27,55 +27,6 @@ if (!class_exists('BVIPStore')) :
|
|
27 |
$this->db->dropBVTable(BVIPStore::$name);
|
28 |
}
|
29 |
|
30 |
-
public function hasIPv6Support() {
|
31 |
-
return defined('AF_INET6');
|
32 |
-
}
|
33 |
-
|
34 |
-
public static function isValidIP($ip) {
|
35 |
-
return filter_var($ip, FILTER_VALIDATE_IP) !== false;
|
36 |
-
}
|
37 |
-
|
38 |
-
public function bvInetPton($ip) {
|
39 |
-
$pton = $this->isValidIP($ip) ? ($this->hasIPv6Support() ? inet_pton($ip) : $this->_bvInetPton($ip)) : false;
|
40 |
-
return $pton;
|
41 |
-
}
|
42 |
-
|
43 |
-
public function _bvInetPton($ip) {
|
44 |
-
if (preg_match('/^(?:\d{1,3}(?:\.|$)){4}/', $ip)) {
|
45 |
-
$octets = explode('.', $ip);
|
46 |
-
$bin = chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
|
47 |
-
return $bin;
|
48 |
-
}
|
49 |
-
|
50 |
-
if (preg_match('/^((?:[\da-f]{1,4}(?::|)){0,8})(::)?((?:[\da-f]{1,4}(?::|)){0,8})$/i', $ip)) {
|
51 |
-
if ($ip === '::') {
|
52 |
-
return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
|
53 |
-
}
|
54 |
-
$colon_count = substr_count($ip, ':');
|
55 |
-
$dbl_colon_pos = strpos($ip, '::');
|
56 |
-
if ($dbl_colon_pos !== false) {
|
57 |
-
$ip = str_replace('::', str_repeat(':0000',
|
58 |
-
(($dbl_colon_pos === 0 || $dbl_colon_pos === strlen($ip) - 2) ? 9 : 8) - $colon_count) . ':', $ip);
|
59 |
-
$ip = trim($ip, ':');
|
60 |
-
}
|
61 |
-
|
62 |
-
$ip_groups = explode(':', $ip);
|
63 |
-
$ipv6_bin = '';
|
64 |
-
foreach ($ip_groups as $ip_group) {
|
65 |
-
$ipv6_bin .= pack('H*', str_pad($ip_group, 4, '0', STR_PAD_LEFT));
|
66 |
-
}
|
67 |
-
|
68 |
-
return strlen($ipv6_bin) === 16 ? $ipv6_bin : false;
|
69 |
-
}
|
70 |
-
|
71 |
-
if (preg_match('/^(?:\:(?:\:0{1,4}){0,4}\:|(?:0{1,4}\:){5})ffff\:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i', $ip, $matches)) {
|
72 |
-
$octets = explode('.', $matches[1]);
|
73 |
-
return chr($octets[0]) . chr($octets[1]) . chr($octets[2]) . chr($octets[3]);
|
74 |
-
}
|
75 |
-
|
76 |
-
return false;
|
77 |
-
}
|
78 |
-
|
79 |
public function isLPIPBlacklisted($ip) {
|
80 |
return $this->checkIPPresent($ip, BVIPStore::BLACKLISTED, BVIPStore::LP);
|
81 |
}
|
@@ -97,7 +48,7 @@ if (!class_exists('BVIPStore')) :
|
|
97 |
$db = $this->db;
|
98 |
$table = $db->getBVTable(BVIPStore::$name);
|
99 |
if ($db->isTablePresent($table)) {
|
100 |
-
$binIP =
|
101 |
if ($binIP !== false) {
|
102 |
$category_str = ($category == BVIPStore::FW) ? "`is_fw` = true" : "`is_lp` = true";
|
103 |
$query_str = "SELECT * FROM $table WHERE %s >= `start_ip_range` && %s <= `end_ip_range` && " . $category_str . " && `type` = %d LIMIT 1;";
|
27 |
$this->db->dropBVTable(BVIPStore::$name);
|
28 |
}
|
29 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
public function isLPIPBlacklisted($ip) {
|
31 |
return $this->checkIPPresent($ip, BVIPStore::BLACKLISTED, BVIPStore::LP);
|
32 |
}
|
48 |
$db = $this->db;
|
49 |
$table = $db->getBVTable(BVIPStore::$name);
|
50 |
if ($db->isTablePresent($table)) {
|
51 |
+
$binIP = BVProtectBase::bvInetPton($ip);
|
52 |
if ($binIP !== false) {
|
53 |
$category_str = ($category == BVIPStore::FW) ? "`is_fw` = true" : "`is_lp` = true";
|
54 |
$query_str = "SELECT * FROM $table WHERE %s >= `start_ip_range` && %s <= `end_ip_range` && " . $category_str . " && `type` = %d LIMIT 1;";
|
protect/wp/lp/lp.php
CHANGED
@@ -31,6 +31,7 @@ class BVWPLP {
|
|
31 |
const BLACKLISTED = 5;
|
32 |
const BYPASSED = 6;
|
33 |
const ALLOWED = 7;
|
|
|
34 |
|
35 |
public function __construct($db, $settings, $ip, $ipstore, $confHash) {
|
36 |
$this->db = $db;
|
@@ -199,6 +200,8 @@ class BVWPLP {
|
|
199 |
$failed_attempts = $this->getLoginCount(BVWPLP::LOGINFAILURE, $this->ip, $this->getFailedLoginGap());
|
200 |
if ($this->isWhitelistedIP()) {
|
201 |
$this->setCategory(BVWPLP::BYPASSED);
|
|
|
|
|
202 |
} else if ($this->isBlacklistedIP()) {
|
203 |
$this->setCategory(BVWPLP::BLACKLISTED);
|
204 |
$this->terminateLogin();
|
31 |
const BLACKLISTED = 5;
|
32 |
const BYPASSED = 6;
|
33 |
const ALLOWED = 7;
|
34 |
+
const PRIVATEIP = 8;
|
35 |
|
36 |
public function __construct($db, $settings, $ip, $ipstore, $confHash) {
|
37 |
$this->db = $db;
|
200 |
$failed_attempts = $this->getLoginCount(BVWPLP::LOGINFAILURE, $this->ip, $this->getFailedLoginGap());
|
201 |
if ($this->isWhitelistedIP()) {
|
202 |
$this->setCategory(BVWPLP::BYPASSED);
|
203 |
+
} else if (BVProtectBase::isPrivateIP($this->ip)) {
|
204 |
+
$this->setCategory(BVWPLP::PRIVATEIP);
|
205 |
} else if ($this->isBlacklistedIP()) {
|
206 |
$this->setCategory(BVWPLP::BLACKLISTED);
|
207 |
$this->terminateLogin();
|
protect/wp/protect.php
CHANGED
@@ -28,7 +28,7 @@ class BVProtect {
|
|
28 |
$bvipstore = new BVIPStore($this->db);
|
29 |
$bvipstore->init();
|
30 |
$bvinfo = new MCInfo($this->settings);
|
31 |
-
|
32 |
$config = $this->settings->getOption($bvinfo->services_option_name);
|
33 |
if (array_key_exists('protect', $config)) {
|
34 |
$config = $config['protect'];
|
@@ -38,12 +38,12 @@ class BVProtect {
|
|
38 |
|
39 |
$ipHeader = array_key_exists('ipheader', $config) ? $config['ipheader'] : false;
|
40 |
$ip = BVProtectBase::getIP($ipHeader);
|
41 |
-
|
42 |
$fwLogger = new BVLogger($this->db, BVFWConfig::$requests_table);
|
43 |
|
44 |
$fwConfHash = array_key_exists('fw', $config) ? $config['fw'] : array();
|
45 |
$ruleSet = $this->getRuleSet();
|
46 |
-
$fw =
|
47 |
|
48 |
if ($fw->isActive()) {
|
49 |
|
@@ -51,15 +51,18 @@ class BVProtect {
|
|
51 |
add_action('init', array($fw, 'setBypassCookie'));
|
52 |
}
|
53 |
|
54 |
-
if (!defined('
|
55 |
$fw->setIPCookie();
|
56 |
}
|
57 |
|
58 |
-
|
|
|
|
|
59 |
register_shutdown_function(array($fw, 'log'));
|
60 |
|
61 |
$fw->execute();
|
62 |
}
|
|
|
63 |
}
|
64 |
|
65 |
$lpConfHash = array_key_exists('lp', $config) ? $config['lp'] : array();
|
28 |
$bvipstore = new BVIPStore($this->db);
|
29 |
$bvipstore->init();
|
30 |
$bvinfo = new MCInfo($this->settings);
|
31 |
+
|
32 |
$config = $this->settings->getOption($bvinfo->services_option_name);
|
33 |
if (array_key_exists('protect', $config)) {
|
34 |
$config = $config['protect'];
|
38 |
|
39 |
$ipHeader = array_key_exists('ipheader', $config) ? $config['ipheader'] : false;
|
40 |
$ip = BVProtectBase::getIP($ipHeader);
|
41 |
+
|
42 |
$fwLogger = new BVLogger($this->db, BVFWConfig::$requests_table);
|
43 |
|
44 |
$fwConfHash = array_key_exists('fw', $config) ? $config['fw'] : array();
|
45 |
$ruleSet = $this->getRuleSet();
|
46 |
+
$fw = BVFW::getInstance($fwLogger, $fwConfHash, $ip, $bvinfo, $bvipstore, $ruleSet);
|
47 |
|
48 |
if ($fw->isActive()) {
|
49 |
|
51 |
add_action('init', array($fw, 'setBypassCookie'));
|
52 |
}
|
53 |
|
54 |
+
if (!defined('MCWAFLOADED') && $fw->canSetIPCookie()) {
|
55 |
$fw->setIPCookie();
|
56 |
}
|
57 |
|
58 |
+
define('BVWPLOADED', true);
|
59 |
+
|
60 |
+
if (!defined('MCWAFLOADED')) {
|
61 |
register_shutdown_function(array($fw, 'log'));
|
62 |
|
63 |
$fw->execute();
|
64 |
}
|
65 |
+
$fw->executeRules();
|
66 |
}
|
67 |
|
68 |
$lpConfHash = array_key_exists('lp', $config) ? $config['lp'] : array();
|
readme.txt
CHANGED
@@ -6,7 +6,7 @@ Donate link: https://www.malcare.com
|
|
6 |
Requires at least: 4.0
|
7 |
Tested up to: 5.9
|
8 |
Requires PHP: 5.4.0
|
9 |
-
Stable tag: 4.
|
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 |
|
@@ -392,6 +392,12 @@ These are available on our website: [Terms of Service](https://www.malcare.com/t
|
|
392 |
8. MalCare’s Uptime Monitoring notifies if a website goes down so that you can handle the situation before starting to lose visitors.
|
393 |
|
394 |
== CHANGELOG ==
|
|
|
|
|
|
|
|
|
|
|
|
|
395 |
= 4.76 =
|
396 |
* Improvements in fetching file stats
|
397 |
|
6 |
Requires at least: 4.0
|
7 |
Tested up to: 5.9
|
8 |
Requires PHP: 5.4.0
|
9 |
+
Stable tag: 4.77
|
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 |
|
392 |
8. MalCare’s Uptime Monitoring notifies if a website goes down so that you can handle the situation before starting to lose visitors.
|
393 |
|
394 |
== CHANGELOG ==
|
395 |
+
= 4.77 =
|
396 |
+
* Improved the landing pages.
|
397 |
+
* Enhanced future vulnerability protection
|
398 |
+
* IP Blocking Improvements
|
399 |
+
* Improved firewall configuration for migrations
|
400 |
+
|
401 |
= 4.76 =
|
402 |
* Improvements in fetching file stats
|
403 |
|
wp_admin.php
CHANGED
@@ -67,6 +67,7 @@ class MCWPAdmin {
|
|
67 |
}
|
68 |
if ($this->bvinfo->isActivateRedirectSet()) {
|
69 |
$this->settings->updateOption($this->bvinfo->plug_redirect, 'no');
|
|
|
70 |
wp_redirect($this->mainUrl());
|
71 |
}
|
72 |
}
|
@@ -74,27 +75,8 @@ class MCWPAdmin {
|
|
74 |
public function mcsecAdminMenu($hook) {
|
75 |
if ($hook === 'toplevel_page_malcare' || preg_match("/bv_add_account$/", $hook) || preg_match("/bv_account_details$/", $hook)) {
|
76 |
wp_enqueue_style( 'mcsurface', plugins_url('css/bvmui.min.css', __FILE__));
|
77 |
-
wp_enqueue_style( '
|
78 |
-
|
79 |
-
}
|
80 |
-
|
81 |
-
public function enqueueBootstrapCSS() {
|
82 |
-
wp_enqueue_style( 'bootstrap', plugins_url('css/bootstrap.min.css', __FILE__));
|
83 |
-
}
|
84 |
-
|
85 |
-
public function showErrors() {
|
86 |
-
$error = NULL;
|
87 |
-
if (isset($_REQUEST['error'])) {
|
88 |
-
$error = $_REQUEST['error'];
|
89 |
-
$open_tag = '<div style="padding-bottom:0.5px;color:#ffaa0d;text-align:center"><p style="font-size:16px;">';
|
90 |
-
$close_tag = '</p></div>';
|
91 |
-
if ($error == "email") {
|
92 |
-
echo $open_tag.'Please enter email in the correct format.'.$close_tag;
|
93 |
-
}
|
94 |
-
else if (($error == "custom") && isset($_REQUEST['bvnonce']) && wp_verify_nonce($_REQUEST['bvnonce'], "bvnonce")
|
95 |
-
&& isset($_REQUEST['message'])) {
|
96 |
-
echo $open_tag.nl2br(esc_html(base64_decode($_REQUEST['message']))).$close_tag;
|
97 |
-
}
|
98 |
}
|
99 |
}
|
100 |
|
@@ -104,7 +86,8 @@ class MCWPAdmin {
|
|
104 |
add_submenu_page(null, 'Malcare', 'Malcare', 'manage_options', 'bv_account_details',
|
105 |
array($this, 'showAccountDetailsPage'));
|
106 |
|
107 |
-
|
|
|
108 |
$bname = $this->bvinfo->getBrandName();
|
109 |
$icon = $this->bvinfo->getBrandIcon();
|
110 |
|
@@ -157,8 +140,8 @@ class MCWPAdmin {
|
|
157 |
public function siteInfoTags() {
|
158 |
require_once dirname( __FILE__ ) . '/recover.php';
|
159 |
$bvnonce = wp_create_nonce("bvnonce");
|
160 |
-
$secret = MCRecover::defaultSecret($this->settings);
|
161 |
$public = MCAccount::getApiPublicKey($this->settings);
|
|
|
162 |
$tags = "<input type='hidden' name='url' value='".$this->siteinfo->wpurl()."'/>\n".
|
163 |
"<input type='hidden' name='homeurl' value='".$this->siteinfo->homeurl()."'/>\n".
|
164 |
"<input type='hidden' name='siteurl' value='".$this->siteinfo->siteurl()."'/>\n".
|
@@ -187,8 +170,7 @@ class MCWPAdmin {
|
|
187 |
}
|
188 |
|
189 |
public function showAddAccountPage() {
|
190 |
-
|
191 |
-
require_once dirname( __FILE__ ) . "/admin/registration.php";
|
192 |
}
|
193 |
|
194 |
public function showAccountDetailsPage() {
|
@@ -227,28 +209,38 @@ class MCWPAdmin {
|
|
227 |
|
228 |
if ($this->bvinfo->canSetCWBranding()) {
|
229 |
$brand = $this->cwBrandInfo();
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
-
|
240 |
-
|
241 |
-
|
242 |
-
|
243 |
-
|
244 |
-
|
245 |
-
|
246 |
-
|
247 |
-
|
248 |
-
|
249 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
250 |
}
|
251 |
}
|
|
|
252 |
return $plugins;
|
253 |
}
|
254 |
}
|
67 |
}
|
68 |
if ($this->bvinfo->isActivateRedirectSet()) {
|
69 |
$this->settings->updateOption($this->bvinfo->plug_redirect, 'no');
|
70 |
+
##ACTIVATEREDIRECTCODE##
|
71 |
wp_redirect($this->mainUrl());
|
72 |
}
|
73 |
}
|
75 |
public function mcsecAdminMenu($hook) {
|
76 |
if ($hook === 'toplevel_page_malcare' || preg_match("/bv_add_account$/", $hook) || preg_match("/bv_account_details$/", $hook)) {
|
77 |
wp_enqueue_style( 'mcsurface', plugins_url('css/bvmui.min.css', __FILE__));
|
78 |
+
wp_enqueue_style( 'bootstrap', plugins_url('css/bootstrap.min.css', __FILE__));
|
79 |
+
wp_enqueue_style( 'bvplugin', plugins_url('css/bvplugin.min.css', __FILE__));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
80 |
}
|
81 |
}
|
82 |
|
86 |
add_submenu_page(null, 'Malcare', 'Malcare', 'manage_options', 'bv_account_details',
|
87 |
array($this, 'showAccountDetailsPage'));
|
88 |
|
89 |
+
$brand = $this->bvinfo->getBrandInfo();
|
90 |
+
if (!$this->bvinfo->canSetCWBranding() && (!$brand || (!array_key_exists('hide', $brand) && !array_key_exists('hide_from_menu', $brand)))) {
|
91 |
$bname = $this->bvinfo->getBrandName();
|
92 |
$icon = $this->bvinfo->getBrandIcon();
|
93 |
|
140 |
public function siteInfoTags() {
|
141 |
require_once dirname( __FILE__ ) . '/recover.php';
|
142 |
$bvnonce = wp_create_nonce("bvnonce");
|
|
|
143 |
$public = MCAccount::getApiPublicKey($this->settings);
|
144 |
+
$secret = MCRecover::defaultSecret($this->settings);
|
145 |
$tags = "<input type='hidden' name='url' value='".$this->siteinfo->wpurl()."'/>\n".
|
146 |
"<input type='hidden' name='homeurl' value='".$this->siteinfo->homeurl()."'/>\n".
|
147 |
"<input type='hidden' name='siteurl' value='".$this->siteinfo->siteurl()."'/>\n".
|
170 |
}
|
171 |
|
172 |
public function showAddAccountPage() {
|
173 |
+
require_once dirname( __FILE__ ) . "/admin/add_new_account.php";
|
|
|
174 |
}
|
175 |
|
176 |
public function showAccountDetailsPage() {
|
209 |
|
210 |
if ($this->bvinfo->canSetCWBranding()) {
|
211 |
$brand = $this->cwBrandInfo();
|
212 |
+
} else {
|
213 |
+
$brand = $this->bvinfo->getBrandInfo();
|
214 |
+
}
|
215 |
+
|
216 |
+
if ($brand) {
|
217 |
+
if (array_key_exists('hide', $brand)) {
|
218 |
+
unset($plugins[$slug]);
|
219 |
+
} else {
|
220 |
+
if (array_key_exists('name', $brand)) {
|
221 |
+
$plugins[$slug]['Name'] = $brand['name'];
|
222 |
+
}
|
223 |
+
if (array_key_exists('title', $brand)) {
|
224 |
+
$plugins[$slug]['Title'] = $brand['title'];
|
225 |
+
}
|
226 |
+
if (array_key_exists('description', $brand)) {
|
227 |
+
$plugins[$slug]['Description'] = $brand['description'];
|
228 |
+
}
|
229 |
+
if (array_key_exists('authoruri', $brand)) {
|
230 |
+
$plugins[$slug]['AuthorURI'] = $brand['authoruri'];
|
231 |
+
}
|
232 |
+
if (array_key_exists('author', $brand)) {
|
233 |
+
$plugins[$slug]['Author'] = $brand['author'];
|
234 |
+
}
|
235 |
+
if (array_key_exists('authorname', $brand)) {
|
236 |
+
$plugins[$slug]['AuthorName'] = $brand['authorname'];
|
237 |
+
}
|
238 |
+
if (array_key_exists('pluginuri', $brand)) {
|
239 |
+
$plugins[$slug]['PluginURI'] = $brand['pluginuri'];
|
240 |
+
}
|
241 |
}
|
242 |
}
|
243 |
+
|
244 |
return $plugins;
|
245 |
}
|
246 |
}
|