Worth The Read Security & Risk Analysis

wordpress.org/plugins/worth-the-read

An adjustable progress meter showing how much of the post/page the user has scrolled through, and a read time commitment label near the post titles.

4K active installs v1.14.3 PHP + WP 3.8+ Updated Dec 3, 2024
lengthprogressreadingreading-timescroll
92
A · Safe
CVEs total1
Unpatched0
Last CVEDec 16, 2022
Safety Verdict

Is Worth The Read Safe to Use in 2026?

Generally Safe

Score 92/100

Worth The Read has a strong security track record. Known vulnerabilities have been patched promptly.

1 known CVELast CVE: Dec 16, 2022Updated 1yr ago
Risk Assessment

The "worth-the-read" plugin v1.14.3 presents a mixed security posture. On the positive side, the plugin demonstrates good practices in its handling of SQL queries, exclusively using prepared statements, and a high percentage of output escaping (87%). It also includes a healthy number of nonce checks (19) and capability checks (3), indicating some level of security awareness in its development. However, there are notable concerns, particularly regarding its attack surface. With 8 AJAX handlers, 3 of which lack authentication checks, there is a clear pathway for unauthorized actions if these handlers are exploitable.

The taint analysis reveals 8 flows with unsanitized paths, although thankfully none reached critical or high severity in the static analysis. This suggests a potential for vulnerabilities that might not have been caught by this specific analysis or could be exploited in conjunction with other factors. The vulnerability history shows a single medium severity CVE, which is currently patched. The common vulnerability type listed as "Missing Authorization" in its history aligns with the static analysis findings of unprotected AJAX handlers, suggesting a recurring theme in past development or potential future risks.

In conclusion, while "worth-the-read" v1.14.3 has strengths in its data handling (SQL prepared statements, output escaping), the presence of unprotected AJAX endpoints and unsanitized paths in taint flows are significant weaknesses. The past "Missing Authorization" vulnerability further reinforces the need for thorough auditing of its entry points. The plugin is not inherently insecure but requires careful attention to its authentication and sanitization mechanisms, especially for its AJAX functionalities.

Key Concerns

  • AJAX handlers without auth checks
  • Flows with unsanitized paths
  • Medium severity vulnerability in history
  • Bundled library (Select2) potentially outdated
Vulnerabilities
1

Worth The Read Security Vulnerabilities

CVEs by Year

1 CVE in 2022
2022
Patched Has unpatched

Severity Breakdown

Medium
1

1 total CVE

Appsero <= 1.2.1 - Missing Authorization

Dec 16, 2022 Patched in 1.14.1 (699d)
Code Analysis
Analyzed Mar 16, 2026

Worth The Read Code Analysis

Dangerous Functions
0
Raw SQL Queries
0
4 prepared
Unescaped Output
270
1873 escaped
Nonce Checks
19
Capability Checks
3
File Operations
27
External Requests
7
Bundled Libraries
1

Bundled Libraries

Select2

SQL Query Safety

100% prepared4 total queries

Output Escaping

87% escaped2143 total outputs
Data Flows
8 unsanitized

Data Flow Analysis

11 flows8 with unsanitized paths
save (options\inc\classes\class-redux-ajax-save.php:34)
Source (user input) Sink (dangerous op) Sanitizer Transform Unsanitized Sanitized
Attack Surface
3 unprotected

Worth The Read Attack Surface

Entry Points17
Unprotected3

AJAX Handlers 8

authwp_ajax_redux_hide_admin_noticeoptions\inc\classes\class-redux-admin-notices.php:41
authwp_ajax_redux_update_google_fontsoptions\inc\classes\class-redux-ajax-typography.php:26
authwp_ajax_redux_activationoptions\inc\classes\class-redux-connection-banner.php:89
authwp_ajax_redux_submit_support_dataoptions\inc\classes\class-redux-health.php:26
authwp_ajax_redux_custom_fontsoptions\inc\extensions\custom_fonts\class-redux-extension-custom-fonts.php:106
authwp_ajax_redux_custom_font_timeroptions\inc\extensions\custom_fonts\class-redux-extension-custom-fonts.php:107
authwp_ajax_redux_get_iconsoptions\inc\extensions\icon_select\class-redux-extension-icon-select.php:48
authwp_ajax_redux_delete_widget_areaoptions\inc\extensions\widget_areas\class-redux-extension-widget-areas.php:52

Shortcodes 9

[bloginfo] options\inc\extensions\shortcodes\class-redux-shortcodes.php:69
[redux_bloginfo] options\inc\extensions\shortcodes\class-redux-shortcodes.php:71
[themeinfo] options\inc\extensions\shortcodes\class-redux-shortcodes.php:75
[redux_themeinfo] options\inc\extensions\shortcodes\class-redux-shortcodes.php:77
[date] options\inc\extensions\shortcodes\class-redux-shortcodes.php:81
[redux_date] options\inc\extensions\shortcodes\class-redux-shortcodes.php:83
[social_profiles] options\inc\extensions\social_profiles\social_profiles\inc\class-redux-social-profiles-shortcode.php:43
[wtr-end] worth-the-read.php:331
[wtr-time] worth-the-read.php:654
WordPress Hooks 106
actionplugins_loadedoptions\class-redux-core.php:152
actionadmin_initoptions\class-redux-core.php:278
filterdebug_informationoptions\class-redux-core.php:280
actionadmin_noticesoptions\inc\classes\class-redux-admin-notices.php:42
actionadmin_initoptions\inc\classes\class-redux-admin-notices.php:43
actionafter_setup_themeoptions\inc\classes\class-redux-api.php:122
actioninitoptions\inc\classes\class-redux-api.php:123
actionswitch_themeoptions\inc\classes\class-redux-api.php:124
actionplugins_loadedoptions\inc\classes\class-redux-api.php:179
actionReduxFrameworkPlugin_admin_noticeoptions\inc\classes\class-redux-api.php:1751
actionredux_framework_plugin_admin_noticeoptions\inc\classes\class-redux-api.php:1752
actioncurrent_screenoptions\inc\classes\class-redux-connection-banner.php:90
actionadmin_headoptions\inc\classes\class-redux-connection-banner.php:286
actionadmin_noticesoptions\inc\classes\class-redux-connection-banner.php:293
actionnetwork_admin_noticesoptions\inc\classes\class-redux-connection-banner.php:294
actionadmin_headoptions\inc\classes\class-redux-connection-banner.php:295
filteradmin_body_classoptions\inc\classes\class-redux-connection-banner.php:296
actionadmin_enqueue_scriptsoptions\inc\classes\class-redux-enqueue.php:57
actionwp_enqueue_scriptsoptions\inc\classes\class-redux-enqueue.php:60
filterredux/fieldsoptions\inc\classes\class-redux-extension-abstract.php:176
actionenqueue_block_editor_assetsoptions\inc\classes\class-redux-functions-ex.php:72
actionwp_enqueue_scriptsoptions\inc\classes\class-redux-functions-ex.php:73
actionwp_headoptions\inc\classes\class-redux-functions-ex.php:252
actioninitoptions\inc\classes\class-redux-i18n.php:26
actionredux/constructoptions\inc\classes\class-redux-instances.php:74
actionadmin_initoptions\inc\classes\class-redux-options-constructor.php:55
actionwp_headoptions\inc\classes\class-redux-output.php:30
actionwp_enqueue_scriptsoptions\inc\classes\class-redux-output.php:31
actionlogin_headoptions\inc\classes\class-redux-output.php:36
actionlogin_enqueue_scriptsoptions\inc\classes\class-redux-output.php:37
actionadmin_headoptions\inc\classes\class-redux-output.php:42
actionadmin_enqueue_scriptsoptions\inc\classes\class-redux-output.php:43
filterstyle_loader_tagoptions\inc\classes\class-redux-output.php:203
filterwp_resource_hintsoptions\inc\classes\class-redux-output.php:204
actionadmin_menuoptions\inc\classes\class-redux-page-render.php:47
actionnetwork_admin_menuoptions\inc\classes\class-redux-page-render.php:51
actionadmin_headoptions\inc\classes\class-redux-page-render.php:140
filteradmin_footer_textoptions\inc\classes\class-redux-page-render.php:143
filterdeprecated_file_trigger_erroroptions\inc\classes\class-redux-panel.php:327
actionrest_api_initoptions\inc\classes\class-redux-rest-api-builder.php:46
actioncustomize_registeroptions\inc\extensions\customizer\class-redux-extension-customizer.php:141
actionwp_headoptions\inc\extensions\customizer\class-redux-extension-customizer.php:142
actioncustomize_save_afteroptions\inc\extensions\customizer\class-redux-extension-customizer.php:144
actioncustomize_controls_print_scriptsoptions\inc\extensions\customizer\class-redux-extension-customizer.php:147
actioncustomize_controls_initoptions\inc\extensions\customizer\class-redux-extension-customizer.php:148
actionwp_enqueue_stylesoptions\inc\extensions\customizer\class-redux-extension-customizer.php:149
actionredux/extension/customizer/control_initoptions\inc\extensions\customizer\class-redux-extension-customizer.php:151
actioncustomize_controls_print_stylesoptions\inc\extensions\customizer\class-redux-extension-customizer.php:154
filterupload_mimesoptions\inc\extensions\custom_fonts\class-redux-extension-custom-fonts.php:119
actionwp_headoptions\inc\extensions\custom_fonts\class-redux-extension-custom-fonts.php:120
filtertiny_mce_before_initoptions\inc\extensions\custom_fonts\class-redux-extension-custom-fonts.php:121
actionadmin_footeroptions\inc\extensions\icon_select\icon_select\class-redux-icon-select.php:383
actioncustomize_controls_print_footer_scriptsoptions\inc\extensions\icon_select\icon_select\class-redux-icon-select.php:384
filterupload_mimesoptions\inc\extensions\import_export\class-redux-extension-import-export.php:62
actionsave_postoptions\inc\extensions\metaboxes\class-redux-extension-metaboxes.php:219
actionpre_post_updateoptions\inc\extensions\metaboxes\class-redux-extension-metaboxes.php:220
actionadmin_noticesoptions\inc\extensions\metaboxes\class-redux-extension-metaboxes.php:221
actionadmin_enqueue_scriptsoptions\inc\extensions\metaboxes\class-redux-extension-metaboxes.php:222
actionthe_postoptions\inc\extensions\metaboxes\class-redux-extension-metaboxes.php:225
actionloop_endoptions\inc\extensions\metaboxes\class-redux-extension-metaboxes.php:226
actioninitoptions\inc\extensions\metaboxes\class-redux-metaboxes-api.php:89
actionadmin_enqueue_scriptsoptions\inc\extensions\metaboxes\class-redux-metaboxes-api.php:129
actionadmin_enqueue_scriptsoptions\inc\extensions\search\class-redux-extension-search.php:53
actionwp_enqueue_scriptsoptions\inc\extensions\social_profiles\class-redux-extension-social-profiles.php:111
filterredux/metaboxes/save/before_validateoptions\inc\extensions\social_profiles\class-redux-extension-social-profiles.php:115
actionwidgets_initoptions\inc\extensions\social_profiles\social_profiles\inc\class-redux-social-profiles-widget.php:53
actionadmin_noticesoptions\inc\extensions\users\class-redux-extension-users.php:181
actionadmin_enqueue_scriptsoptions\inc\extensions\users\class-redux-extension-users.php:182
actionpersonal_options_updateoptions\inc\extensions\users\class-redux-extension-users.php:187
actionedit_user_profile_updateoptions\inc\extensions\users\class-redux-extension-users.php:188
actionshow_user_profileoptions\inc\extensions\users\class-redux-extension-users.php:367
actionedit_user_profileoptions\inc\extensions\users\class-redux-extension-users.php:368
actionuser_new_formoptions\inc\extensions\users\class-redux-extension-users.php:369
actioncreate_termoptions\inc\extensions\users\class-redux-extension-users.php:1249
actioninitoptions\inc\extensions\users\class-redux-users-api.php:77
actioninitoptions\inc\extensions\widget_areas\class-redux-widget-areas.php:72
actionadmin_print_scriptsoptions\inc\extensions\widget_areas\class-redux-widget-areas.php:75
actionload-widgets.phpoptions\inc\extensions\widget_areas\class-redux-widget-areas.php:76
actionload-widgets.phpoptions\inc\extensions\widget_areas\class-redux-widget-areas.php:77
actionadmin_enqueue_scriptsoptions\inc\themecheck\class-redux-themecheck.php:71
actionadmin_enqueue_scriptsoptions\inc\themecheck\class-redux-themecheck.php:72
actionthemecheck_checks_loadedoptions\inc\themecheck\class-redux-themecheck.php:74
actionthemecheck_checks_loadedoptions\inc\themecheck\class-redux-themecheck.php:75
actioninitoptions\inc\validation\unique_slug\class-redux-validation-unique-slug.php:80
actioninitoptions\inc\welcome\class-redux-welcome.php:49
actionadmin_menuoptions\inc\welcome\class-redux-welcome.php:61
filteradmin_footer_textoptions\inc\welcome\class-redux-welcome.php:67
actionadmin_headoptions\inc\welcome\class-redux-welcome.php:68
actionadd_meta_boxesworth-the-read.php:55
actionsave_postworth-the-read.php:114
actionwp_enqueue_scriptsworth-the-read.php:118
filterthe_contentworth-the-read.php:136
actionwp_body_openworth-the-read.php:233
actionwp_footerworth-the-read.php:289
actioncomment_form_afterworth-the-read.php:335
actioncomment_form_closedworth-the-read.php:336
actionwp_footerworth-the-read.php:351
actionloop_startworth-the-read.php:382
filterthe_titleworth-the-read.php:386
filterthe_contentworth-the-read.php:445
filterget_the_excerptworth-the-read.php:488
actionwp_headworth-the-read.php:573
filterbody_classworth-the-read.php:581
actionplugins_loadedworth-the-read.php:614
actionwp_footerworth-the-read.php:626
actionadmin_menuworth-the-read.php:657
Maintenance & Trust

Worth The Read Maintenance & Trust

Maintenance Signals

WordPress version tested6.7.5
Last updatedDec 3, 2024
PHP min version
Downloads114K

Community Trust

Rating86/100
Number of ratings27
Active installs4K
Developer Profile

Worth The Read Developer Profile

brianmcculloh

2 plugins · 4K total installs

71
trust score
Avg Security Score
89/100
Avg Patch Time
699 days
View full developer profile
Detection Fingerprints

How We Detect Worth The Read

Patterns used to identify this plugin on WordPress sites during automated security audits and web crawling.

Asset Fingerprints

Asset Paths
/wp-content/plugins/worth-the-read/js/wtr.js/wp-content/plugins/worth-the-read/css/wtr.css
Script Paths
/wp-content/plugins/worth-the-read/js/wtr.js
Version Parameters
worth-the-read/wtr.js?ver=worth-the-read/wtr.css?ver=

HTML / DOM Fingerprints

CSS Classes
wtr-js-display-progress
HTML Comments
<!-- wtr_wrap_content() called -->
Data Attributes
data-placementdata-placement-offsetdata-content-offsetdata-placement-touchdata-placement-offset-touchdata-width+14 more
JS Globals
wtr_debug
FAQ

Frequently Asked Questions about Worth The Read