Dipende molto da come usi questa regex. Userò il codice PHP come esempio:
Esempio non sicuro: Sostituisci
echo "replaced: " . preg_replace('/<(?:\w+)\W+?[\w]/', '', $_GET['input']);
Questo non sarebbe sicuro. Esempio:
input=<<a|ascript>alert('xss');</script>
Questo perché la tua espressione regolare fa quello che pensi che faccia: cerca <
seguito da uno o più caratteri alfanumerici, seguito da uno o più caratteri non alfanumerici e quindi da un singolo carattere alfanumerico.
Quindi nella stringa di attacco sopra, <a|a
(un altro esempio di chiarezza: <aaa|||z
) corrisponde esattamente a questo e verrà rimosso. Pertanto, la stringa rimanente è <script>...
.
Esempio più sicuro: filtro
Se d'altra parte lo usi in questo modo:
$isAttack = preg_match('/<(?:\w+)\W+?[\w]/', $_GET['input']);
if (!$isAttack) { echo "filtered: " . $_GET['input']; }
Quanto sopra non funzionerebbe.
Esempio più sicuro: punti deboli
Dovresti comunque stare attento a dove scrivi l'input dell'utente, anche se usi la regex come nell'esempio più sicuro. Questo ad esempio non sarebbe sicuro:
$isAttack = preg_match('/<(?:\w+)\W+?[\w]/', $_GET['input']);
if (!$isAttack) { echo "link: <a href="' . " . $_GET['input'] . '">click me</a>'; }
Esempio di attacco:
input=" onmouseover="alert('xss')
Per altri luoghi in cui questo tipo di filtraggio non è abbastanza buono, consulta l'owasp Scheda trucchi XSS Prevenzione .