[PR #24835] fix: XSS vulnerability in block-input and support-var-input components #30816

Closed
opened 2026-02-21 20:48:17 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/langgenius/dify/pull/24835

State: closed
Merged: Yes


Important

  1. Make sure you have read our contribution guidelines
  2. Ensure there is an associated issue and you have been assigned to it
  3. Use the correct syntax to link this PR: Fixes #24834.

Summary

This PR addresses a critical Cross-Site Scripting (XSS) vulnerability in the block-input and support-var-input components. The vulnerability existed due to unsafe usage of React's dangerouslySetInnerHTML API with user-provided content that wasn't properly sanitized.

Changes made:

  1. Replaced unsafe HTML rendering with safe React rendering: Modified both block-input and support-var-input components to use a new renderSafeContent function that leverages React's built-in HTML escaping instead of dangerouslySetInnerHTML.

  2. Enhanced deprecated function safety: Added proper HTML entity escaping to the varHighlightHTML function and marked it as deprecated with a security warning.

  3. Added comprehensive test coverage: Created a comprehensive test suite (xss-prevention.test.tsx) that verifies:

    • Malicious scripts and HTML elements are safely rendered as text
    • No actual script or img elements are created in the DOM
    • Legitimate variable highlighting continues to work correctly
    • React's automatic escaping mechanisms function properly

Security Impact:

  • Prevents execution of malicious JavaScript code embedded within variable placeholders
  • Maintains backward compatibility - UI and functionality remain unchanged
  • Follows the same secure pattern established in PR #23295

Test Coverage:

  • Increased test coverage from 0% to 83.79% for affected components
  • 4 comprehensive test cases covering various XSS attack vectors

Fixes #24834

Screenshots

No visual changes - this is a security fix that maintains the exact same UI appearance and functionality.

Checklist

  • This change requires a documentation update, included: Dify Document
  • I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
  • I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
  • I've updated the documentation accordingly.
  • I ran dev/reformat(backend) and cd web && npx lint-staged(frontend) to appease the lint gods
**Original Pull Request:** https://github.com/langgenius/dify/pull/24835 **State:** closed **Merged:** Yes --- > [!IMPORTANT] > > 1. Make sure you have read our [contribution guidelines](https://github.com/langgenius/dify/blob/main/CONTRIBUTING.md) > 1. Ensure there is an associated issue and you have been assigned to it > 1. Use the correct syntax to link this PR: `Fixes #24834`. ## Summary This PR addresses a critical Cross-Site Scripting (XSS) vulnerability in the block-input and support-var-input components. The vulnerability existed due to unsafe usage of React's `dangerouslySetInnerHTML` API with user-provided content that wasn't properly sanitized. **Changes made:** 1. **Replaced unsafe HTML rendering with safe React rendering**: Modified both `block-input` and `support-var-input` components to use a new `renderSafeContent` function that leverages React's built-in HTML escaping instead of `dangerouslySetInnerHTML`. 2. **Enhanced deprecated function safety**: Added proper HTML entity escaping to the `varHighlightHTML` function and marked it as deprecated with a security warning. 3. **Added comprehensive test coverage**: Created a comprehensive test suite (`xss-prevention.test.tsx`) that verifies: - Malicious scripts and HTML elements are safely rendered as text - No actual script or img elements are created in the DOM - Legitimate variable highlighting continues to work correctly - React's automatic escaping mechanisms function properly **Security Impact:** - Prevents execution of malicious JavaScript code embedded within variable placeholders - Maintains backward compatibility - UI and functionality remain unchanged - Follows the same secure pattern established in PR #23295 **Test Coverage:** - Increased test coverage from 0% to 83.79% for affected components - 4 comprehensive test cases covering various XSS attack vectors Fixes #24834 ## Screenshots No visual changes - this is a security fix that maintains the exact same UI appearance and functionality. ## Checklist - [ ] This change requires a documentation update, included: [Dify Document](https://github.com/langgenius/dify-docs) - [x] I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!) - [x] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change. - [x] I've updated the documentation accordingly. - [x] I ran `dev/reformat`(backend) and `cd web && npx lint-staged`(frontend) to appease the lint gods
yindo added the pull-request label 2026-02-21 20:48:17 -05:00
yindo closed this issue 2026-02-21 20:48:17 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: langgenius/dify#30816