Rilevazione locale ed enorme intestazione Accept-Language, può essere considerata una vulnerabilità di atack?

0

Stavo cercando alcuni esempi di rilevamento automatico delle impostazioni internazionali poiché dovevo fare lo stesso nella mia app PHP. La maggior parte delle risposte che ho trovato erano simili, solo che differivano nei metodi di analisi. Un esempio di "pseudo-codice":

$supportedLocales = ['en, 'bg', 'pl'];
$locale = 'en'; // default fallback locale

$userLangs = preg_split('/,|;/', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
foreach($userLangs as $lang)
{
    if(in_array($lang, $supportedLocales))
    {
        $locale = $lang;
        break;
    }        
}

Ma, dopo un po 'di sperimentazione con l'intestazione Accept-Language nel mio browser per vedere se tutto funziona correttamente, ho notato che potrei effettivamente rendere l'header molto lungo, facendo sì che il server faccia un sacco di looping perché il codice sopra i loop attraverso l'intero array $ supportedLocales per ogni chiave nell'array $ userLangs. Potrei davvero inviare facilmente un'intestazione Accept-Language falsificata con oltre 25000 lingue false che non erano supportate dall'app, generando quindi oltre 100000 iterazioni in totale. Non includendo le iterazioni utilizzate per confrontare i valori della stringa.

Anche qui sui siti web di Stack, potrei inviare più di qualche migliaio di lingue prima di ottenere un errore di '400 Bad Request'. Se questo può essere considerato un attacco, come si può proteggere il suo sito web da intestazioni di questo tipo? So che potrei limitare la quantità di lingue, ma quale importo può essere considerato normale?

    
posta hazelnutek 24.10.2018 - 14:55
fonte

2 risposte

2

Sembra che la tua situazione sia piuttosto unica, poiché, secondo questa risposta , la maggior parte dei server web non ti consente di inviare 25000 lingue false, ma solo qualcosa di circa 2500.

Dato il tuo codice non è ottimale e averlo modificato in questo modo

$supportedLocales = array_fill_keys($supportedLocales, 1);
foreach($userLangs as $lang)
{
    if(isset($supportedLocales[$lang]))
    {
        $locale = $lang;
        break;
    }        
}

lo manterrà alle umili 2500 iterazioni.

    
risposta data 24.10.2018 - 15:34
fonte
4

If this can be considered an attack, how can one protect his website from such forged headers?

Le contraffazioni di richieste che richiedono molto tempo per essere elaborate sul server sono una tecnica comune per un attacco DOS (Denial-Of-Service). Questo è il motivo per cui disinfetta sempre i tuoi input . Non solo i valori POST e GET, ma anche le intestazioni se li usi.

Per l'intestazione HTTP_ACCEPT_LANGUAGE , direi che qualcosa di più di circa 30 caratteri o 10 lingue non sarebbe un valore sano per la maggior parte delle applicazioni. Quindi sanitse l'intestazione. Puoi limitare il numero di risultati in preg_split o limitare la lunghezza dell'intestazione HTTP_ACCEPT_LANGUAGE

$userLangs = preg_split('/,|;/', $_SERVER["HTTP_ACCEPT_LANGUAGE"], 10);

or

$userLangs = preg_split('/,|;/', substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 30))

modifica: la risposta per utente "Il tuo buon senso" è stata accettata, ma ti preghiamo di comprendere che l'ottimizzazione di un ciclo non è il modo giusto per proteggersi da qualsiasi input falsificato. Stai solo riducendo l'impatto, invece di risolvere la fonte del problema.

    
risposta data 24.10.2018 - 15:58
fonte

Leggi altre domande sui tag