¿Cómo crear un BBCode seguro?

0

En este momento, las personas pueden usar XSS en mi URL BBCode, y no sé cómo solucionarlo. Intenté arreglarlo hace un tiempo, ¡pero alguien lo evitó!

function filterScript($content) { 
    $pattern = array('/href="javascript:[^"]+"/', '/style=":[^"]+"/');
    $default = array('#', 'color: #337ab7; text-decoration: none');

    return preg_replace($pattern, $default, $content);
}

function bbcode($input) {
    $search = array('/\[a url="(.+?)"\](.*?)\[\/a\]/is');

    $replace = array('<a href="$1" style="color: #337ab7; text-decoration: none" target="_blank">$2</a>');

    $bbcoded = preg_replace($search, $replace, $input);
    return filterScript($bbcoded);
}

Sí, uso strip_tags, mysql_real_escape_string, y striplashes.

    
pregunta UnderMyWheel 26.11.2016 - 19:33
fuente

1 respuesta

1

El problema específico con su código es que realmente no escapa a nada y permite el código HTML definido por el usuario en múltiples lugares.

Este es el código que creas:

<a href="$1" target="_blank">$2</a>

Los valores $1 y $2 son controlados por el usuario y ambos deben ser filtrados (de diferentes maneras).

  • Para $1 , debe asegurarse de que no sea posible que un atacante se escape del atributo proporcionando comillas dobles ( " ). Una forma de lograrlo es utilizar htmlspecialchars() . Otro problema (que trató de resolver) es que los enlaces pueden comenzar con pseudo-protocolos como javascript: . Por lo tanto, también debería incluir en la lista blanca algunos esquemas URI plausibles. Un método restrictivo pero seguro sería limitar la entrada a las URL que comienzan con http[s]:// .
  • Para $2 , debe rechazar cualquier etiqueta HTML. De nuevo, una solución rápida y sucia sería aplicar htmlspecialchars() . Pero tenga en cuenta que esto puede causar problemas si planea admitir etiquetas BB anidadas.

El problema general es que las expresiones regulares no son la forma correcta de procesar el marcado anidado, especialmente no por motivos de seguridad. Es muy fácil desordenar esto . Intente confiar en las herramientas de su marco o utilice bibliotecas como HTMLPurifier . También debe consultar algunas guías básicas en la prevención de XSS.

    
respondido por el Arminius 26.11.2016 - 20:42
fuente

Lea otras preguntas en las etiquetas