PHP: se il set di caratteri non corrisponde (htmlentities UTF-8) visualizzato dal client come ISO-8859-1 (o viceversa)

11

Breve domanda:

Domanda: potrebbero sorgere vulnerabilità di sicurezza se un server esegue htmlentities come UTF-8 ma il client visualizza i risultati come ISO-8859-1?

Presupposto: non esistono vulnerabilità quando si utilizza un set di caratteri coerente

Domanda dettagliata:

Domanda: Potrebbe sorgere qualche vulnerabilità di sicurezza se il server htmlentities una stringa ISO-8859-1 come UTF-8? (e il client interpreta il risultato come ISO-8859-1?)

(ad esempio $results = htmlentities($iso_8859_1_string, ENT_QUOTES, "UTF-8")

Supponendo che tutto sia codificato in modo tale che non sorgano vulnerabilità quando viene utilizzata in modo coerente un'unica codifica del set di caratteri. (Ignorando se $ results = stringa vuota).

Forse se $iso_8859_1_string potrebbe contenere qualsiasi valore, i risultati verrebbero considerati come non validi UTF-8 (e restituiti ""), o come UTF-8 valido. Per UTF-8 valido, le sequenze UTF-8 sarebbero state sottoposte a escape come previsto, ma come sarebbero visualizzati i risultati sul client interpretando il risultato come ISO-8859-1? I caratteri determinano l'escape dell'intervallo 0 - 127 come previsto (come "US-ASCII"), alcuni caratteri potrebbero essere convertiti in entità html e potrebbero essere visualizzati come previsto. Ci sono caratteri UTF-8 validi nell'intervallo 128+ superiore che non risolvono le entità html? Il client vedrebbe solo un mucchio di testo / simboli incomprensibili / illeggibili, ma nessun carattere che potrebbe far sì che il browser esegua codice o passi a un contesto di esecuzione del codice? (ad esempio, nessun carattere tag come "<" ">" simboli)? (Supponendo che i risultati $ vengano inseriti in un "contesto di contenuto" e non in un "valore di attributo" o un corpo di "script").

Questa linea di pensiero è giusta?

Nota : credo di aver già elaborato il caso vice versa (cioè se il server htmlentities è una stringa UTF-8 come ISO-8859-1 e il il client interpreta il risultato come UTF-8)

(ad esempio htmlentities($utf8_string, ENT_QUOTES, "ISO-8859-1") )

Risposta: la mia ipotesi non è una vulnerabilità di sicurezza sul client (per htmlentities come ISO - > client si legge come UTF-8) perché:

  • In ISO-8859-1, caratteri nell'intervallo:

    • 0-127 (US-ASCII): sono codificati esattamente allo stesso modo in UTF-8,
    • 160 - > 255 in ISO-8859-1 sarebbero tutti codificati come entità HTML,
    • lasciando solo l'intervallo di caratteri di 128-159 ..., ma in base alle specifiche UTF-8 di Wikipedia, link , tutti i byte UTF-8 compresi nell'intervallo 128+ fanno tutti parte di "sequenze multibyte" che comprendono un "byte iniziale" che è sempre 192 o superiore e "byte di continuazione" nell'intervallo 128+ . Pertanto, htmlentities($utf8_string, ENT_QUOTES, "ISO-8859-1") non è stato in grado di generare alcun "byte iniziale" necessario per UTF-8 per generare sequenze multi-byte valide. Quindi qualsiasi carattere in questo intervallo apparirebbe in UTF-8 come un? (cioè un carattere non valido) a causa di non vedere alcun "byte iniziale".

Penso che questo risolva la mia domanda per l'altra direzione.

Situazione reale: un server PHP 5.3.x con backport di sicurezza utilizza ISO-8859-1 come codifica predefinita. A partire da PHP 5.4, UTF-8 è la codifica predefinita. link . Sto cercando di determinare se il codice funziona correttamente in tutti gli ambienti UTF-8 o ISO-8859-1 e se non ci sono buchi di sicurezza automatici causati da errori di codifica / mancata corrispondenza.

Sento che posso essere certo che solo l'usabilità è influenzata, ma non la sicurezza in questi casi specifici.

    
posta user2533809 28.02.2014 - 09:59
fonte

2 risposte

4

Per quanto ne so, non c'è alcun problema di sicurezza.

I caratteri "pericolosi" in HTML (meno di, più grande di, e commerciale, virgoletta singola, virgoletta doppia) hanno tutti valori di byte identici sotto UTF-8 e ISO-8859-1 (e praticamente ogni altra codifica tu » è probabile incontrare, con le eccezioni di UTF-16, UTF-32 ed EBCDIC). Di conseguenza, sfuggire a loro in una codifica li sfuggirà anche nell'altra codifica.

Il motivo per cui ciò è vero è che la stragrande maggioranza delle codifiche di caratteri, inclusi UTF-8 e ISO-8859-1, sono "ASCII più caratteri aggiuntivi" e la struttura di un documento HTML utilizza solo caratteri nella parte ASCII della codifica.

    
risposta data 08.06.2014 - 23:18
fonte
-2

per quanto ne so, fino a quando i tuoi script PHP (cioè i moduli) usano il filtro per htmlspecialchars () e tolgono cose come simboli e barre rovesciate, non ci sarebbe alcun rischio per la sicurezza, almeno dal mio punto di vista.

forzare un charset ad essere usato dal clien è un'opzione per noi paranoici, insieme alle cose di base che ho appena chiamato.

    
risposta data 23.04.2014 - 13:49
fonte

Leggi altre domande sui tag