Realmente depende de cómo uses esta expresión regular. Usaré código PHP como ejemplo:
Ejemplo inseguro: Reemplazar
echo "replaced: " . preg_replace('/<(?:\w+)\W+?[\w]/', '', $_GET['input']);
Esto no sería seguro. Ejemplo:
input=<<a|ascript>alert('xss');</script>
Esto se debe a que su expresión regular hace lo que cree que hace: busca <
seguido de uno o más caracteres alfanuméricos, seguido de uno o más caracteres no alfanuméricos, y luego un solo carácter alfanumérico.
Entonces, en la cadena de ataque anterior, <a|a
(otro ejemplo para claridad: <aaa|||z
) coincide exactamente con esto y se eliminará. Por lo tanto, la cadena restante es <script>...
.
Ejemplo más seguro: filtro
Si, por otro lado, lo usas así:
$isAttack = preg_match('/<(?:\w+)\W+?[\w]/', $_GET['input']);
if (!$isAttack) { echo "filtered: " . $_GET['input']; }
Lo anterior no funcionaría.
Ejemplo más seguro: debilidades
Aún debe tener cuidado al emitir la entrada del usuario, incluso si usa la expresión regular como en el ejemplo más seguro. Esto, por ejemplo, no sería seguro:
$isAttack = preg_match('/<(?:\w+)\W+?[\w]/', $_GET['input']);
if (!$isAttack) { echo "link: <a href="' . " . $_GET['input'] . '">click me</a>'; }
Ejemplo de ataque:
input=" onmouseover="alert('xss')
Para más lugares donde este tipo de filtrado no es lo suficientemente bueno, vea la owasp XSS Prevention Cheat Sheet .