2010-06-03 19 views
5

Esistono degli script predefiniti che è possibile utilizzare per PHP/MySQL per impedire gli script sul lato server e le iniezioni JS?Prevenzione degli script sul lato server, XSS

Conosco le funzioni tipiche come htmlentities, caratteri speciali, sostituzione di stringhe ecc. Ma c'è un bit di codice o una funzione che è un fail-safe per tutto?

Qualsiasi idea sarebbe grandiosa. Molte grazie :)

MODIFICA: Qualcosa di generico che rimuove tutto ciò che potrebbe essere pericoloso, vale a dire. maggiore o minore di segni, punto e virgola, parole come "DROP", ecc.?

Fondamentalmente voglio solo comprimere tutto per essere alfanumerico, immagino ...?

+1

Intendevi "_cross-site_ scripting" invece di "scripting lato server"? Oppure ti stavi riferendo al codice remoto i NCLUSIONE/esecuzione? – janmoesen

+0

scusate, si lo faccio – Tim

risposta

4

Non inviare mai alcun dato di alcun tipo allo stream HTML che non ha passato attraverso htmlspecialchars() e il gioco è fatto. Regola semplice, facile da seguire, sradica completamente qualsiasi rischio XSS.

Come programmatore è il tuo lavoro.

È possibile definire

function h(s) { return htmlspecialchars(s); } 

se htmlspecialchars() è troppo tempo per scrivere 100 volte al file PHP. D'altra parte, l'utilizzo di htmlentities() non è affatto necessario.


Il punto chiave è: c'è il codice e ci sono dati. Se si mescolano i due, ne derivano cose cattive.

Nel caso dell'HTML, il codice è elementi, nomi di attributi, entità, commenti. I dati sono tutto il resto. I dati devono essere sfuggiti a per evitare di essere scambiati per il codice.

Nel caso di URL, il codice è lo schema, il nome host, il percorso, il meccanismo della stringa di query (?, &, =, #). I dati sono tutto nella stringa di query: nomi e valori dei parametri. Il valore deve essere evaso per evitare di essere scambiato per il codice con.

URL incorporati in HTML deve essere doppiamente sfuggiti (per URL-fuga e HTML-fuga) per garantire una corretta separazione del codice e dati.

I moderni browser sono in grado di analizzare il markup incredibilmente rotto e errato in qualcosa di utile. Questa capacità non dovrebbe essere sottolineata, però. Il fatto che qualcosa funzioni (come gli URL in <a href> senza l'applicazione di escape HTML corretta) non significa che sia corretto o corretto farlo. XSS è un problema che affonda le radici in a) persone inconsapevoli della separazione di dati/codice (ad esempio "fuga") o di quelli che sono sciatti eb) persone che cercano di essere intelligenti su quale parte di dati non è necessario sfuggire.

XSS è abbastanza facile da evitare se ci si assicura di non rientrare nelle categorie a) eb).

+0

No, non è così. Se lo metti come nodo di testo, allora sei sicuro (supponendo che non sia all'interno di uno script o di un elemento di stile). I valori degli attributi d'altra parte? '' (in questi giorni la maggior parte dei browser protegge da questo, ma ci sono altri rischi) – Quentin

+0

Ok, ma quando un utente invia SQL nell'URL? Ad esempio "DROP table users" – Tim

+0

"Non emetterei mai alcun bit di * dati forniti dall'utente *" direi.I modelli di sito possono sfuggire al pericolo :) –

1

No, non c'è. I rischi dipendono da ciò che si fa con i dati, non si può scrivere qualcosa che rende i dati sicuri per tutto (a meno che non si voglia scartare la maggior parte dei dati)

+0

Beh, sì, ma non stiamo parlando in modo così generico quando si tratta di web e PHP. Ci sono ovviamente determinati caratteri e stringhe che vorrete disabilitare, quindi mi piacerebbe un elenco abbastanza generico di tali cose, se possibile. Fondamentalmente voglio solo informazioni alfanumeriche. – Tim

+0

Quali alfabeti? Vuoi proibire alle persone di usare trattini e punti fermi? Raramente è così semplice. – Quentin

-1

Per rispondere alla tua edizione: tutto tranne i simboli <> non ha nulla a che fare con XSS.
E htmlspecialchars() può gestirli.

Non v'è nulla di male nella parola DROP table nel testo della pagina;)

+0

E per quanto riguarda "" 'per chiudere un attributo e poi continuare con il tuo codice?' 'sembra essere piuttosto XSS-y per me. :-) – janmoesen

+0

@janm' htmlspecialchars' prenderà le virgolette doppie quindi dovresti finire con ''. Ma con le immagini, dovresti controllare che l'immagine esista prima di tutto per evitare immagini rotte. – DisgruntledGoat

+0

semplicemente non è corretto.vedi http://stackoverflow.com/questions/2964424/to-htmlencode-or-not-to-htmlencode-user -input-on-web-form-asp-net-vb/2965444 # 2965444 – Cheekysoft

-3

per i dati utente pulita usare html_special_chars(); str_replace() e altri funcs per tagliare i dati non sicuri.

+0

'mysql_escape_string' è deprecato e non gestisce correttamente la codifica dei caratteri. – Quentin

+0

ok. in quella situazione puoi usare str_replace per pulire la tua richiesta. – GOsha

+1

str_replace è anche il peggiore. e get_magic_quotes_gpc non ha nulla a che fare con l'escape del database. e l'intero concetto di funzione è stupido - fa doppio fuggire! –

1

c'è un semplice bit di codice o una funzione che è un sistema sicuro per tutto?

No.

La rappresentazione dei dati in uscita PHP deve essere convertito/codificati specificamente secondo dove sta andando. E quindi dovrebbe essere convertito/codificato solo nel punto in cui lascia PHP.

C.

3

penso Google-caja forse una soluzione. Scrivo un analizzatore di contaminazioni per l'applicazione web java per rilevare e prevenire XSS automaticamente. Ma non per PHP. Penso che imparare a usare caja non sia male per lo sviluppatore web.

0

È possibile fare riferimento a OWASP per ottenere una maggiore comprensione di attacchi XSS:

https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

Per evitare attacchi di JS, si può provare questo progetto fornito da open eccellenza fonte:

https://www.opensource-excellence.com/shop/ose-security-suite.html

il mio sito web ha avuto gli attacchi js prima e questo strumento mi aiuta a bloccare tutti gli attacchi ogni giorno. Penso che possa aiutarti a evitare il problema.

Inoltre, è possibile aggiungere un filtro nello script php per filtrare tutti gli attacchi js, qui è un modello che può fare il lavoro:

if (preg_match ('/ (:? [."] Sceneggiatura \ s *() | (:? \ $ \ $ \ s * (\ s * [\ w "]) | (:?/[\ w \ s] + /) | (:.? = \ s */\ w +/\ s *.) | (? :(?: this | window | top | parent | frame | self | content) [\ s * [(, "] \ s [\ w \ $]) | (?:, \ s * nuovo \ s + \ w + \ s * [,;)/ms ', strtolower ($ POST [' VARIABLENAME ']))) { filter_variable ($ POST [' VARIABLENAME ']); }