diff --git a/CHANGELOG.md b/CHANGELOG.md index cfc7f76..fd5ae00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Versioning: [Semantic Versioning](https://semver.org/) ## [0.2.3] — 2026-06-15 UI-editable provider API key: encrypted at rest, write-only, wp-config precedence. +Output-escaping hardening in key manager renderer (`esc_url`/`esc_attr`/literal-conditional on all echoed values). ### Added diff --git a/includes/core/class-prv-key-manager-renderer.php b/includes/core/class-prv-key-manager-renderer.php index 26bcd45..d95fc22 100644 --- a/includes/core/class-prv-key-manager-renderer.php +++ b/includes/core/class-prv-key-manager-renderer.php @@ -106,26 +106,25 @@ class PRV_Key_Manager_Renderer { * @return void */ private function render_key_form( bool $is_const, bool $is_set_opt ): void { - $form_url = esc_url( admin_url( 'admin-post.php' ) ); - echo '
'; + echo ''; echo ''; wp_nonce_field( PRV_Settings_Page::NONCE_KEY, 'prv_nonce' ); echo '
'; echo ''; - $disabled = $is_const ? ' disabled aria-disabled="true"' : ''; // Input always renders empty — never outputs stored key. echo ''; + . ( $is_const ? ' disabled aria-disabled="true"' : '' ) . '>'; if ( $is_const ) { echo '

' @@ -145,7 +144,7 @@ class PRV_Key_Manager_Renderer { // Remove key form (only when admin option is set, not constant). if ( $is_set_opt && ! $is_const ) { - echo ''; + echo ''; echo ''; wp_nonce_field( PRV_Settings_Page::NONCE_KEY, 'prv_nonce' ); echo '