Skip to content

Latest commit

 

History

History
128 lines (103 loc) · 3.85 KB

CSP-SOLUTION.md

File metadata and controls

128 lines (103 loc) · 3.85 KB

🔒 Solución CSP (Content Security Policy)

❌ Problema Encontrado

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' https://*.vscode-cdn.net"

🔍 Causa del Problema

VS Code tiene políticas de seguridad estrictas que prohíben el uso de event handlers inline como:

  • onclick="functionName()"
  • onmouseover="..."
  • onchange="..."

✅ Solución Implementada

1. Eliminación de Event Handlers Inline

❌ Antes (Violaba CSP):

<tr onclick="toggleRow('row-1', 'expanded-1')">
<button onclick="copySqlToClipboard(0)">Copy</button>
<button onclick="openSqlInNewTab(0)">Open</button>

✅ Después (CSP Compliant):

<tr class="expandable-row" data-row-id="row-1" data-expanded-id="expanded-1">
<button class="copy-btn" data-index="0">Copy</button>
<button class="open-btn" data-index="0">Open</button>

2. Event Listeners en JavaScript

Creé la función attachRowEventListeners() que:

  • Se ejecuta después de renderizar las filas
  • Usa addEventListener() en lugar de onclick
  • Utiliza data-* attributes para pasar parámetros

3. Manejo de Event Propagation

// Prevenir bubbling cuando se hace click en botones
btn.addEventListener('click', function(e) {
    e.stopPropagation();
    // ... lógica del botón
});

🔧 Cambios Técnicos Específicos

Función attachRowEventListeners()

function attachRowEventListeners() {
    // Click en filas expandibles
    document.querySelectorAll('.expandable-row').forEach(row => {
        row.addEventListener('click', function(e) {
            if (e.target.classList.contains('expand-btn')) return;
            const rowId = this.dataset.rowId;
            const expandedId = this.dataset.expandedId;
            toggleRow(rowId, expandedId);
        });
    });

    // Click en botones de expansión
    document.querySelectorAll('.expand-btn').forEach(btn => {
        btn.addEventListener('click', function(e) {
            e.stopPropagation();
            // ... lógica
        });
    });

    // Botones de copia y apertura
    // ... similar pattern
}

Data Attributes para Parámetros

<!-- En lugar de onclick="toggleRow('row-1', 'expanded-1')" -->
<tr data-row-id="row-1" data-expanded-id="expanded-1">

<!-- En lugar de onclick="copySqlToClipboard(0)" -->
<button class="copy-btn" data-index="0">

Funciones Locales en lugar de Window

// ❌ Antes (global namespace pollution)
window.toggleRow = function(rowId, expandedId) { ... };

// ✅ Después (scope local limpio)
function toggleRow(rowId, expandedId) { ... }

🛡️ Beneficios de Seguridad

1. Protección contra XSS

  • No ejecuta código inline inyectado
  • Valida origen de todos los scripts

2. Namespace Limpio

  • Funciones no expuestas globalmente
  • Menor superficie de ataque

3. VS Code Compliance

  • Cumple políticas de extensiones
  • No requiere permisos adicionales

🧪 Testing

Funcionalidad Verificada:

  • ✅ Click en filas expande/contrae correctamente
  • ✅ Botón de expansión funciona independientemente
  • ✅ Copy SQL funciona sin errores CSP
  • ✅ Open in New Tab funciona correctamente
  • ✅ Event propagation manejado correctamente

Sin Errores de Consola:

  • ✅ No más violaciones de CSP
  • ✅ Event handlers funcionan correctamente
  • ✅ Compatibilidad total con VS Code

📝 Lecciones Aprendidas

  1. Siempre usar event listeners en lugar de onclick inline
  2. Data attributes son la forma segura de pasar parámetros
  3. Event propagation debe manejarse explícitamente
  4. Scope local es mejor que namespace global
  5. CSP compliance es crítico para extensiones VS Code

¡La funcionalidad expandible ahora es 100% compatible con las políticas de seguridad de VS Code! 🔒