Come creare un BBCode sicuro?

0

Al momento, le persone possono usare XSS nel mio URL BBCode e non so come risolverlo. Avevo tentato di risolverlo qualche tempo fa, ma qualcuno in qualche modo l'ha aggirato!

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 e striplashes.

    
posta UnderMyWheel 26.11.2016 - 19:33
fonte

1 risposta

2

Il problema specifico con il tuo codice è che in realtà non esci nulla e permetti il codice HTML definito dall'utente in più punti.

Questo è il codice che hai creato:

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

I valori $1 e $2 sono controllati dall'utente ed entrambi devono essere filtrati (in modi diversi).

  • Per $1 devi assicurarti che non sia possibile per un utente malintenzionato sfuggire all'attributo fornendo virgolette doppie ( " ). Un modo per raggiungere questo obiettivo è utilizzare htmlspecialchars() . Un altro problema (che hai provato ad indirizzare) è che i collegamenti possono iniziare con pseudo-protocolli come javascript: . Pertanto, dovresti anche autorizzare alcuni schemi URI plausibili. Un metodo restrittivo ma sicuro sarebbe limitare l'input agli URL che iniziano con http[s]:// .
  • Per $2 devi disabilitare qualsiasi tag HTML. Ancora una volta, una soluzione rapida e sporca applicherebbe htmlspecialchars() . Tuttavia, tieni presente che ciò può causare problemi se prevedi di supportare tag BB annidati.

Il problema generale è che le espressioni regolari non sono il modo giusto per elaborare il markup nidificato, specialmente non per motivi di sicurezza. È molto facile risolvere il problema . Prova a fare affidamento sugli strumenti del tuo framework o ad usare librerie come HTMLPurifier . Dovresti anche consultare alcune guide di base sulla prevenzione di XSS.

    
risposta data 26.11.2016 - 20:42
fonte

Leggi altre domande sui tag