2010-01-20 8 views
7

Uso un semplice script PHP per eseguire un fumetto online che utilizza fondamentalmente un GET per prendere un valore intero n e inserire un tag img per n .jpg. Non esegue alcuna operazione di disinfezione o di controllo degli errori oltre a garantire che sia presente n .jpg. L'unica interazione dell'utente con lo script è attraverso questo GET, e un altro che fa la stessa cosa con una stringa per visualizzare manualmente un modello diverso per il test.Dovrei preoccuparmi dell'iniezione PHP se non utilizzo MySQL?

La mia domanda è: dovrei anche preoccuparmi dell'iniezione? E se sì, cosa dovrei fare per impedirlo? Tutto quello che ho trovato finora riguarda solo l'iniezione di MySQL, che non si applica in questo caso.

+0

PHP può utilizzare altri database oltre a MySQL e l'iniezione di codice può essere eseguita con qualsiasi (?) Database SQL o qualsiasi codice che valuti l'input esterno. – PhiLho

risposta

5

Se non si utilizza un database, quindi ovviamente l'iniezione SQL non è una preoccupazione per il tuo. Allo stesso modo, se non si memorizzano i dati inviati dall'utente da mostrare ad altri utenti, Cross-site-scripting non è un problema. Ciò lascia cose come eval() o processi esterni che un utente malintenzionato potrebbe sovvertire, ma non sembra che tu faccia qualcosa del genere.

Quindi probabilmente sei al sicuro. Tuttavia, sarebbe bene avere un minimo di controllo degli errori, solo per prendere l'abitudine. Ad esempio, tu dici che hai un intero parametro GET. Non esiste una cosa del genere: tutti i parametri HTTP sono stringhe implicite. PHP sfoca la distinzione, ma è assolutamente necessario eseguire il cast in int esplicitamente per assicurarsi che non si tratti di una stringa destinata a sfruttare una vulnerabilità XSS, SQL injection o eval (anche se nessuna di queste esiste).

+0

Poiché il parametro fa parte di un nome file, è in realtà solo una stringa composta da numeri. E poiché l'esistenza di detto file è verificata, la fusione sarebbe superflua. Ma normalmente sarebbe una buona idea. Come indicato in una risposta di seguito, 'ctype_digit' dovrebbe essere sufficiente per garantire un input valido. –

+0

@nikc il punto è che non è possibile impedire a qualcuno di inviare una richiesta contenente valori di parametri manipolati arbitrariamente, quindi in genere non si devono assumere ipotesi su quali parametri del modulo possono essere utilizzati. –

+0

XSS è ancora un problema, anche se non stai memorizzando i dati e mostrandoli ad altri. guarda la sezione "Non persistente" nella pagina di wikipedia che hai collegato a –

3

Si dovrebbe sempre preoccuparsi della sicurezza. Non ogni buco di sicurezza è costituito dall'uso sbagliato di mysql :-)

1

Se si suppone get a contenere solo un uso intero

$n = intval($_GET['n'])

2

L'iniezione SQL non è applicabile nel tuo caso, perché si non stanno usando un database per il tuo sito. Ma dovresti considerare altri problemi di sicurezza per il tuo sito, ad esempio cross site scripting.

Se si utilizza una variabile da GET, considerare sotto url:

index.php?myvar=<script>alert(document.cookie);</script> 

Gli hacker sono in grado di fornire sopra URL in un numero esadecimale modi, UTF, ecc

Un cattivo ragazzo può modifica le tue variabili GET per eseguire attacchi XSS. XSS è la radice di molti buchi di sicurezza. Devi considerare anche questo.

Se vi aspettate un tipo numerico dal GET var quindi prendere in considerazione sottostante Codice:

$myvar = (int) $_GET['your_var']; 

si dovrebbe usare htmlentities funzione per prevenire gli attacchi XSS.

+0

Si noti che XSS è irrilevante quando l'input potenzialmente dannoso viene semplicemente utilizzato per costruire una pagina da visualizzare sullo stesso utente. XSS è solo un problema quando l'input di un utente viene mostrato ad altri. –

+1

@ Michael: "XSS è solo un problema quando l'input di un utente viene mostrato ad altri". Non sarebbe possibile ingannare un altro utente facendo clic su un collegamento dannoso che contiene un codice HTML da iniettare? Quindi il javascript iniettato ecc. Viene eseguito nel loro browser come loro. –

+1

Concordo pienamente con Tom Haigh. È facile ingannare gli altri a fare clic sul tuo link. Se hanno un account sul sito e il link consente l'iniezione di XSS, sia esso non persistente, quindi è possibile eseguire il contenuto della pagina e inviarlo al server, oppure chiamare le funzioni esposte dalla pagina che verrà eseguita come se fossero stati eseguiti su richiesta dell'utente. Perché consentire XSS se è possibile impedirlo? –

0

Controllare sempre l'input dell'utente e $ _GET e $ _POST per i contenuti dannosi. Addslashes, ereg_match e intval sono tuo amico ...

Se si riesce a farla franca, impostare la direttiva

allow_url_fopen = Off 

in php.ini

+1

Questa direttiva non dovrebbe essere disabilitata invece ...? –

+0

Whoops :) Risolto! – Powertieke

1

Se si aspetta un numero, non disinfettare l'input errato, negarlo.

if (!ctype_digit($user_input)) { 
    header('Location: error.php'); // or whatever page 
    exit; 
} 
+0

o semplicemente forzala: 'printf ("% u ", $ _GET ['n']);' – Svish

+0

Immagino che sia un gusto personale. Non permetto mai una cattiva richiesta correggendola: se è cattiva deve generare un errore. –

0

Mi piacerebbe anche richieste colpito la directory di immagini desiderato troppo, in quanto non si vuole che la gente la navigazione del file server con richieste come example.com/?q=../../.htaccess

Non sono sicuro di come sarebbe influenzare l'uscita, ma non può essere buono.

0

Non devi preoccuparti dell'iniezione SQL. Ma dovresti controllare i tuoi input così come sono usati nel codice HTML che generi. Immagina di dare questo link http://www.example.com/viewComic.php?id="/><script type="text/javascript>alert("XSS");</script><img src="22 a qualcuno. Questa persona avrà un piccolo pop-up proveniente dal tuo sito web. E un sacco di cose brutte possono essere fatte con javascript. Per ulteriori informazioni, puoi iniziare a leggere la pagina di wikipedia su XSS.

Quindi, si dovrebbe verificare che il numero che si aspetta sia un numero. Ad esempio con is_numeric.

Problemi correlati