Linux 软件免费装
Banner图

CMS ADMINS Security Check Report

开发者 contexlabs
更新时间 2026年9月25日 03:18
捐献地址: 去捐款
PHP版本: 7.4 及以上
WordPress版本: 7.1
版权: GPLv2 or later
版权网址: 版权信息

标签

security site-health scanner audit hardening

下载

2.3.2 2.4.0 2.2.1 2.2.2 2.3.0 2.3.1

详情介绍:

Security Check Report looks at 61 aspects of a WordPress installation and turns the findings into a graded report. It changes no setting, no file and no account. It stores its own results in the database, and it writes one temporary file in the uploads folder that is deleted again in the same request. The report opens with the five things worth doing first, not with a table of 61 rows. Every finding says what was found, why it matters and what to do about it. From the second run onwards the page no longer opens on the start button but on an overview: the grade, a line saying where the site stood on the first run and where it stands today, one bar per recorded run, five tasks to work through, what is still open, and what has been resolved and when. Each task has a button that runs that one check again and answers within seconds, so a fix is confirmed while you are still on the screen instead of at the next full pass. A single re-check writes no point into the history, and the page says as much, because a grade pieced together from several passes is not a grade measured in one. What you get What it checks Core, plugins and themes. WordPress version, PHP version against the published end-of-life dates, automatic core updates, core file integrity against the official checksums, files in the core directories that are not part of WordPress, pending plugin and theme updates, unused plugins and themes, plugins that look abandoned, plugins whose listing was closed, plugins whose author changed, must-use plugins and drop-ins, other WordPress installations sitting next to this one. Configuration. Debug mode, debug log exposure, the theme and plugin editor, installing code from the dashboard, authentication keys and salts, table prefix, database user privileges, whether the scheduler actually runs, autoloaded options size, injected content in the options table, backups, login protection, password policy. Files and permissions. Permissions on wp-config.php, the uploads folder and the core directories, world-writable paths, executable files among the media, whether the server runs PHP from the uploads folder, configuration and backup files that the server hands out, readable .git, .svn and .hg folders, database dumps in the web root, leftovers from interrupted updates, directory listing. Accounts and access. Guessable passwords, predictable administrator names, how many accounts hold administrator rights and which have gone dormant, roles below administrator holding capabilities they should not have, open registration and the role it hands out, two-factor coverage per administrator, the application password inventory including when each was last used and from where. Network and transport. HTTPS and the redirect from http, TLS certificate expiry and negotiated protocol, the security headers and their quality rather than their mere presence, cookie attributes, CORS, exposed software versions, legacy discovery tags, XML-RPC, user enumeration, REST routes that accept writes without checking permissions, and whether the client address can be faked through forwarded headers. Transparency and disclosure. Whether AI-generated content carries a machine-readable label and whether visitors are told when they are talking to an AI system, which Article 50 of the EU AI Act has asked for since 2 August 2026. The disclosure plugins in the directory are recognised by their folder and by the settings they write, so a plugin that was installed and never set up is not mistaken for an answer. A site that publishes no AI output has nothing to label, so this one only ever warns and barely moves the grade. What it is not Data and connections The plugin talks to api.wordpress.org and to your own site. Nothing else, and there is no telemetry. See the questions below for exactly which endpoints and what is stored locally. Who builds it CMS ADMINS maintains, hosts and secures WordPress and Drupal sites from Munich. This plugin is the checklist we run ourselves, packaged up. It is free, it stays free, and it works the same whether or not you ever talk to us.

安装:

  1. Install the plugin from the WordPress plugin directory, or upload the folder to /wp-content/plugins/security-check-report.
  2. Activate it on the Plugins screen.
  3. Open "Security Check" in the admin menu and start a run.
The plugin needs PHP 7.4 or newer and WordPress 7.0 or newer. Running the checks requires the manage_options capability, so on a normal site that means an administrator.

屏幕截图:

  • All checks, grouped by area and filterable by outcome, with one finding expanded
  • The built-in documentation for every check, with a search

升级注意事项:

2.4.0 The report becomes a checklist you can come back to, and a fact check over all sixty-one checks removed several findings that fired on correctly configured sites. Worth updating for either reason. 2.3.1 The screen now walks you through three steps and the result is stated in plain language, not just as a letter grade. 2.3.0 Fixes a cross-site scripting path in the report and several checks that reported healthy sites as insecure. Adds 25 checks, a priority list, a comparison with the previous run and a WP-CLI command. 2.2.2 Broader PHP support, from 7.4 through 8.5, plus an automated test suite behind every release. 2.2.1 First release on WordPress.org. The Spamhaus test is gone; nothing is sent anywhere except the WordPress.org API.

常见问题:

Does the plugin change anything on my site?

No. Every check reads state and reports on it. There is one exception, and it is deliberate. To find out whether your server would execute a PHP file dropped into the uploads folder, the plugin has to try. It writes one file with a random name, requests it once over HTTP and deletes it in the same request. A shutdown handler removes the file even if PHP dies in between, and anything left behind by an earlier interrupted run is cleaned up before the next one starts.

Does it send data anywhere?

Only to api.wordpress.org, to the same endpoints WordPress itself uses for its update checks:

WordPress.org privacy policy and terms of service. The remaining requests go to your own site, because several checks can only be answered from the outside: whether a file is served, whether a header is sent, whether a directory is listed. There is no telemetry and no reporting back to the plugin author. One of those requests to your own site does not use the WordPress HTTP API. The certificate check opens a plain TLS connection to your own host name on port 443 to read the expiry date, because the HTTP API does not hand the certificate back. The target is still your own site and nothing leaves it, but WP_HTTP_BLOCK_EXTERNAL and the pre_http_request and http_request_args filters do not apply to that one connection.

What does the plugin store?

A handful of options in your database, all removed when you delete the plugin:

  • the last run and the one before it, so the report can show what changed
  • the history of the last 24 runs, each one holding the date, the grade, the risk score and a single character per check, which is what the progress display reads
  • which findings you have muted, together with a fingerprint of what they said
  • a baseline recorded on the first run, holding plugin authors, role definitions and the list of must-use plugins and drop-ins, so later runs can spot changes
  • the number of failing checks from the last run, so the count on the menu entry does not have to load a whole run on every admin page
  • the moment you agreed to the run, so you are not asked again on every visit
Two entries go into user meta. One is a login timestamp per account, because WordPress keeps no login history of its own and the administrator check would otherwise have nothing to say about dormant accounts. The other records that somebody switched off the reminder notice, which is a decision per person rather than per site. Both are deleted on uninstall.

Is this a malware scanner or a firewall?

Neither. It finds configuration weaknesses and exposure, which is what most WordPress sites are actually taken over through. It does not block traffic and it does not clean an infected site. It will notice several things that point at a compromise: core files that differ from the official release, executable files in the uploads folder, must-use plugins or drop-ins that appeared out of nowhere, roles that gained administrator capabilities, injected scripts in the options table. If any of those turn up, treat it as a starting point for an investigation, not as a verdict.

What do the grades mean?

  • A, excellent: nothing of substance outstanding
  • B, good: minor improvements available
  • C, moderate: several things worth addressing
  • D, poor: significant weaknesses, act soon
  • F, critical: act now

How is the grade calculated?

Every check carries an urgency, and the urgency sets how much a finding weighs:

  • Critical, weight 3.0: authentication, code execution, exposed secrets
  • High, weight 2.0: updates, transport security, important configuration
  • Medium, weight 1.5: headers, permissions, policies
  • Low, weight 1.0: fingerprinting and good practice
The score is the weighted risk as a percentage of the worst possible outcome. Checks that could not be determined are left out of both sides of that calculation, so a blocked outbound request never moves the grade in either direction. A failing critical check pulls the result down to at least a D, which is what stops one serious problem from being averaged away. A few checks are informational and carry no weight at all.

Why does a check say "Not determined"?

Because it could not get an answer, usually a blocked outbound request or a file it is not allowed to read. That is deliberately not treated as a finding. An unreachable endpoint says nothing about your site, and reporting it as a problem would teach you to ignore the report.

A finding does not apply to my setup. What now?

Mute it. The plugin hides the finding and stores a fingerprint of what it was reporting. As soon as the content changes, for instance one more affected file, it comes back on its own. That is the difference between accepting a known state and going blind to it, and it is why muting is offered instead of a permanent dismissal by default.

How often should I run it?

Monthly is a reasonable baseline, plus a run after any larger change: a migration, a new plugin, a server move. Once the last full run is more than 30 days old, a notice in the dashboard says so. You can switch that notice off for good, and it is the only reminder the plugin sends anywhere.

What happens when I re-check a single task?

That one check runs again, its result replaces the old one in the stored run, and the grade is recalculated from what is then stored. It takes a few seconds, so you can fix something and see the result without sitting through 61 checks. The history is left alone, because one check is not a run. As long as the stored run carries results from more than one pass, the page says how many checks were re-checked on their own and when the last full pass was, so the grade is never presented as something it is not.

How much history is kept?

The last 24 runs. When a 25th arrives, the second oldest point is dropped instead of the oldest, so the first run stays and the line about where the site started remains true. One point holds the date, the grade, the risk score and one character per check, which comes to a few kilobytes for the whole history. If you already used an earlier version, the two runs it had stored become the first two points, so the display is not empty after the update.

Can I run it from the command line?

Yes, and it produces the same grade as the screen because the scoring happens in PHP either way. wp security-check run for a table, wp security-check run --format=json for the full result, wp security-check run --failed-only for just what needs attention. A command line run reports and stores nothing. The history, the checklist and the count on the menu entry follow the runs you start on the screen.

Does it work on multisite?

Yes. It runs per site: anyone with manage_options on a site can run it there and sees that site's accounts, plugins, themes and options. Several things work differently on a network, and the checks account for it. Registration is a network setting, so the sign-up check reads that instead of the per-site option. Network administrators hold every capability regardless of their role on the current site, so the account, password and two-factor checks include them. The table prefix check looks at the base prefix rather than the per-site one. The checks that look at files, permissions and server configuration necessarily report the same thing on every site in the network, because they describe one installation. There is no network-wide overview screen. The history, the checklist and the reminder belong to a single site as well. Every site in the network keeps its own.

Can I add my own checks?

Yes. cascr_registry filters the list of checks, so you can add, remove or reweight one. cascr_test_result filters an individual result before it is scored. A check is a callable that returns one of the four outcomes built by CASCR_Result.

Which WordPress and PHP versions are supported?

WordPress 7.0 and newer, PHP 7.4 through 8.5. Every release is tested against WordPress 7.0 and the current version, on single site and on multisite, and linted on all seven PHP branches in between.

Who is behind this plugin, and where do I report a problem?

It is built and maintained by CMS ADMINS, a Munich agency that has been looking after WordPress and Drupal installations since 2012.

If a check reports something you believe is wrong, a GitHub issue with the finding text is the fastest way to get it fixed. False positives are treated as bugs.

更新日志:

Releases before 2.2.0 are listed in changelog.txt. 2.4.0 Added Changed Fixed Every check was read against the sources it cites: php.net, the WordPress handbook, core source, MDN, and the packages of the plugins it recognises. That turned up findings that fire on correct configurations, one that could not fire at all, and claims that stopped being true years ago. Explanations 2.3.2 Fixed 2.3.1 2.3.0 Rebuilt Added Fixed Changed 2.2.2 2.2.1 2.2.0