Language Switcher Security & Risk Analysis

wordpress.org/plugins/language-switcher

Add a Language Switcher to Menus, Post Types and Taxonomies.

1K active installs v3.8.8 PHP + WP 4.6+ Updated Sep 1, 2025
internationalisationinternationalizationlanguagelanguage-switcherlanguages
99
A · Safe
CVEs total1
Unpatched0
Last CVEOct 10, 2024
Safety Verdict

Is Language Switcher Safe to Use in 2026?

Generally Safe

Score 99/100

Language Switcher has a strong security track record. Known vulnerabilities have been patched promptly. It's a solid choice for most WordPress installations.

1 known CVELast CVE: Oct 10, 2024Updated 8mo ago
Risk Assessment

The "language-switcher" v3.8.8 plugin exhibits a mixed security posture. While it has a relatively small attack surface and a good percentage of properly escaped outputs, several critical areas raise concerns. The presence of an unprotected REST API route is a significant vulnerability, allowing unauthorized access and potential manipulation. Furthermore, the static analysis revealed that 100% of SQL queries are not using prepared statements, which is a high risk for SQL injection vulnerabilities, especially when coupled with user-provided input. The vulnerability history, though currently clear of unpatched CVEs, shows a past medium-severity Cross-site Scripting (XSS) vulnerability, indicating that proper input sanitization and output escaping have been areas of weakness in the past. This history, combined with the current lack of nonce and capability checks, suggests a potential for recurring issues if not addressed proactively. The plugin shows strengths in avoiding dangerous functions and file operations, but the unprotected entry points and raw SQL queries necessitate caution.

Key Concerns

  • Unprotected REST API route
  • Raw SQL queries without prepared statements
  • No nonce checks
  • No capability checks
  • Flows with unsanitized paths
Vulnerabilities
1 published

Language Switcher Security Vulnerabilities

CVEs by Year

1 CVE in 2024
2024
Patched Has unpatched

Severity Breakdown

Medium
1

1 total CVE

CVE-2024-9610medium · 6.1Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

Language Switcher <= 3.7.13 - Reflected Cross-Site Scripting

Oct 10, 2024 Patched in 3.8.0 (1d)
Version History

Language Switcher Release Timeline

v3.8.8Current
v3.8.7
v3.8.6
v3.8.1
v3.8.0
v3.7.141 CVE
v3.7.131 CVE
v3.7.121 CVE
v3.7.111 CVE
v3.7.101 CVE
v3.7.91 CVE
v3.7.81 CVE
v3.7.71 CVE
v3.7.61 CVE
v3.7.51 CVE
v3.7.41 CVE
v3.7.31 CVE
v3.7.21 CVE
v3.7.11 CVE
v3.6.21 CVE
Code Analysis
Analyzed Mar 16, 2026

Language Switcher Code Analysis

Dangerous Functions
0
Raw SQL Queries
1
0 prepared
Unescaped Output
11
46 escaped
Nonce Checks
0
Capability Checks
0
File Operations
0
External Requests
0
Bundled Libraries
0

SQL Query Safety

0% prepared1 total queries

Output Escaping

81% escaped57 total outputs
Data Flows · Security
2 unsanitized

Data Flow Analysis

2 flows2 with unsanitized paths
settings_page (includes\class-language-switcher-settings.php:433)
Source (user input) Sink (dangerous op) Sanitizer Transform Unsanitized Sanitized
Attack Surface
1 unprotected

Language Switcher Attack Surface

Entry Points2
Unprotected1

REST API Routes 1

GET/wp-json/lsw-languages/v1/(?P<type>[\w,]+)/(?P<id>[0-9]+)/includes\class-language-switcher.php:204

Shortcodes 1

[language-switcher] includes\class-language-switcher.php:187
WordPress Hooks 26
actioninitincludes\class-language-switcher-settings.php:46
actionadmin_initincludes\class-language-switcher-settings.php:49
actionadmin_menuincludes\class-language-switcher-settings.php:52
actionadmin_menuincludes\class-language-switcher-settings.php:53
actionwp_enqueue_scriptsincludes\class-language-switcher.php:147
actionwp_enqueue_scriptsincludes\class-language-switcher.php:148
actionadmin_enqueue_scriptsincludes\class-language-switcher.php:151
actionadmin_enqueue_scriptsincludes\class-language-switcher.php:152
filterlocaleincludes\class-language-switcher.php:160
actionadmin_initincludes\class-language-switcher.php:181
actioninitincludes\class-language-switcher.php:183
actionwidgets_initincludes\class-language-switcher.php:191
filterwp_nav_menu_objectsincludes\class-language-switcher.php:195
actionwp_headincludes\class-language-switcher.php:197
actionwp_headincludes\class-language-switcher.php:198
actionrest_api_initincludes\class-language-switcher.php:202
filterwpincludes\class-language-switcher.php:273
filterpre_get_postsincludes\class-language-switcher.php:281
filterget_terms_argsincludes\class-language-switcher.php:286
filterwp_get_nav_menu_itemsincludes\class-language-switcher.php:293
filtermonth_linkincludes\class-language-switcher.php:306
actionwp_footerincludes\class-language-switcher.php:310
actionadd_meta_boxesincludes\class-language-switcher.php:979
actionsave_postincludes\class-language-switcher.php:1006
filterpre_get_postsincludes\class-language-switcher.php:1008
filterget_terms_argsincludes\class-language-switcher.php:1028
Maintenance & Trust

Language Switcher Maintenance & Trust

Maintenance Signals

WordPress version tested6.8.5
Last updatedSep 1, 2025
PHP min version
Downloads71K

Community Trust

Rating80/100
Number of ratings7
Active installs1K
Developer Profile

Language Switcher Developer Profile

rafasashi

3 plugins · 1K total installs

83
trust score
Avg Security Score
75/100
Avg Patch Time
1 days
View full developer profile
Detection Fingerprints

How We Detect Language Switcher

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

Asset Fingerprints

Asset Paths
/wp-content/plugins/language-switcher/assets/css/settings.css/wp-content/plugins/language-switcher/assets/css/style.css/wp-content/plugins/language-switcher/assets/js/admin-api.js/wp-content/plugins/language-switcher/assets/js/language-switcher.js/wp-content/plugins/language-switcher/assets/js/settings.js/wp-content/plugins/language-switcher/assets/js/widget.js
Script Paths
/wp-content/plugins/language-switcher/assets/js/settings.js/wp-content/plugins/language-switcher/assets/js/admin-api.js/wp-content/plugins/language-switcher/assets/js/language-switcher.js
Version Parameters
language-switcher/assets/css/settings.css?ver=language-switcher/assets/css/style.css?ver=language-switcher/assets/js/admin-api.js?ver=language-switcher/assets/js/language-switcher.js?ver=language-switcher/assets/js/settings.js?ver=language-switcher/assets/js/widget.js?ver=

HTML / DOM Fingerprints

CSS Classes
lsw-widget-wraplsw_wp_nav_menu_widgetlsw_post_type_widgetlsw_language_switcher_widgetlsw_select_wrap
HTML Comments
<!-- WPML Integration --><!-- qTranslate Integration --><!-- Polylang Integration --><!-- WPML Language Switcher Integration -->+1 more
Data Attributes
data-lsw-post-iddata-lsw-tax-iddata-lsw-term-iddata-lsw-page-iddata-lsw-custom-url
JS Globals
languageSwitcherSettingslanguageSwitcherAdminApiLanguageSwitcherWidget
REST Endpoints
/wp-json/language-switcher/v1/settings/wp-json/language-switcher/v1/languages
Shortcode Output
[language_switcher][ls][language-switcher-widget]
FAQ

Frequently Asked Questions about Language Switcher