Posso impedire gli attacchi XSS con la funzione MySQL REPLACE?

2

Posso impedire l'attacco XSS con la funzione MySQL REPLACE? È questo metodo sicuro e accettabile?

Esempio di seguito:

INSERT INTO persons(Name, Surname) 
VALUES(REPLACE('<script>alert("Test")</script>', '<script>', ''), 'Sample Value');
    
posta Ali 12.11.2016 - 23:27
fonte

3 risposte

7

Questo è un modo davvero efficace per tentare di proteggere la tua applicazione. Non provare mai a trasformare input come questo; è molto lontano dall'essere efficace nel suo obiettivo, non è mantenibile / estensibile, finirà per rovinare i tuoi dati.

La regola d'oro è quella di convalidare l'input e l'output di escape

Controlla il contenuto rispetto a un insieme di regole, rifiutalo e contrassegna un problema per i dati non conformi. Ogni volta che i dati passano da un dominio all'altro (ad es. Da PHP o python o PERL a mysql, o dal tuo programma a un flusso html) assicurati che la rappresentazione dei dati lo isola dal costrutto in cui viene iniettato.

Esistono buone librerie per l'uscita dall'output per una varietà di lingue e una varietà di destinazioni (incluso SQL e HTML). Inizia imparando come usarli in modo efficace.

    
risposta data 12.11.2016 - 23:47
fonte
5

No, non puoi, e non dovresti.

Questo non è assolutamente un metodo accettabile. Il filtraggio è estremamente difficile e sicuramente ti sbagli se provi a implementarlo da solo. I filtri dovranno anche essere aggiornati con lo standard HTML esteso (HTML5 ad esempio ha aggiunto un sacco di nuovi attributi degli eventi che possono essere utilizzati per inserire un contesto JavaScript).

L'unica difesa adeguata contro XSS è la codifica in base al contesto quando si stampano valori. Idealmente, dovresti utilizzare un motore di template per codificare automaticamente tutto l'output in HTML e codificare JavaScript manualmente quando necessario.

Un semplice POC per bypassare il filtro sarebbe:

<img src=x onerror=alert(1)> 

Ci sono molti più tag e attributi che possono portare a XSS. Inoltre, dovresti anche preoccuparti dell'iniezione di HTML e CSS.

Se si desidera un filtro aggiuntivo quando si recupera l'input, che non dovrebbe mai essere l'unica linea di difesa, ma che è consigliata come difesa in profondità, è necessario adattarla a ciascun campo di input. I nomi sono difficili, quindi non li filtrerei, ma quando sai che ti aspetti solo es. Alfanum, puoi filtrare per quello. Potresti anche usare qualche libreria come HTMLPurifier. Ma ancora una volta, lo consiglierei solo come difesa in profondità o se hai davvero bisogno di alcuni tag HTML che vengono analizzati (che non è il caso dei nomi, i nomi possono contenere caratteri come ' o anche " e < , ma certamente non dovrebbero essere analizzati come HTML dal browser).

    
risposta data 12.11.2016 - 23:48
fonte
2

Ciò non impedirà l'XSS riflesso. Questo non sta filtrando tutti gli script possibili.

In breve, questo non preverrà l'XSS.

    
risposta data 12.11.2016 - 23:33
fonte

Leggi altre domande sui tag