Consigli sulla sicurezza di un sito
Consigli sulla sicurezza di un sito postato il 28/08/2014 15:46:39 nel forum programmazione, open source e hosting
Ciao a tutti,
sto costruendo un pbf da zero (forum compreso) e, dopo aver programmato tutte le funzioni basilari del sito, sto iniziando a lavorare sulla sicurezza.
Dal momento che non sono molto esperto, mi sono documentato in giro, ma alcune cose non mi sono chiare.
Difendersi da attacchi XSS
htmlentities() o strip_tags()?
Secondo voi quale dei due sistemi di sicurezza è migliore? La mia idea era quella di dare la possibilità agli utenti di usare un semplice codice html (<b>, <i>, <u>) per poter personalizzare, di poco, i loro post.
strip_tags() rappresenta una valida alternativa a htmlentities()? Oppure è meglio utilizzare un htmlentities() e, prima di inviare il db la stringa effettuare una conversione (con uno script js) di tutti i tag che io ho ammesso?
Inoltre, dal momento che sul db io ho una stringa che contiene entità html, c'è rischio per la sicurezza al momento della riconversione?
Ed è sufficiente solo questo accorgimento per evitare attacchi XSS?
Difendersi da attacchi hijacking
Una volta eseguito il login, salvo i dati che mi interessano in variabili $_SESSION; di conseguenza non ci sono cookie nel pc dell'utente (almeno in teoria) che provengano dal mio forum e che contengano le sue informazioni personali.
Il punto è uno: sono protetto, con questo sistema, da attacchi hijacking o no?
Infine, quali altri possibili rischi possono esserci (che non ho considerato)?
Pagine → 1
28/08/2014 16:48:05 e modificato da blancks il 28/08/2014 16:56:56
bilboloit ha scritto:
htmlentities() o strip_tags()?
Secondo voi quale dei due sistemi di sicurezza è migliore?
Nessuno dei due.
La prevenzione dagli XSS, per farla semplice, dipende dal dato che ricevi e dal contesto di visualizzazione dello stesso.
Devi considerare che gli XSS possono essere inseriti in differenti modalità.
Come semplice iniezione del tag script:
<img src=""><script>alert(document.cookie);</script><none inesistente="">
Come url, sfruttando il comando javascript che può essere adoperato in differenti situazioni:
<a href="javascript:alert(document.cookie);">
<img src="javascript:alert(document.cookie);">
<div style="background: url(javascript:alert(document.cookie));">
Come evento associato ad un elemento del dom:
<img src="url_img.png " onload="alert(document.cookie);">
C'è molto di cui discutere, ma alla fine il discorso è sempre quello di non fidarsi mai di nessun input utente e verificare che il dato sia valido per quel che sono i nostri scopi di utilizzo.
PHP offre la possibilità di utilizzare sia le espressioni regolari, grazie a funzioni come preg_match http://it2.php.net/preg_match ↗, sia un set di filtri nativi del sistema piuttosto affidabili e semplici da usare che sono adoperabili mediante la funzione filter_var http://it2.php.net/manual/it/function.filter-var.php ↗.
Questo come discorso generale.
La mia idea era quella di dare la possibilità agli utenti di usare un semplice codice html (<b>, <i>, <u>) per poter personalizzare, di poco, i loro post.
strip_tags() rappresenta una valida alternativa a htmlentities()? Oppure è meglio utilizzare un htmlentities() e, prima di inviare il db la stringa effettuare una conversione (con uno script js) di tutti i tag che io ho ammesso?
Mai basare un controllo di sicurezza sul client, ogni script che gira lato client è facilmente aggirabile.
Tutti i controlli necessari vanno obbligatoriamente effettuati lato server.
Tuttavia, in questa situazione il tuo problema si complica perché vuoi consentire l'utilizzo dell'html in sole alcune componenti in un area liberamente editabile dall'utente.
A questo punto, piuttosto che realizzare il tuo personale filtro, il mio suggerimento è di affidarsi ad HTML Purifier http://htmlpurifier.org/ ↗ che ha dimostrato di saper fare più che bene il suo lavoro.
Difendersi da attacchi hijacking
Una volta eseguito il login, salvo i dati che mi interessano in variabili $_SESSION; di conseguenza non ci sono cookie nel pc dell'utente (almeno in teoria) che provengano dal mio forum e che contengano le sue informazioni personali.
Certo che ci sono: quando usi le variabili $_SESSION, sul server quei dati vengono scritti in un file di testo in una cartella specifica e contrassegnati da un id.
Per associare correttamente l'utente al file contenente le giuste informazioni, sul pc dell'utente viene rilasciato un cookie contenente quell'id di sessione.
Il punto è uno: sono protetto, con questo sistema, da attacchi hijacking o no?
Per cui no, non hai attuato nessuna misura di prevenzione in questo modo.
Per difendersi efficacemente da attacchi di quel tipo bisogna cercare di impedire in tutti i modi che la tua applicazione web possa farsi suggerire l'id di sessione con cui inizializzare la pagina.
Questo lo puoi fare impostando in modo appropriato alcuni valori di configurazioni di php di modo, per esempio, da non accettare il parametro PHPSESSID passato per url oppure di impostare il cookie di modo che si distrugga alla chiusura della finestra del browser (perché quando distruggi una sessione il cookie ad essa associata non viene eliminato, ma continua a sostare sul pc dell'utente):
ini_set('session.cookie_httponly', 1);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_lifetime', 0);
Ti lascio alla documentazione per capire più nello specifico http://it2.php.net/manual/en/ini.list.php ↗, se poi hai altri dubbi esponi tranquillamente nel topic che, nel caso cercherò di chiarificare ulteriormente.
Sempre riguardo il login, è una buona pratica rigenerare l'id associato alla sessione così da avere un ulteriore layer di protezione e questo lo puoi fare mediante la funzione:
session_regenerate_id(true);
Per ulteriori approfondimenti rimando sempre alla documentazione ufficiale http://it2.php.net/manual/en/function.session-regenerate-id.php ↗
Edit: Per ulteriori consigli legati all'ambito di sicurezza dai una sbirciata a questo topic https://www.gdr-online.com/readforum.asp?id=124978 ↗ se non l'hai già fatto.
Discussione seguita da
Pagine → 1
Rispondi alla Discussione Segui Discussione Inoltra Discussione Forum Programmazione, Open Source e Hosting Elenco Forum
Articoli, Interviste e altre Risorse!
Hero Wars ↗
Seconda Era ↗