| 开发者 | nirajpal |
|---|---|
| 更新时间 | 2026年6月10日 01:02 |
| PHP版本: | 7.4 及以上 |
| WordPress版本: | 7.0 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
wp_options, wp_posts, wp_postmeta for injected PHP/JS payloadsnewsfeed admin user every time a spam comment was posted. That attack pattern is now a built-in detection.
malroot-security folder to /wp-content/plugins/ or install via the Plugins menu.No — Malroot is designed to complement file-based scanners, not replace them. It catches the database-resident, REST-based, and trigger-based threats that file scanners typically miss. Run both for layered protection.
Files are moved to a private folder under wp-content/uploads/malroot-quarantine/ (protected by .htaccess). Database options, postmeta, users, and triggers are backed up to a quarantine table and then removed. Every action is reversible from the Quarantine page.
No. Malroot verifies changed files against official WordPress.org checksums. Files that match are auto-accepted silently — you only see findings when something genuinely doesn't match.
Standard TOTP (RFC 6238). Each user enables 2FA from their profile, scans a QR code with Google Authenticator, Authy, 1Password, or any compatible app, and confirms with a 6-digit code. Eight one-time recovery codes are generated during setup. Site administrators can require 2FA for all admin accounts in Settings.
By default, Malroot only contacts the official WordPress.org checksum APIs to verify your core and plugin files. Everything else is opt-in: IP geolocation is OFF until you enable it, and Slack alerts only fire if you configure a webhook. No site content, credentials, or scan results are sent to any third party. See the "External services" section below for full details.
Malroot does not generate a scannable QR code, because doing so would mean sending your secret key to an outside image service. Instead it shows the setup key as text, which you type into your authenticator app using its "Enter a setup key" option. Nothing about your 2FA secret ever leaves your server.
Single-site only in v1.0. Multisite support is on the roadmap.
wp_delete_file(); restore writes them back via the WordPress filesystem API.wp_get_upload_dir() / wp_upload_dir() for the uploads location instead of a hardcoded WP_CONTENT_DIR/uploads fallback..sql schema/template files bundled inside a plugin or theme (e.g. LiteSpeed Cache's data_structure files) are no longer flagged as public database dumps. PHP files inside recognised plugin-managed uploads folders (Sucuri, WP-Staging, UpdraftPlus, BackWPup) are now listed as low-priority "review" items rather than critical.wp_feed, newsfood, and duplicate wppanel accounts) — accounts that bypass every normal WordPress creation hook and that a login-name blocklist can never keep up with. Unapproved admins are demoted and signed out automatically, and the last approved administrator is never removed.malroot-ir-* class names while the stylesheet defined mr-ir-*).mailchimp-for-woocommerce/ namespace to the known-safe allowlist (fixes a false-positive RT-001 critical on the Mailchimp for WooCommerce plugin's sync routes).wp_feed, newsfood, wppanel) used by the real-time and login-security blocklists as a secondary layer.WriteFile.ABSPATHDetected warnings in the quarantine module. These writes intentionally target a file at its real webroot location — neutralising a malware file in place, and restoring a quarantined file to its original path — so they cannot use wp_upload_dir(). Each is now documented with a sniff-specific phpcs:ignore and a justification.SlowDBQuery (meta_key/meta_value) warnings in the incident-response and quarantine modules. None is a slow WP_Query meta lookup — one is a plain report-array key, and the database operations are INSERT/DELETE on the already-indexed meta_key column — so each is documented with a sniff-specific phpcs:ignore and a justification.<style> and <script> blocks on the 2FA login and setup screens with wp_register_style / wp_register_script and wp_add_inline_style / wp_add_inline_script.wp_upload_dir()['basedir'] . '/malroot-security/quarantine' instead of a hardcoded WP_CONTENT_DIR path.system-control plugin and reports it so the administrator can deactivate it manually from the Plugins screen.wp_verify_nonce() calls now run their input through sanitize_text_field( wp_unslash() ) for defence-in-depth (the function is pluggable).$_SERVER array values are sanitised before being passed to explode().