L'iniezione SQL è ancora possibile dopo il filtraggio?

-2

Sto solo rivedendo uno script che voglio usare per il mio sito web. L'autore filtra tutti i dati inseriti dall'utente ( $_POST e $_GET ) con questa funzione:

function XSSCheck($value) {
    return preg_replace(
        array('/&(?!amp;|quot;|nbsp;|gt;|lt;|laquo;|raquo;|copy;|reg;|#[0-9]{1,5};|#x[0-9A-F]{1,4};)/', '/#(?![0-9]{1,5};|x[0-9A-F]{1,4};)/',       '|<|',  '|>|',  '|"|',      "|'|"   ),
        array('&amp;', '&#35;', '&lt;', '&gt;', '&#34;', '&#39;'),
        stripslashes($value)
    );
}

Se filtro una stringa con quella, sarebbe possibile iniettare in questa query SQL, per esempio?

SELECT * FROM table WHERE ID = '{$_REQUEST['id']}'

L'ho provato già ma non ho trovato alcun modo per farlo.

    
posta Richard 19.09.2015 - 18:54
fonte

2 risposte

6

Le blacklist sono una cattiva idea per la protezione da vulnerabilità come XSS e SQLi. Il motivo è che ci sono così tante tecniche di codifica, comportamenti del browser, incongruenze dei server di database e bug del web server per spiegare che non sarai mai in grado di creare una lista nera di capacità sufficiente.

Per questa funzione, non sarà sufficiente per l'iniezione XSS o SQL. Ad esempio, che dire delle iniezioni SQL al di fuori di stringhe letterali? Per entrambe le classi di vulnerabilità, sono state riconosciute correzioni appropriate.

XSS

  • Whitelist dove appropriato: un numero è un numero, una stringa è composta da A-Za-z0-9, ecc.
  • Nei casi in cui non è possibile eseguire la whitelist, ad esempio stringhe o commenti di ricerca in formato libero, l'output codifica.

Iniezione SQL

  • Whitelist dove appropriato: un numero è un numero, una stringa è composta da A-Za-z0-9, l'utente può solo selezionare dalle tabelle specificate, ecc.
  • Utilizza query parametrizzate: PHP lo supporta. Ancora meglio, usa un ORM in modo che si prenda cura di te per te.
risposta data 19.09.2015 - 19:54
fonte
1

Non puoi usare quella funzione per prevenire le iniezioni SQL come @NeilSmithline ti ha commentato. L'autore di quella funzione aveva ragione nel chiamarlo XSSCheck() perché è ciò che puoi usare per.

Sento che sei solo confuso. Iniezione SQL è una vulnerabilità sul lato server dove XSS è una vulnerabilità sul lato client . Anche le tecniche utilizzate per prevenire questi due attacchi sono diverse. Ti suggerisco di mettere questa grande differenza in mente e di leggere oltre queste due nozioni.

P.S.

Si noti che alla funzione mancano alcuni caratteri speciali come i backslash.

    
risposta data 19.09.2015 - 19:38
fonte

Leggi altre domande sui tag