WP Manifestindependent plugin directory
manifest / seo / classicpress-seo

Classic SEO WP Registry grade D. High-severity findings · 5 findingsWP RegistryHigh-severity findings · 5 findingsOpen the reportD #2 in SEO & Metadata

Classic SEO is the first SEO plugin built specifically to work with ClassicPress. A fork of Rank Math, the plugin contains many essential SEO tools to help optimize your website.

★ 37stars
3krelease downloads
≈180active sites
6composer installs
v2.3.0latest · 2 years ago

Install

Download classicpress-seo.zip From the v2.3.0 release on GitHub, Jul 4, 2024

Upload it under Plugins → Add New Plugin → Upload Plugin, then activate.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/classicpress/classicpress-seo/releases/download/v2.3.0/classicpress-seo.zip

On Packagist as classicpress-plugins/classicpress-seo:

composer require classicpress-plugins/classicpress-seo
Updates itself. It ships its own updater (Update URI header), so new versions appear under Dashboard → Updates.

Classic SEO Plugin

Classic SEO is the first SEO plugin built specifically to work with ClassicPress. The plugin contains many essential SEO tools to help optimize your website.

Latest release: See Change log


Installation

  1. Head over to the Releases section of this GitHub repository.
  2. Expand the "Assets" dropdown by the latest release and download the classicpress-seo.zip file.
  3. Go to the "Plugins > Add New" section of your site's dashboard and upload the zip file there using the "Upload Plugin" button.

Minimum Requirements

  • ClassicPress 1.1.0
  • PHP 7.4

Credits

This is a fork of Rank Math.

Key features of Classic SEO

  • Focus Keyword and Content Analysis
  • 404 Monitor
  • Support for ACF
  • Link Counter
  • Social Previews
  • Local SEO / Knowledge Graph
  • Redirections
  • Rich Snippets
  • XML Sitemap
  • Support for Classic Commerce
  • Social meta: Facebook, Twitter, Google Places, LinkedIn, Instagram, YouTube, Pinterest
  • Imports for Rank Math, Yoast, All In One SEO and The SEO Framework
  • Role Manager
  • and more...

Support

If you need support for Classic SEO or find a bug, you have threee choices:

Reporting Security Issues

Disclose security issues to our team (security@classicpress.net)

Changelog

Change log for this project

License

This project is licensed under the GNU General Public License (GPL) v2 or later - see the LICENSE file for details.

Releases

Newest 25 of 35 recorded releases. Each count is every asset in that release; expand a row for the breakdown.

Tag
Published
Assets
Downloads
v2.3.0 latest
Jul 4, 2024 2 years ago
classicpress-seo.zip
537
Jun 20, 2024 2 years ago
classicpress-seo.zip
41
Apr 15, 2024 2 years ago
classicpress-seo.zip
85
Sep 25, 2023 3 years ago
classicpress-seo.zip
234
Jul 13, 2023 3 years ago
classicpress-seo.zip
24
Jul 6, 2023 3 years ago
classicpress-seo.zip
30
May 29, 2023 3 years ago
classicpress-seo.zip
184
May 24, 2023 3 years ago
classicpress-seo.zip
20
Feb 7, 2023 3 years ago
classicpress-seo.zip
207
Jan 25, 2023 3 years ago
classicpress-seo.zip
71
Jan 24, 2023 3 years ago
classicpress-seo.zip
30
Sep 29, 2020 6 years ago
classicpress-seo.zip
722
Sep 29, 2020 6 years ago
tag only
—
Aug 30, 2020 6 years ago
classicpress-seo.zip
90
Aug 2, 2020 6 years ago
classicpress-seo.zip
78
May 24, 2020 6 years ago
classicpress-seo.zip
66
Apr 3, 2020 6 years ago
classicpress-seo.zip
99
Feb 14, 2020 6 years ago
classicpress-seo.zip
38
Feb 8, 2020 6 years ago
classicpress-seo.zip
44
Jan 17, 2020 6 years ago
classicpress-seo.zip
35
Dec 28, 2019 6 years ago
classicpress-seo.zip
15
Dec 21, 2019 6 years ago
classicpress-seo.zip
18
Dec 20, 2019 6 years ago
classicpress-seo.zip
14
Dec 20, 2019 6 years ago
classicpress-seo.zip
12
Dec 18, 2019 6 years ago
classicpress-seo.zip
15
All releases on GitHub →

Active-site estimate ≈180 comes from the median of recent superseded releases. Method.

D grade

Security

Classic SEO 2.3.0 · audited by WP Registry

High-severity findings.

4 high 1 medium
Audited release
2.3.0
Findings
5
Worst severity
high
Content hash
4d1b1b6b0facc1dc103c5827…

Findings

  • high Subscriber+ arbitrary plugin deactivation via nonce-only AJAX

    missing_capability

    wp_ajax_cpseo_deactivate_plugins verifies only nonce `cpseo-ajax-nonce` and never checks activate_plugins / manage_options. The same nonce is added to the classicSEO JS object for every logged-in user (including Subscriber) on both frontend and admin footers. A subscriber who copies classicSEO.security can POST plugin=<basename> and deactivate any installed plugin (security, firewall, this plugin, etc.), or plugin=all to deactivate competing SEO plugins via Detector::deactivate_all(). WordPress deactivate_plugins() does not re-check capabilities. Observable: the target plugin disappears from active_plugins and its admin UI/front hooks stop running.

    includes/admin/class-admin.php:328-338

    Recommendation

    Require current_user_can('activate_plugins') (and a dedicated nonce) before calling deactivate_plugins(). Stop publishing cpseo-ajax-nonce to roles that cannot use it.

  • high Subscriber+ can create, restore, and delete SEO backups and wipe competitor plugin data

    missing_capability

    AJAX actions cpseo_create_backup, cpseo_delete_backup, cpseo_restore_backup, and cpseo_clean_plugin only call verify_nonce('cpseo-ajax-nonce'). import_plugin is the only sibling that also calls has_cap_ajax('general'). Because the nonce is in classicSEO.security for all logged-in users, a Subscriber can: (1) snapshot all SEO options/role-manager caps/redirections into cpseo_backups; (2) restore any snapshot via do_import_data(), which update_option's cpseo_modules, cpseo-options-general, cpseo-options-titles, cpseo-options-sitemap, runs Helper::set_capabilities() on role-manager data, and inserts redirection rows; (3) delete backups; (4) run Plugin_Importer::run_cleanup() for yoast/aioseo/rankmath/seo-framework, which DROP TABLE's plugin tables and deletes matching options/postmeta/usermeta/termmeta. Restore is a site-wide settings overwrite; cleanup is destructive data loss of other SEO plugins.

    includes/admin/class-import-export.php:97-181

    Recommendation

    Gate create/restore/delete backup and clean_plugin with has_cap_ajax('general') (or manage_options), matching import_plugin. Do not localize the AJAX nonce for users without that cap.

  • high Author+ can create, update, or delete arbitrary site-wide redirects when saving a post

    missing_capability

    When the Redirections module is enabled, Metabox::save_advanced_meta runs on every SEO metabox save (cpseo/metabox/process_fields) for anyone who can edit a post/term and sees the metabox (authors have cpseo_onpage_general by default). It reads cpseo_redirection_url_to, cpseo_redirection_sources, cpseo_redirection_header_code, and cpseo_redirection_id directly from CMB2 data_to_save (the full POST). There is no Helper::has_cap('redirections') check and no restriction that the source pattern equals the current post permalink. An author can hidden-field POST a source of '' (homepage) or any path and a destination of https://attacker.example and DB::add() stores an active 301. Frontend Redirector then wp_redirect()s matching public traffic. The same handler deletes any redirection ID if url_to is empty. This bypasses the Role Manager cap that is supposed to protect the Redirections screen.

    includes/modules/redirections/class-metabox.php:97-134

    Recommendation

    Require Helper::has_cap('redirections') inside save_advanced_meta. Force the source pattern to the current object's permalink (ignore client-supplied cpseo_redirection_sources) and ignore cpseo_redirection_id unless it is already attached to that object.

  • high Author+ can overwrite any post title via bulk-edit AJAX (no edit_post check)

    missing_capability

    wp_ajax_cpseo_bulk_edit_columns checks nonce plus has_cap_ajax('onpage_general') (true for Author/Editor by default) then iterates attacker-supplied rows[post_id]. For column image_title it calls wp_update_post({ID, post_title}) with no current_user_can('edit_post', $post_id) and no post-type restriction. wp_update_post does not check capabilities itself. An author can therefore rename any page, product, or another author's post (including the homepage) by POSTing rows[<id>][image_title]. Other columns write unsanitized post meta (cpseo__title / _wp_attachment_image_alt) for arbitrary IDs. The handler is reachable with the globally localized cpseo-ajax-nonce; the post-list script is only extra UX.

    includes/admin/class-post-columns.php:59-119

    Recommendation

    For each post_id, require current_user_can('edit_post', $post_id). Restrict image_title/image_alt to the attachment post type. Sanitize values before update_post_meta/wp_update_post.

  • medium Author+ can mark any post, term, or user noindex/nofollow without ownership checks

    missing_capability

    wp_ajax_cpseo_mark_page_as requires onpage_general (Author+) and then update_meta($object_type, $object_id, 'cpseo_robots'|'cpseo_pillar_content', ...) using client-supplied objectID/objectType/what with no map to a post the user can edit. An author can noindex the homepage, another author's posts, or author archives, removing them from the index/sitemap consumers of cpseo_robots. Same global nonce as the other AJAX actions.

    includes/admin/class-admin-bar-menu.php:56-87

    Recommendation

    Resolve the object and require the matching edit capability (edit_post / manage_category / edit_user) for that ID before updating robots or pillar-content meta.

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.