Previene l'iniezione nel file PHP

1

Recentemente ho scritto questo codice:

<?php 
$path = '../data/about.html';
$handle = fopen($path, 'w') or die('Cannot open file:  '. $path);
$data = $_POST['name'];
fwrite($handle, $data);
fclose($handle);
header("Location: warnings.php")
?>

Ho sentito che questo codice è vulnerabile alle iniezioni XSS e ai byte null. Come posso renderlo più sicuro? Nota che i file che ho scritto verranno in seguito usati con AJAX sulle pagine, quindi ho bisogno di un modo per decodificare in JS se ho bisogno di crittografare i file.

    
posta MucaP 06.02.2017 - 23:19
fonte

1 risposta

5

Questo sembra qualcosa che deve essere completamente ridisegnato. Il problema principale è che stai permettendo di scrivere il contenuto del file about.html tramite una richiesta web. L'utente può inviare una richiesta permetterà loro di eseguire il rendering HTML arbitrario.

Il codice in about.html può essere impostato come modello? In tal caso, puoi sfuggire ai campi per il contesto appropriato (attributo vs. elemento), ma allo stato attuale non esiste un buon modo per proteggere questo codice.

Modifica per chiarimenti:
Sembra che tu possa aver bisogno di una migliore comprensione di cosa sia lo XSS (Cross-Site Scripting). XSS è acutalmente un nome terribile per la vulnerabilità. Ciò che realmente accade è l'iniezione del codice lato client. Ulteriori informazioni sono disponibili qui: link Il cuore di una vulnerabilità xss è il fatto che un attaccante può controllare ciò che il browser dell'utente (renderizza il markup ed eseguire JavaScript arbitrario).

Il problema con l'implementazione corrente è che stai tentando di consentire a un utente di scrivere un intero documento html. Con la tua soluzione, l'utente deve essere in grado di scrivere alcuni html, ma non dovrebbe essere consentito scrivere html dannosi. Questo è estremamente difficile da fare correttamente. L'escaping dell'html (usando htmlspecialchars, in questo caso) fa parte della soluzione corretta, ma non credo che funzionerà con l'implementazione corrente. Una soluzione molto più semplice sarebbe quella di mascherare il file about.html e sfuggire a tutti i dati che l'utente sta passando. In questo modo nessuno dei markup sarà controllato dall'utente.

    
risposta data 06.02.2017 - 23:40
fonte

Leggi altre domande sui tag