In che modo Facebook rimuove html / apostrofi per XSS ma lo visualizza anche?

0

Non sono abbastanza sicuro se questa è una domanda per programmers.se piuttosto che stackoverflow, ma qui va. Così Facebook [o qualsiasi altra grande azienda] quando viene dato qualcosa come un apostrofo o html, può spogliarlo del suo intento malevolo, ma comunque mostrarlo correttamente. La mia attuale funzione di sanitizzazione in PHP semplicemente elimina quei caratteri / li rende innocui tramite htmlentities () e così via. Quindi, se scrivessi un tag HTML, vorrei che fosse disinfettato ma anche visualizzato sul sito web. Come posso fare questo?

    
posta Someone 24.04.2013 - 22:34
fonte

2 risposte

1

In generale, qualsiasi elemento inserito da un utente (o macchina o software non affidabile che utilizza un'API) deve essere preceduto dall'esclusione prima di inserirlo nel codice (HTML, JavaScript, ecc.) che viene interpretato. Scappare è ciò che intendi per "renderlo innocuo". La maggior parte delle librerie ha API (come htmlentities() ) per facilitare questo.

Se non lo sfuggi, memorizzarlo è fondamentalmente l'unica cosa sicura che puoi fare. L'analisi può essere OK, purché l'analizzatore non possa essere requisito dal suo input (cioè è robusto e difensivo e non ha exploit).

Anche modificare l'input (ad esempio rimuovere i caratteri pericolosi) può essere efficace, ma è difficile farlo in modo che i caratteri legittimi vengano soppressi (falsi positivi). Ad esempio, se il nome di qualcuno è John O'Malley-O'Hara, non si desidera che il sistema rimuova gli apostrofi (o il testo tra di essi), anche se sembrano delimitatori a virgolette singole comuni nel codice. In altre parole, è così difficile assicurarsi che la modifica dell'input sia eseguita correttamente, forse è meglio non farlo affatto.

Penso che l'approccio migliore sia trattare con attenzione tutti gli input e sfuggirli quando li visualizzi. Alcune lingue e framework possono aiutarti con questo (vedi " modalità contaminazione ").

    
risposta data 24.04.2013 - 22:53
fonte
0

Per prima cosa, devi capire che tipo di testo rappresenta il tuo input. Una possibilità è testo non elaborato : una lettera indica una lettera, una parentesi angolare indica una parentesi angolare, una barra rovesciata indica una barra rovesciata e così via. O forse è un testo con escape backslash : una lettera significa una lettera, una parentesi angolare indica una parentesi angolare, ma una barra rovesciata avvia una sequenza di escape. Un'altra possibilità è markup HTML : una parentesi angolare sinistra avvia un elemento HTML, una e commerciale inizia un'entità e così via. Esistono tutti i tipi di altri linguaggi di markup: XML, Markdown, bbcode, ecc.

Convalida: potresti ottenere un input che non si adatta alla tua interpretazione, come il markup HTML malformato. Dovresti rifiutarlo o correggerlo automaticamente. Forse vuoi solo consentire determinati tag nel tuo markup HTML. Dovresti fare qualcosa con gli altri tag: eliminarli, trattarli come testo letterale (cioè visualizzarli come una parentesi angolare sinistra, lettere, parentesi angolare destra), rifiutare l'input, o qualsiasi altra cosa. Probabilmente dovrai analizzare l'input in base alla tua interpretazione per convalidarlo; se provi a farlo con le espressioni regolari, probabilmente ti sbagli.

Ora che sai cosa hai (interpretazione) e sai di averlo (convalida e / o analisi), dovrebbe essere facile tradurlo in qualunque cosa tu voglia renderlo come. Quando si esegue il rendering di testo non elaborato su HTML, è necessario prestare attenzione ai caratteri che sono speciali per HTML. Se si esegue il rendering di alcuni markup wiki, è necessario mappare il markup wiki al markup HTML --- e ancora, se il markup wiki contiene caratteri speciali per HTML, è necessario eseguire il escape. Se stai rendendo un sottoinsieme di HTML e hai già convalidato l'input in modo che contenga solo il sottoinsieme che permetti, allora hai finito.

Questo è l'intero processo. Ora puoi consultare varie librerie e decidere se fanno la traduzione che ti serve. Ad esempio, IIUC, htmlentities() esegue il rendering di una stringa che rappresenta il testo non elaborato in markup HTML. Può essere. A seconda di come si desidera rendere le nuove linee. Probabilmente l'output dovrebbe essere come HTML-dove-newlines-sono-ancora significativi.

È facile ingannare se stessi pensando che le scorciatoie siano corrette (ad esempio "rimuoverò i tag script con un'espressione regolare"). Attenzione.

    
risposta data 25.04.2013 - 18:12
fonte

Leggi altre domande sui tag