È sicuro usare uno script PHP per caricare un PNG con codifica Base64?

3

Come parte di un progetto più ampio su cui sto lavorando, ho bisogno di scrivere uno script PHP per convertire una stringa Base64 in un'immagine. Il modo in cui mi piacerebbe passare la stringa Base64 nello script tramite una query GET, quindi ...

example.com/base64ToPng.php?base64=thisIsTheBase64ForTheImage

Vorrei quindi convertire il Base64 che è passato in un'immagine PNG e visualizzarlo come se il file PHP fosse un'immagine. Mentre questo non è un problema dal punto di vista dello sviluppo, sono preoccupato per la sicurezza di farlo. Mi metterei in pericolo visto che Base64 verrà creato dall'utente? (O più accuratamente, Base64 verrà creato da un programma basato sull'immagine fornita dall'utente.) Sono particolarmente preoccupato per l'utente che crea un'immagine dannosa in grado di eseguire codice arbitrario, ma non so se questo sia una preoccupazione valida dato che l'immagine verrà solo ricreata dallo script PHP ma non memorizzata sul server.

<?php       
    if(!isset($_GET['x'])) {
        die();
    }

    $image = base64_decode($_GET['x']);
    header ('Content-type: image/png');
    imagepng($image, NULL, 0);
?>
    
posta DavidB 17.03.2017 - 18:28
fonte

2 risposte

3

Non è sicuro usare URL più lunghi di circa 2000 caratteri. Mentre l'URL RFC non specifica alcun limite particolare, la maggior parte di browser limita il numero di caratteri in un URL a meno di 2000 caratteri .

Un altro problema è che l'uso di base64 è molto poco efficiente, poiché codificherete tre byte con quattro byte. Ciò significa che la dimensione massima dell'immagine che puoi praticamente collegare in modo affidabile alla maggior parte dei browser è inferiore a 1,5 KB.

Devi anche considerare che l'esecuzione di questo servizio farà riempire i file di log del tuo server web molto rapidamente, poiché registrerà l'intero URL. Potrebbe essere possibile troncare / cancellare l'URL registrato, ma questo renderà i problemi di risoluzione dei problemi più difficili.

Appendice:

A meno che tu non voglia realmente modificare i dati dell'immagine, la tua implementazione può solo fare eco ai dati dell'immagine, senza bisogno di imagepng ():

<?php
if(!isset($_GET['x'])) {
    die();
}
$image = base64_decode($_GET['x']);
header ('Content-type: image/png');
echo $image;
?>
    
risposta data 19.03.2017 - 09:02
fonte
0

That said, do I still need to worry about code execution vulnerabilities if I use the method you suggested here?

No, non lo fai. base64_decode restituisce ancora una stringa, che non può essere eseguita al punto di decodifica. In questo modo, che tu rispondi semplicemente alla stringa, non eseguirà alcun PHP.

Sul lato client: l'iniezione di JavaScript potrebbe tuttavia essere attivata, ma quando imposti l'intestazione image/png , ciò è già impedito.

    
risposta data 19.03.2017 - 22:08
fonte

Leggi altre domande sui tag