/**
* Security Tests for URL Sanitization
*
* These tests are adapted from Kerem's security audit to ensure
* all XSS vectors are properly blocked.
*
* Attack vectors covered:
* - javascript: protocol (XSS)
* - data: protocol (XSS, data exfiltration)
* - vbscript: protocol (legacy IE XSS)
* - file: protocol (local file access)
* - Other dangerous protocols
*/
import { sanitizeURL, sanitizeProps } from '../core/sanitize';
import { extractComponentData } from '../core/componentParser';
// ============================================================================
// URL Sanitization Tests
// ============================================================================
describe('Security: URL Sanitization', () => {
describe('javascript: protocol (XSS vector)', () => {
it('should block javascript: URLs', () => {
expect(sanitizeURL('javascript:alert(1)')).toBeNull();
expect(sanitizeURL('javascript:alert(document.cookie)')).toBeNull();
expect(sanitizeURL('javascript:void(0)')).toBeNull();
});
it('should block case variations of javascript:', () => {
expect(sanitizeURL('JAVASCRIPT:alert(1)')).toBeNull();
expect(sanitizeURL('JavaScript:alert(1)')).toBeNull();
expect(sanitizeURL('jAvAsCrIpT:alert(1)')).toBeNull();
expect(sanitizeURL('JaVaScRiPt:alert(1)')).toBeNull();
});
it('should block javascript: with whitespace padding', () => {
expect(sanitizeURL(' javascript:alert(1) ')).toBeNull();
expect(sanitizeURL('\tjavascript:alert(1)')).toBeNull();
expect(sanitizeURL('\njavascript:alert(1)')).toBeNull();
});
});
describe('data: protocol (XSS vector)', () => {
it('should block data: URLs with HTML payloads', () => {
expect(sanitizeURL('data:text/html,')).toBeNull();
expect(sanitizeURL('data:text/html,
')).toBeNull();
});
it('should block base64 encoded payloads', () => {
// base64 of
expect(sanitizeURL('data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==')).toBeNull();
});
it('should block data: URLs for images (pixel tracking)', () => {
expect(sanitizeURL('data:image/svg+xml,