diff --git a/index.php b/index.php
index 457955c..62ed2b9 100644
--- a/index.php
+++ b/index.php
@@ -2,7 +2,7 @@
/**
* Plugin Name: POLA-CDK - WP Security
* Description: Improves security of WordPress
- * Version: 1.0.2
+ * Version: 1.1.0
* Author: Pola Network
* Author URI: https://github.com/Codeko/wp-security
*/
@@ -11,11 +11,56 @@
exit;
}
-add_action( 'init', 'wp_security_github_plugin_updater' );
+const WPSP_HTACCESS_MARKER = "WpSecurityPlugin";
+const WPSP_HTACCESS_BLOCKS = array(
+ "\nHeader set X-Frame-Options SAMEORIGIN\n",
+ "RewriteEngine On\nRewriteCond %{REQUEST_URI} ^/wp-cron.php\nRewriteRule ^(.*)$ - [L,R=404]",
+ "RewriteEngine On\nRewriteCond %{REQUEST_URI} ^/.git\nRewriteRule ^(.*)$ - [L,R=404]",
+ "RewriteEngine On\nRewriteCond %{REQUEST_URI} ^/readme.html\nRewriteRule ^(.*)$ - [L,R=404]",
+ "RewriteEngine On\nRewriteCond %{REQUEST_URI} ^/xmlrpc.php\nRewriteRule ^(.*)$ - [L,R=404]",
+);
-function wp_security_github_plugin_updater() {
+
+function wp_security_plugin_activation()
+{
+ if (!is_admin()) {
+ return;
+ }
+ wp_security_execute_on_plugin_update();
+}
+register_activation_hook(__FILE__, 'wp_security_plugin_activation');
+
+function wp_security_plugin_loaded()
+{
+ if (is_admin()) {
+ $previous_version = get_option('wp-security-plugin-version', 0);
+ if ($previous_version != wp_security_get_plugin_version()) {
+ wp_security_execute_on_plugin_update();
+ }
+ }
+ wp_security_secure_cookie();
+ wp_security_remove_feed_after_load();
+}
+add_action('plugins_loaded', 'wp_security_plugin_loaded');
+
+function wp_security_plugin_deactivate()
+{
+ wp_security_add_htaccess_rules(["# WP Security plugin is deactivated", "# this block can be safely removed"]);
+}
+
+add_action("deactivate_plugin", "wp_security_plugin_deactivate", 10, 1);
+
+
+function wp_security_execute_on_plugin_update()
+{
+ update_option('wp-security-plugin-version', wp_security_get_plugin_version());
+ wp_security_add_htaccess_rules();
+}
+
+function wp_security_github_plugin_updater()
+{
include_once('updater.php');
- define( 'WP_GITHUB_FORCE_UPDATE', true );
+ define('WP_GITHUB_FORCE_UPDATE', true);
if (is_admin()) { // note the use of is_admin() to double check that this is happening in the admin
$config = array(
@@ -33,13 +78,46 @@ function wp_security_github_plugin_updater() {
new WP_GitHub_Updater($config);
}
}
+add_action('init', 'wp_security_github_plugin_updater');
+
-function wp_security_custom_author_url(){
+function wp_security_custom_author_url()
+{
return home_url('/');
}
add_filter('author_link', 'wp_security_custom_author_url');
-function wp_security_disable_feed(){
+function wp_security_secure_cookie()
+{
+ @ini_set('session.cookie_httponly', true);
+ @ini_set('session.cookie_secure', true);
+ @ini_set('session.use_only_cookies', true);
+ @ini_set('session.use_strict_mode', 1);
+}
+
+function wp_security_login_error_message( $message ) {
+ if ( strpos( $message, "ERROR:" ) !== false ) {
+ $message = "Incorrect username or password.";
+ }
+ return $message;
+}
+add_filter( 'login_errors', 'wp_security_login_error_message' );
+
+function wp_security_hide_users_list( $errors ) {
+
+ $path = ltrim( $GLOBALS['wp']->query_vars['rest_route'], '/' );
+
+ if ( strpos( $path, 'wp/v2/users' ) !== false ) {
+ return new WP_Error( 'rest_no_route', "No route was found matching the URL and request method.", array( 'status' => 404 ) );
+ }
+
+ return $errors;
+}
+add_filter( 'rest_authentication_errors','wp_security_hide_users_list');
+
+
+function wp_security_disable_feed()
+{
global $wp_query;
$wp_query->set_404();
status_header(404);
@@ -47,7 +125,8 @@ function wp_security_disable_feed(){
exit;
}
-function wp_security_remove_feed_after_load(){
+function wp_security_remove_feed_after_load()
+{
add_action('do_feed', 'wp_security_disable_feed', 1);
add_action('do_feed_rdf', 'wp_security_disable_feed', 1);
add_action('do_feed_rss', 'wp_security_disable_feed', 1);
@@ -59,45 +138,86 @@ function wp_security_remove_feed_after_load(){
remove_action('wp_head', 'feed_links', 2);
}
-add_action('plugins_loaded', 'wp_security_remove_feed_after_load');
-
-add_filter( 'xmlrpc_methods', 'wp_security_sar_block_xmlrpc_attacks' );
-
/**
* Unset XML-RPC Methods.
*
* @param array $methods Array of current XML-RPC methods.
*/
-function wp_security_sar_block_xmlrpc_attacks( $methods ) {
- unset( $methods['pingback.ping'] );
- unset( $methods['pingback.extensions.getPingbacks'] );
- return $methods;
+function wp_security_sar_block_xmlrpc_attacks($methods)
+{
+ unset($methods['pingback.ping']);
+ unset($methods['pingback.extensions.getPingbacks']);
+ return $methods;
}
+add_filter('xmlrpc_methods', 'wp_security_sar_block_xmlrpc_attacks');
+
+/**
+ * Add rules to HTACCESS file
+ */
+function wp_security_add_htaccess_rules($rules = null)
+{
+ if (!$rules) {
+ $rules = WPSP_HTACCESS_BLOCKS;
+ }
+ $htaccess_path = ABSPATH . '.htaccess';
+ if (file_exists($htaccess_path)) {
+ insert_with_markers($htaccess_path, WPSP_HTACCESS_MARKER, $rules);
+ }
+}
+
+function wp_security_get_plugin_version()
+{
+ $plugin_data = get_plugin_data(__FILE__);
+ return $plugin_data['Version'];
+}
+
+function wp_security_admin_notice() {
+ file_get_contents(site_url());
+ $server_header = "";
+ foreach ($http_response_header as $key => $value) {
+ if (substr(strtolower($value), 0, 7) == "server:") {
+ $server_header = $value;
+ }
+ }
+ if (strlen($server_header) > 14) {
+ ?>
+
+
POLA-CDK - WP Security information:
+
+ .
+
+
+ =' ) ) {
-
- add_action( 'wp', 'wp_security_sar_remove_x_pingback_header_44', 9999 );
-
- /**
- * Remove X-Pingback from Header for WP 4.4+.
- */
- function wp_security_sar_remove_x_pingback_header_44() {
- header_remove( 'X-Pingback' );
- }
-} elseif ( version_compare( get_bloginfo( 'version' ), '4.4', '<' ) ) {
-
- add_filter( 'wp_headers', 'wp_security_sar_remove_x_pingback_header' );
-
- /**
- * Remove X-Pingback from Header for older WP versions.
- *
- * @param array $headers Array with current headers.
- */
- function wp_security_sar_remove_x_pingback_header( $headers ) {
- unset( $headers['X-Pingback'] );
- return $headers;
- }
+if (version_compare(get_bloginfo('version'), '4.4', '>=')) {
+
+ add_action('wp', 'wp_security_sar_remove_x_pingback_header_44', 9999);
+
+ /**
+ * Remove X-Pingback from Header for WP 4.4+.
+ */
+ function wp_security_sar_remove_x_pingback_header_44()
+ {
+ header_remove('X-Pingback');
+ }
+} elseif (version_compare(get_bloginfo('version'), '4.4', '<')) {
+
+ add_filter('wp_headers', 'wp_security_sar_remove_x_pingback_header');
+
+ /**
+ * Remove X-Pingback from Header for older WP versions.
+ *
+ * @param array $headers Array with current headers.
+ */
+ function wp_security_sar_remove_x_pingback_header($headers)
+ {
+ unset($headers['X-Pingback']);
+ return $headers;
+ }
}