Domanda

Nella mia applicazione consento agli utenti di caricare i loro fogli di stile CSS in modo che possano essere applicati ai modelli. Il CSS è scritto come un foglio di stile interno, perché in questo momento non vorrei esporre il foglio di stile CSS ad altri utenti.

Ciò crea spazio affinché gli utenti possano includere codice dannoso nel file css. Inizialmente il mio piano era di convertire tutto '& Lt;' e '>', ma è necessario nella sintassi css. Sto cercando una soluzione per la lista bianca, dal momento che non sarà possibile eliminare in modo esauriente i caratteri indesiderati.

Qualche suggerimento per implementare misure di sicurezza in questo scenario?

È stato utile?

Soluzione

Dovresti sicuramente filtrare almeno le espressioni IE e le proprietà di associazione di FF -moz ... entrambi possono essere usati per eseguire javascript (potenzialmente dannoso) usando css.

Questo cheat sheet contiene le tattiche XSS più ovvie, comprese alcune CSS.

La soluzione più sicura sarebbe probabilmente la whitelist come hai suggerito (se è accettabile limitare gli utenti a utilizzare solo le proprietà nella whitelist).

Altri suggerimenti

Ho implementato un filtro che sostituisce tutti i < caratteri in &lt;. Il motivo è che CSS non ha bisogno del carattere >; l'unico carattere di cui ha bisogno è <=> utilizzato per i selettori secondari.

In questo modo gli utenti non possono aprire tag per scrivere codice dannoso.

Sono più che felice di considerare qualsiasi altra / migliore soluzione.

Non consentire agli utenti di caricare un FILE CSS, crea un'interfaccia che generi dinamicamente i file CSS in base alle opzioni selezionate dall'utente. Le opzioni che consenti. quindi puoi creare un file CSS fisico o creare un'applicazione dinamica che scrive CSS in base a quella configurazione, questo evita di avere molti file CSS sul server ... è un altro approccio e non è necessario controllare ogni exploit XSS possibile , è più facile definire ciò che è consentito rispetto all'analisi dei CSS e al rifiuto di alcuni codici pericolosi.

Usa CDATA e scappa dalla sequenza finale (]]>). Non sono sicuro della compatibilità del browser, tuttavia.

Esempio (non testato):

<?PHP

function strReplaceAll($needle, $replacement, $haystack)
{
    // Check for infinite loop.  (NOT FOOL PROOF!)
    if(strpos($replacement, $needle) === FALSE)
        return;

    $numReplacements = 42;

    while($numReplacements)
    {
        $haystack = str_replace($needle, $replacement, $haystack, &$numReplacements);
    }

    return $haystack;
}

?>

<style type="text/css">
/*
<![CDATA[
*/

<?PHP echo sstrReplaceAll(']]>', '', $userCss); ?>

/*
]]>
*/
</style>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top