configs->get_value('aiowps_disable_xmlrpc_pingback_methods')) { add_filter('xmlrpc_methods', array($this, 'aiowps_disable_xmlrpc_pingback_methods')); add_filter('wp_headers', array($this, 'aiowps_remove_x_pingback_header')); } if ('1' == $aio_wp_security->configs->get_value('aiowps_disable_rss_and_atom_feeds')) { add_action('do_feed', array($this, 'block_feed'), 1); add_action('do_feed_rdf', array($this, 'block_feed'), 1); add_action('do_feed_rss', array($this, 'block_feed'), 1); add_action('do_feed_rss2', array($this, 'block_feed'), 1); add_action('do_feed_atom', array($this, 'block_feed'), 1); add_action('do_feed_rss2_comments', array($this, 'block_feed'), 1); add_action('do_feed_atom_comments', array($this, 'block_feed'), 1); remove_action('wp_head', 'feed_links_extra', 3); remove_action('wp_head', 'feed_links', 2); } // Check permanent block list and block if applicable (ie, do PHP blocking) if (!is_user_logged_in()) { AIOWPSecurity_Blocking::check_visitor_ip_and_perform_blocking(); } if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_spambot_detecting') && '0' == $aio_wp_security->configs->get_value('aiowps_spam_comments_should')) { add_action('pre_comment_on_post', array($this, 'spam_detecting_and_process_comments_discard'), 10, 2); //this hook gets fired before comment is added } if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_spambot_detecting') && '1' == $aio_wp_security->configs->get_value('aiowps_spam_comments_should')) { add_filter('pre_comment_approved', array($this, 'spam_detecting_and_process_comments_mark_spam'), 10, 2); //this hook filters a comments approval status before it is set } if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_autoblock_spam_ip')) { add_action('comment_post', array($this, 'spam_detect_process_comment_post'), 10, 2); //this hook gets fired just after comment is saved to DB add_action('transition_comment_status', array($this, 'process_transition_comment_status'), 10, 3); //this hook gets fired when a comment's status changes } if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_rename_login_page')) { add_action('widgets_init', array($this, 'remove_standard_wp_meta_widget')); add_filter('retrieve_password_message', array($this, 'decode_reset_pw_msg'), 10, 4); //Fix for non decoded html entities in password reset link } if (AIOWPSecurity_Utility_Permissions::has_manage_cap() && is_admin()) { if ('1' == $aio_wp_security->configs->get_value('aios_google_recaptcha_invalid_configuration')) { add_action('all_admin_notices', array($this, 'google_recaptcha_notice')); } if (is_main_site() && is_super_admin()) { add_action('all_admin_notices', array($this, 'do_firewall_notice')); add_action('admin_post_aiowps_firewall_setup', array(AIOWPSecurity_Firewall_Setup_Notice::get_instance(), 'handle_setup_form')); add_action('admin_post_aiowps_firewall_downgrade', array(AIOWPSecurity_Firewall_Setup_Notice::get_instance(), 'handle_downgrade_protection_form')); add_action('admin_post_aiowps_firewall_setup_dismiss', array(AIOWPSecurity_Firewall_Setup_Notice::get_instance(), 'handle_dismiss_form')); } $this->reapply_htaccess_rules(); add_action('admin_notices', array($this,'reapply_htaccess_rules_notice')); } /** * Send X-Frame-Options: SAMEORIGIN in HTTP header */ if ('1' == $aio_wp_security->configs->get_value('aiowps_prevent_site_display_inside_frame')) { add_action('template_redirect', 'send_frame_options_header'); } if ('1' == $aio_wp_security->configs->get_value('aiowps_remove_wp_generator_meta_info')) { add_filter('the_generator', array($this,'remove_wp_generator_meta_info')); add_filter('style_loader_src', array($this,'remove_wp_css_js_meta_info')); add_filter('script_loader_src', array($this,'remove_wp_css_js_meta_info')); } // For the cookie based brute force prevention feature // Already logged in user should not redirected to brute_force_redirect_url in any case so added condition !is_user_logged_in() if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_brute_force_attack_prevention')) { $bfcf_secret_word = $aio_wp_security->configs->get_value('aiowps_brute_force_secret_word'); if (isset($_GET[$bfcf_secret_word])) { AIOWPSecurity_Utility_IP::check_login_whitelist_and_forbid(); // If URL contains secret word in query param then set cookie and then redirect to the login page AIOWPSecurity_Utility::set_cookie_value(AIOWPSecurity_Utility::get_brute_force_secret_cookie_name(), wp_hash($bfcf_secret_word)); if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_rename_login_page') && !is_user_logged_in()) { $login_url = home_url((get_option('permalink_structure') ? '' : '?') . $aio_wp_security->configs->get_value('aiowps_login_page_slug')); AIOWPSecurity_Utility::redirect_to_url($login_url); } elseif (!is_user_logged_in()) { AIOWPSecurity_Utility::redirect_to_url(AIOWPSEC_WP_URL.'/wp-admin'); } } } // Stop users enumeration feature if ($aio_wp_security->configs->get_value('aiowps_prevent_users_enumeration') == 1) { include_once(AIO_WP_SECURITY_PATH.'/other-includes/wp-security-stop-users-enumeration.php'); } // REST API security if ($aio_wp_security->configs->get_value('aiowps_disallow_unauthorized_rest_requests') == 1) { add_action('rest_api_init', array($this, 'check_rest_api_requests'), 10, 1); } // For user unlock request feature if (isset($_POST['aiowps_unlock_request']) || isset($_POST['aiowps_wp_submit_unlock_request'])) { nocache_headers(); remove_action('wp_head', 'head_addons', 7); include_once(AIO_WP_SECURITY_PATH.'/other-includes/wp-security-unlock-request.php'); exit(); } if (isset($_GET['aiowps_auth_key'])) { //If URL contains unlock key in query param then process the request $unlock_key = sanitize_text_field($_GET['aiowps_auth_key']); AIOWPSecurity_User_Login::process_unlock_request($unlock_key); } // For honeypot feature if (isset($_POST['aio_special_field'])) { $special_field_value = sanitize_text_field($_POST['aio_special_field']); if (!empty($special_field_value)) { //This means a robot has submitted the login form! //Redirect back to its localhost AIOWPSecurity_Utility::redirect_to_url('http://127.0.0.1'); } } // For 404 IP lockout feature if ($aio_wp_security->configs->get_value('aiowps_enable_404_IP_lockout') == '1') { if (!is_user_logged_in() || !current_user_can('administrator')) { $this->do_404_lockout_tasks(); } } // For login CAPTCHA feature if ($aio_wp_security->configs->get_value('aiowps_enable_login_captcha') == '1') { if (!is_user_logged_in()) { add_action('login_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); } } // For woo form CAPTCHA features if ($aio_wp_security->configs->get_value('aiowps_enable_woo_login_captcha') == '1') { if (!is_user_logged_in()) { add_action('woocommerce_login_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); } if (isset($_POST['woocommerce-login-nonce'])) { add_filter('woocommerce_process_login_errors', array($this, 'aiowps_validate_woo_login_or_reg_captcha'), 10, 3); } } if ($aio_wp_security->configs->get_value('aiowps_enable_woo_register_captcha') == '1') { if (!is_user_logged_in()) { add_action('woocommerce_register_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); } if (isset($_POST['woocommerce-register-nonce'])) { add_filter('woocommerce_process_registration_errors', array($this, 'aiowps_validate_woo_login_or_reg_captcha'), 10, 3); } } if ($aio_wp_security->configs->get_value('aiowps_enable_woo_lostpassword_captcha') == '1') { if (!is_user_logged_in()) { add_action('woocommerce_lostpassword_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); } if (isset($_POST['woocommerce-lost-password-nonce'])) { add_action('lostpassword_post', array($this, 'process_woo_lost_password_form_post')); } } // For bbPress new topic form CAPTCHA if ($aio_wp_security->configs->get_value('aiowps_enable_bbp_new_topic_captcha') == '1') { if (!is_user_logged_in()) { add_action('bbp_theme_before_topic_form_submit_wrapper', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); } } // For custom login form CAPTCHA feature, ie, when wp_login_form() function is used to generate login form if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_custom_login_captcha') && !is_user_logged_in()) { add_filter('login_form_middle', array($aio_wp_security->captcha_obj, 'insert_captcha_custom_login'), 10, 2); //For cases where the WP wp_login_form() function is used add_filter('login_form_bottom', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 20); } // For honeypot feature if ($aio_wp_security->configs->get_value('aiowps_enable_login_honeypot') == '1') { if (!is_user_logged_in()) { add_action('login_form', array($this, 'insert_honeypot_hidden_field')); } } // For registration honeypot feature if ($aio_wp_security->configs->get_value('aiowps_enable_registration_honeypot') == '1') { if (!is_user_logged_in()) { add_action('register_form', array($this, 'insert_honeypot_hidden_field')); } } // For disable application password feature hide generate password if ('1' == $aio_wp_security->configs->get_value('aiowps_disable_application_password')) { add_filter('wp_is_application_passwords_available', '__return_false'); add_action('edit_user_profile', array($this, 'show_disabled_application_password_message')); add_action('show_user_profile', array($this, 'show_disabled_application_password_message')); // Override the wp_die handler for app passwords were disabled. if (!empty($_SERVER['SCRIPT_FILENAME']) && ABSPATH . 'wp-admin/authorize-application.php' == $_SERVER['SCRIPT_FILENAME']) { add_filter('wp_die_handler', function () { return function ($message, $title, $args) { if ('Application passwords are not available.' == $message) { $message = htmlspecialchars(__('Application passwords have been disabled by All In One WP Security & Firewall plugin.', 'all-in-one-wp-security-and-firewall')); } _default_wp_die_handler($message, $title, $args); }; }, 10, 1); } } // For lost password CAPTCHA feature if ($aio_wp_security->configs->get_value('aiowps_enable_lost_password_captcha') == '1') { if (!is_user_logged_in()) { add_action('lostpassword_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); add_action('lostpassword_post', array($this, 'process_lost_password_form_post')); } } // For registration manual approval feature if ($aio_wp_security->configs->get_value('aiowps_enable_manual_registration_approval') == '1') { add_filter('wp_login_errors', array($this, 'modify_registration_page_messages'), 10, 2); } // For registration page CAPTCHA feature if (is_multisite()) { $blog_id = get_current_blog_id(); switch_to_blog($blog_id); if ($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1') { if (!is_user_logged_in()) { add_action('signup_extra_fields', array($this, 'insert_captcha_question_form_multi')); //add_action('preprocess_signup_form', array($this, 'process_signup_form_multi')); add_filter('wpmu_validate_user_signup', array($this, 'process_signup_form_multi')); } } restore_current_blog(); } else { if ($aio_wp_security->configs->get_value('aiowps_enable_registration_page_captcha') == '1') { if (!is_user_logged_in()) { add_action('register_form', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); } } } // For comment CAPTCHA feature or custom login form CAPTCHA if (is_multisite()) { $blog_id = get_current_blog_id(); switch_to_blog($blog_id); if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_comment_captcha') && !is_user_logged_in()) { add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form'), 1); add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 10); add_filter('preprocess_comment', array($this, 'process_comment_post')); } restore_current_blog(); } else { if ('1' == $aio_wp_security->configs->get_value('aiowps_enable_comment_captcha') && !is_user_logged_in()) { add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form'), 1); add_action('comment_form_after_fields', array($aio_wp_security->captcha_obj, 'add_captcha_script'), 10); add_filter('preprocess_comment', array($this, 'process_comment_post')); } } // For BuddyPress registration CAPTCHA feature if ($aio_wp_security->configs->get_value('aiowps_enable_bp_register_captcha') == '1') { add_action('bp_account_details_fields', array($aio_wp_security->captcha_obj, 'insert_captcha_question_form')); add_action('bp_signup_validate', array($this, 'buddy_press_signup_validate_captcha')); } // For block fake Googlebots feature if ($aio_wp_security->configs->get_value('aiowps_block_fake_googlebots') == '1') { include_once(AIO_WP_SECURITY_PATH.'/classes/wp-security-bot-protection.php'); AIOWPSecurity_Fake_Bot_Protection::block_fake_googlebots(); } // For 404 event logging if ($aio_wp_security->configs->get_value('aiowps_enable_404_logging') == '1') { add_action('wp_head', array($this, 'check_404_event')); } // Add more tasks that need to be executed at init time } // end _construct() public function aiowps_disable_xmlrpc_pingback_methods($methods) { unset($methods['pingback.ping']); unset($methods['pingback.extensions.getPingbacks']); return $methods; } public function aiowps_remove_x_pingback_header($headers) { unset($headers['X-Pingback']); return $headers; } /** * Blocks feed by redirecting user to home url. * * @return Void */ public function block_feed() { wp_redirect(home_url()); } /** * Spam detection and discard comment. * * @param int $comment_post_id * * @return void */ public function spam_detecting_and_process_comments_discard($comment_post_id) { $is_comment_shoud_not_allowed = AIOWPSecurity_Comment::is_comment_spam_detected(); if ($is_comment_shoud_not_allowed) { $this->spam_discard_auto_block_ip(); $comments = get_comments(array('number' => '1', 'post_id' => $comment_post_id)); if ($comments) { $loc = get_comment_link($comments[0]->comment_ID); } else { $loc = get_permalink($comment_post_id) . '#spam-comment-msg'; } wp_safe_redirect($loc); exit; } } /** * Block IP for spam discard after minimum comments reached. * * @return void */ public function spam_discard_auto_block_ip() { global $aio_wp_security, $wpdb; if ('1' != $aio_wp_security->configs->get_value('aiowps_enable_autoblock_spam_ip')) return; AIOWPSecurity_Utility::event_logger('spam_discard'); $comment_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); $spam_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(id) FROM ".AIOWPSEC_TBL_EVENTS." WHERE ip_or_host = %s AND event_type=%s", $comment_ip, 'spam_discard')); $min_comment_before_block = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); if (!empty($min_comment_before_block) && $spam_count > $min_comment_before_block) { AIOWPSecurity_Blocking::add_ip_to_block_list($comment_ip, 'spam_discard'); } } /** * Spam detection and mark as spam comment. * * @param string $approved * * @return string status */ public function spam_detecting_and_process_comments_mark_spam($approved) { return AIOWPSecurity_Comment::is_comment_spam_detected() ? 'spam' : $approved; } public function spam_detect_process_comment_post($comment_id, $comment_approved) { if ("spam" === $comment_approved) { $this->block_comment_ip($comment_id); } } public function process_transition_comment_status($new_status, $old_status, $comment) { if ('spam' == $new_status) { $this->block_comment_ip($comment->comment_ID); } } /** * Will check auto-spam blocking settings and will add IP to blocked table accordingly * * @param int $comment_id */ public function block_comment_ip($comment_id) { global $aio_wp_security, $wpdb; $comment_obj = get_comment($comment_id); $comment_ip = $comment_obj->comment_author_IP; //Get number of spam comments from this IP $sql = $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_approved = 'spam' AND comment_author_IP = %s ", $comment_ip); $comment_data = $wpdb->get_results($sql, ARRAY_A); $spam_count = count($comment_data); $min_comment_before_block = $aio_wp_security->configs->get_value('aiowps_spam_ip_min_comments_block'); if (!empty($min_comment_before_block) && $spam_count >= ($min_comment_before_block - 1)) { AIOWPSecurity_Blocking::add_ip_to_block_list($comment_ip, 'spam'); } } public function remove_standard_wp_meta_widget() { unregister_widget('WP_Widget_Meta'); } public function remove_wp_generator_meta_info() { return ''; } public function remove_wp_css_js_meta_info($src) { global $wp_version; static $wp_version_hash = null; // Cache hash value for all function calls // Replace only version number of assets with WP version if (strpos($src, 'ver=' . $wp_version) !== false) { if (!$wp_version_hash) { $wp_version_hash = wp_hash($wp_version); } // Replace version number with computed hash $src = add_query_arg('ver', $wp_version_hash, $src); } return $src; } public function do_404_lockout_tasks() { global $aio_wp_security; $redirect_url = $aio_wp_security->configs->get_value('aiowps_404_lock_redirect_url'); //This is the redirect URL for blocked users $visitor_ip = AIOWPSecurity_Utility_IP::get_user_ip_address(); $is_locked = AIOWPSecurity_Utility::check_locked_ip($visitor_ip); if ($is_locked) { //redirect blocked user to configured URL AIOWPSecurity_Utility::redirect_to_url($redirect_url); } else { //allow through } } public function insert_captcha_question_form_multi() { global $aio_wp_security; $default_captcha = $aio_wp_security->configs->get_value('aiowps_default_captcha'); $aio_wp_security->captcha_obj->display_captcha_form($default_captcha); } public function process_signup_form_multi($result) { global $aio_wp_security; // Check if CAPTCHA enabled $verify_captcha = $aio_wp_security->captcha_obj->verify_captcha_submit(); if (false === $verify_captcha) { // wrong answer was entered $result['errors']->add('generic', __('ERROR: Your answer was incorrect - please try again.', 'all-in-one-wp-security-and-firewall')); } return $result; } public function insert_honeypot_hidden_field() { $honey_input = '
'; echo $honey_input; } /** * Shows application password disabled message on user edit profile page. * If logged user is admin showing the Change Setting option. * * @return void */ public function show_disabled_application_password_message() { if (is_user_logged_in() && is_admin()) { $disabled_message = '| '.__('Disabled').' | '; $disabled_message .= ''.htmlspecialchars(__('Application passwords have been disabled by All In One WP Security & Firewall plugin.', 'all-in-one-wp-security-and-firewall'));
if (AIOWPSecurity_Utility_Permissions::has_manage_cap()) {
$aiowps_addtional_setting_url = 'admin.php?page=aiowpsec_userlogin&tab=additional';
$change_setting_url = is_multisite() ? network_admin_url($aiowps_addtional_setting_url) : admin_url($aiowps_addtional_setting_url);
$disabled_message .= ' '.__('Change setting', 'all-in-one-wp-security-and-firewall').' '; } else { $disabled_message .= ' '.__('Site admin can only change this setting.', 'all-in-one-wp-security-and-firewall'); } $disabled_message .= ' | ';
$disabled_message .= '
|---|
'; /* translators: %s: Admin Dashboard > WP Security > Brute Force > Login CAPTCHA Tab Link */ printf(__('Your Google reCAPTCHA configuration is invalid.', 'all-in-one-wp-security-and-firewall').' '.__('Please enter the correct reCAPTCHA keys %s to use the Google reCAPTCHA feature.', 'all-in-one-wp-security-and-firewall'), ''.__('here', 'all-in-one-wp-security-and-firewall').''); echo '
'.htmlspecialchars(__('Would you like All In One WP Security & Firewall to restore the config settings and re-insert the security rules in your .htaccess file which were cleared when you deactivated the plugin?', 'all-in-one-wp-security-and-firewall')).' '.__('Yes', 'all-in-one-wp-security-and-firewall').' '.__('No', 'all-in-one-wp-security-and-firewall').'
'.htmlspecialchars(__('Would you like All In One WP Security & Firewall to restore the config settings which were cleared when you deactivated the plugin?', 'all-in-one-wp-security-and-firewall')).' '.__('Yes', 'all-in-one-wp-security-and-firewall').' '.__('No', 'all-in-one-wp-security-and-firewall').'