Skip to content

Fix. ContactEncoder. Edits made in the shortcode omitted from encoding#815

Open
AntonV1211 wants to merge 1 commit into
devfrom
vuln_cont_enc_skip_shcd_av
Open

Fix. ContactEncoder. Edits made in the shortcode omitted from encoding#815
AntonV1211 wants to merge 1 commit into
devfrom
vuln_cont_enc_skip_shcd_av

Conversation

@AntonV1211

Copy link
Copy Markdown
Contributor

Copilot AI review requested due to automatic review settings June 19, 2026 09:02
@codecov

codecov Bot commented Jun 19, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 96.15385% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 26.53%. Comparing base (6b7aa59) to head (6da10e9).

Files with missing lines Patch % Lines
...actsEncoder/Shortcodes/ExcludedEncodeContentSC.php 96.15% 1 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##                dev     #815      +/-   ##
============================================
+ Coverage     26.46%   26.53%   +0.06%     
- Complexity     5667     5677      +10     
============================================
  Files           269      269              
  Lines         24240    24264      +24     
============================================
+ Hits           6416     6439      +23     
- Misses        17824    17825       +1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates the ContactsEncoder “skip encoding” shortcode handling to reduce XSS risk during shortcode decoding and to avoid processing shortcodes that appear inside HTML tag/attribute contexts.

Changes:

  • Sanitizes shortcode callback output (escape decoded value; sanitize fallback HTML).
  • Skips changeContentAfterEncoderModify() processing when the shortcode appears inside an HTML tag/attribute context.
  • Adds PHPUnit coverage for sanitization behavior and for detecting shortcode offsets inside/outside HTML tags.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
lib/Cleantalk/ApbctWP/ContactsEncoder/Shortcodes/ExcludedEncodeContentSC.php Escapes decoded output, sanitizes fallback output, and adds HTML-tag-context detection to avoid unsafe processing.
tests/ApbctWP/ContactsEncoder/Shortcodes/ExcludedEncodeContentSCTest.php Adds teardown cleanup plus tests for sanitization and HTML-tag-context detection/skip behavior.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

return $content;
}

$pattern = '/\[apbct_skip_encoding\](.*?)\[\/apbct_skip_encoding\]/s';
Comment on lines +131 to +140
public function isOffsetInsideHtmlTag($content, $offset)
{
$before = substr($content, 0, $offset);

$last_open = strrpos($before, '<');
$last_close = strrpos($before, '>');

return $last_open !== false &&
($last_close === false || $last_open > $last_close);
}
Comment on lines +86 to +96
/**
* Checks whether any shortcode occurrence is located inside an HTML tag.
*
* This validation prevents shortcode processing from HTML attribute contexts
* which could lead to attribute injection or mutation-XSS issues.
*
* @param string $content The content to validate.
* @return bool True if any shortcode boundary is detected inside an HTML tag.
*/
protected function isShortcodeInsideHtmlTag($content)
{
Comment on lines +284 to +294
/**
* Test that decoded email with HTML entities is properly escaped
*/
public function testCallbackEscapesDecodedDataWithHtmlChars(): void
{
// Test with content that has HTML special chars in a non-encoded context
$content = '<span data-original-string="nonexistent_encoded_data">test</span>';
$result = $this->exclude_content_sc->callback([], $content, '');
// Even if decoding fails, fallback should be sanitized
$this->assertStringNotContainsString('<script>', $result);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants