[risolto] Prevenire attacchi hacker

andreto

Utente Attivo
5 Dic 2012
88
0
0
Buongiorno a tutti,
stavo scrivendo il codice per il form login però mi sono fermato pensando ai vari attacchi che potrebbe subire il mio sito.

Ieri ho letto centinaia di pagine su internet accorgendomi dell'esistenza di moltissimi attacchi diversi da parte di hacker.

Per ora ho pensato a:
sql-injection
brute-force
codice captcha
password criptate nel db
dati sensibili inviati tramite post

Considerando che è impossibile la sicurezza totale e che gli attacchi potrebbero essere infiniti, da quali altri varrebbe la pena proteggersi?

A cosa dovrei fare particolare attenzione?

Grazie :fonzie:
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Ti do alcuni suggerimenti
-Filtra ogni variabile pubblica(posts,get,cookies,headers,etc...) che vai ad inserire nel db
-Filtra ogni valore inserito dall'utente nel db con htmlspecialchars() o strip_tags() quando lo vai a stampare
-Crea l'hash della password utilizzando dei salt personalizzati, non usare solo il valore della password (es. sha1($sal1.$_POST['pass'].$salt2))
-Se gli utenti detengono dei dati sensibili, come numeri di carte di credito o simili criptali usando algoritmi come AES o il TripleDES
-Includi le pagine staticamente o verificando che esistano in una relativa path, non fare cose del tipo ?page=/include/page1.html
-Non utilizzare captcha troppo semplici, ci sono softwares che riescono a bypassarli anche con un ratio di successo del 90%
-Nel modulo di login imposta un massimo di richieste per tot minuti basandoti sull'ip
-Per l'autenticazione utilizza un cookie con l'hash di un token dell'utente e il suo username e impostalo http-only
 
Ultima modifica:

andreto

Utente Attivo
5 Dic 2012
88
0
0
Ti do alcuni suggerimenti
-Filtra ogni variabile pubblica(posts,get,cookies,headers,etc...) che vai ad inserire nel db
-Filtra ogni valore inserito dall'utente nel db con htmlspecialchars() o strip_tags() quando lo vai a stampare
-Crea l'hash della password utilizzando dei salt personalizzati, non usare solo il valore della password (es. sha1($sal1.$_POST['pass'].$salt2))
-Se gli utenti detengono dei dati sensibili, come numeri di carte di credito o simili criptali usando algoritmi come AES o il TripleDES
-Includi le pagine staticamente o verificando che esistano in una relativa path, non fare cose del tipo ?page=/include/page1.html
-Non utilizzare captcha troppo semplici, ci sono softwares che riescono a bypassarli anche con un ratio di successo del 90%
-Nel modulo di login imposta un massimo di richieste per tot minuti basandoti sull'ip
-Per l'autenticazione utilizza un cookie con l'hash di un token dell'utente e il suo username e impostalo http-only

Grazie per la celere risposta, avrei ancora qualche domanda:

1) al posto di htmlspecialchars() posso utilizzare addslashes(), FILTER_SANITIZE_STRING oppure un'espressione regolare?
2) In base a cosa capisco se un captcha è semplice o no?
3) Intendi il cookie salvato in locale o di sessione? Cosa vuol dire impostalo http-only?
4) Devo filtrare tutti gli input dove l'utente può scrivere? Ad esempio input sia text che password sia nel modulo login che nel modulo registrazione?
5) Una volta loggato devo filtrare anche le varie textarea?
6) Su ogni pagina php devo filtrare ogni variabile che riceve?

7) Ho letto che alcuni rigenerano la sessione e/o impostando un campo input text hidden con l'ID di sessione nel modulo login e registrazione. Sono necessari?

Ancora due domande che non c'entrano con php ma comunque sono sempre inerente al discorso:
8) Ho un codice Ajax passa ad una pagina php con il metodo GET la variabile dell'email, la pagina php si occupa di cercare in mySql se l'email appena inserita dall'utente esiste già, se esiste ritorna ad Ajax 1 altrimenti 0.
Sarebbe il caso di impostare qualche filtro anche in questa pagina php dato che se la apro senza passare valori stampa 1 a video?
Meglio passare l'email con il metodo POST?
9) Un malintenzionato, modificando il mio Javascript o creandosi una pagina in locale potrebbe in qualche modo accedere al database anche inserendo i vari filtri su ogni pagina php?

Non odiarmi :rolleyes: mi bastano anche risposte molto sintetiche.

Grazie ancora,
ciao :fonzie:
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Grazie per la celere risposta, avrei ancora qualche domanda:

1) al posto di htmlspecialchars() posso utilizzare addslashes(), FILTER_SANITIZE_STRING oppure un'espressione regolare?
2) In base a cosa capisco se un captcha è semplice o no?
3) Intendi il cookie salvato in locale o di sessione? Cosa vuol dire impostalo http-only?
4) Devo filtrare tutti gli input dove l'utente può scrivere? Ad esempio input sia text che password sia nel modulo login che nel modulo registrazione?
5) Una volta loggato devo filtrare anche le varie textarea?
6) Su ogni pagina php devo filtrare ogni variabile che riceve?

7) Ho letto che alcuni rigenerano la sessione e/o impostando un campo input text hidden con l'ID di sessione nel modulo login e registrazione. Sono necessari?

Ancora due domande che non c'entrano con php ma comunque sono sempre inerente al discorso:
8) Ho un codice Ajax passa ad una pagina php con il metodo GET la variabile dell'email, la pagina php si occupa di cercare in mySql se l'email appena inserita dall'utente esiste già, se esiste ritorna ad Ajax 1 altrimenti 0.
Sarebbe il caso di impostare qualche filtro anche in questa pagina php dato che se la apro senza passare valori stampa 1 a video?
Meglio passare l'email con il metodo POST?
9) Un malintenzionato, modificando il mio Javascript o creandosi una pagina in locale potrebbe in qualche modo accedere al database anche inserendo i vari filtri su ogni pagina php?

Non odiarmi :rolleyes: mi bastano anche risposte molto sintetiche.

Grazie ancora,
ciao :fonzie:
1)E' più sicuro il primo, nel caso che inserisci i valori in alcuni attributi di elementi dom(come a href, frames, imgs, etc...) aggiungi ulteriori controlli
2)Basta uno con una buona distorsione e diverse lettere (es. recaptcha)
3)Se http-only tutti i browser più usati/aggiornati non permetteranno l'accesso del cookie al dom, quindi non potrà essere usato in eventuali xss
4)Filtra e controlla TUTTI i parametri spediti dall'utente
5)^
6)^
7)Implementa una protezione csrf generando un hash di time() o uniqid() con un salt personalizzato sempre
(es. $_SESSION['token'] = sha1(uniqid().$salt.time())), anche se per il modulo di login non è necessario anzi è meglio un captcha
8)Si meglio e fai uscire di default 0
9)Se hai reso sicure tutte le variabili che può spedire l'utente per interagire col database non ci sono rischi, se poi aggiungi ulteriori controlli di validazione etc... ancora meno, poi tutto è possibile
 
Ultima modifica:

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
8.1)Ricontrolla l'email comunque, quando viene fatto il submit del form alla fine
 

andreto

Utente Attivo
5 Dic 2012
88
0
0
8.1)Ricontrolla l'email comunque, quando viene fatto il submit del form alla fine

Ti ringrazio per le risposte che mi hai dato :D

Nel modulo registrazione ad esempio ho fatto così:
L'utente compila i campi email - ripeti email e password, preme su registrati.
Il bottone registrati chiama una funzione di javascript che verifica se l'email è formalmente corretta, se le 2 email sono uguali e se la password rispetta i criteri da me impostati.
Tramite ajax controllo se l'email appena inserita esiste già nel database.
Se esiste da l'errore, se non esiste prosegue con il submit.
Vengono passati tramite post i valori di email, ripetiemail e password alla pagina registrazione.php
In questa pagina verifico soltanto che le 2 email siano uguali e formalmente corrette e che la password rispetti i criteri.

Non ho inserito lo stesso controllo che avevo fatto in ajax, ovvero controllare se l'email esiste già.

Secondo te dovrei farlo anche in questa pagina php?
Un cattivello potrebbe ricrearsi il form e passare direttamente a questa pagina php email e password tramite post bypassando i vari controlli di javascript e ajax?

Se così fosse, non avendo fatto il controllo nella pagina php, il sistema farebbe registrare una seconda email uguale.

Intendevi questi controlli fatti 2 volte sia lato client che server?
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Ti ringrazio per le risposte che mi hai dato :D

Nel modulo registrazione ad esempio ho fatto così:
L'utente compila i campi email - ripeti email e password, preme su registrati.
Il bottone registrati chiama una funzione di javascript che verifica se l'email è formalmente corretta, se le 2 email sono uguali e se la password rispetta i criteri da me impostati.
Tramite ajax controllo se l'email appena inserita esiste già nel database.
Se esiste da l'errore, se non esiste prosegue con il submit.
Vengono passati tramite post i valori di email, ripetiemail e password alla pagina registrazione.php
In questa pagina verifico soltanto che le 2 email siano uguali e formalmente corrette e che la password rispetti i criteri.

Non ho inserito lo stesso controllo che avevo fatto in ajax, ovvero controllare se l'email esiste già.

Secondo te dovrei farlo anche in questa pagina php?
Un cattivello potrebbe ricrearsi il form e passare direttamente a questa pagina php email e password tramite post bypassando i vari controlli di javascript e ajax?

Se così fosse, non avendo fatto il controllo nella pagina php, il sistema farebbe registrare una seconda email uguale.

Intendevi questi controlli fatti 2 volte sia lato client che server?
Ti consiglio di fare un form unico e poi spedirlo, così esegui tutti i controlli in una sola volta e riporti gli errori via ajax
 

andreto

Utente Attivo
5 Dic 2012
88
0
0
Scusami Nefyt non riesco a seguirti.

Io ho questo form:

HTML:
<form action="registrazione.php" method="post" name="modulo">
    <table>
      <tr>
        <td>Email:</td>
        <td><input type="email" name="email" /></td>
      </tr>
      <tr>
        <td>Ripeti Email:</td>
        <td><input type="email" name="remail" /></td>
      </tr>
      <tr>
        <td>Password:</td>
        <td><input type="password" name="password" /></td>
      </tr>  
      <tr>
        <td></td>
        <td class="centrato"><button type="button" onclick="verificadatireg()">Registrati</button></td>
      </tr>   
    </table>
  </form>

La funzione verificadatireg() controlla tramete JS che tutto sia corretto e tramite Ajax che l'email non esista già nel DB.
Se tutto è ok allora:
HTML:
document.modulo.submit();
A questo punto i valori degli input vengono passati a registrazione.php
che si occuperà di ricontrollare tutto allo stesso modo della funzione sopra indicata e se tutto è ok li inserisce nel db.

Non riesco a capire come applicare questi 2 qui sotto?

Ti consiglio di fare un form unico e poi spedirlo, così esegui tutti i controlli in una sola volta e riporti gli errori via ajax

Ricontrolla l'email comunque, quando viene fatto il submit del form alla fine

Forse sarà così:
eliminando action="registrazione.php" e facendo tutti i controlli tramite la pagina php chiamata da Ajax?

HTML:
<form method="post" name="modulo">
    <table>
      <tr>
        <td>Email:</td>
        <td><input type="email" name="email" /></td>
      </tr>
      <tr>
        <td>Ripeti Email:</td>
        <td><input type="email" name="remail" /></td>
      </tr>
      <tr>
        <td>Password:</td>
        <td><input type="password" name="password" /></td>
      </tr>  
      <tr>
        <td></td>
        <td class="centrato"><button type="button" onclick="verificadatireg()">Registrati</button></td>
      </tr>   
    </table>
  </form>

Se questa è giusta, puoi aiutarmi sulla seconda?

Ricontrolla l'email comunque, quando viene fatto il submit del form alla fine

Grazie
 
Ultima modifica:

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
In che senso come applicarlo? Devi eseguire gli stessi controlli sia via ajax sia durante il submit finale per essere sicuro, in pratica potresti mettere i controlli in una sola pagina(registrazione.php) e cambiare l'output a seconda della chiamata se via ajax o no

Esempio
Ajax => registrazione.php => risposta in json => con il js stampi gli errori
Submit => registrazione.php => risposta diretta


Non capisco, cosa intendi sennò?

Se intendevi il controllo csrf, non serve nei form di registrazione o di login ti basta un captcha, quello lo devi implementare nei form interni
 
Ultima modifica:

andreto

Utente Attivo
5 Dic 2012
88
0
0
In che senso come applicarlo? Devi eseguire gli stessi controlli sia via ajax sia durante il submit finale per essere sicuro, in pratica potresti mettere i controlli in una sola pagina(registrazione.php) e cambiare l'output a seconda della chiamata se via ajax o no

Esempio
Ajax => registrazione.php => risposta in json => con il js stampi gli errori
Submit => registrazione.php => risposta diretta


Non capisco, cosa intendi sennò?

Se intendevi il controllo csrf, non serve nei form di registrazione o di login ti basta un captcha, quello lo devi implementare nei form interni

Perfetto, ora ho capito.

Posso anche fare tutti i controlli via ajax in questo modo:
Ajax => registrazione.php => risposta in json => con il js stampi gli errori
se non ci sono errori prosegue registrando l'utente.
Tutto questo eliminando action="registrazione.php" dal form e document.modulo.submit(); da JS?
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Perfetto, ora ho capito.

Posso anche fare tutti i controlli via ajax in questo modo:
Ajax => registrazione.php => risposta in json => con il js stampi gli errori
se non ci sono errori prosegue registrando l'utente.
Tutto questo eliminando action="registrazione.php" dal form e document.modulo.submit(); da JS?
Se i dati dell'utente vengono memorizzati durante la verifica in ajax si puoi fare anche cosi
 

andreto

Utente Attivo
5 Dic 2012
88
0
0
Se i dati dell'utente vengono memorizzati durante la verifica in ajax si puoi fare anche cosi

Sei un grande, per adesso

grazie%u00252Bdi%u00252Bcuore.png
 

andreto

Utente Attivo
5 Dic 2012
88
0
0
Ti do alcuni suggerimenti
-Filtra ogni variabile pubblica(posts,get,cookies,headers,etc...) che vai ad inserire nel db
-Filtra ogni valore inserito dall'utente nel db con htmlspecialchars() o strip_tags() quando lo vai a stampare
-Crea l'hash della password utilizzando dei salt personalizzati, non usare solo il valore della password (es. sha1($sal1.$_POST['pass'].$salt2))
-Se gli utenti detengono dei dati sensibili, come numeri di carte di credito o simili criptali usando algoritmi come AES o il TripleDES
-Includi le pagine staticamente o verificando che esistano in una relativa path, non fare cose del tipo ?page=/include/page1.html
-Non utilizzare captcha troppo semplici, ci sono softwares che riescono a bypassarli anche con un ratio di successo del 90%
-Nel modulo di login imposta un massimo di richieste per tot minuti basandoti sull'ip
-Per l'autenticazione utilizza un cookie con l'hash di un token dell'utente e il suo username e impostalo http-only

Scusatemi se riapro dopo 2 anni questa discussione però ho bisogno di questo chiarimento:
Includi le pagine staticamente o verificando che esistano in una relativa path, non fare cose del tipo ?page=/include/page1.html

Non capisco come, quando e perchè avrei potuto/dovuto utilizzare un percorso di quel tipo rispetto ad uno statico.
Io finora ho sempre scritto percorsi del tipo "/funzioni/calcolacf.php".
Che tipo di attacco potrebbe avere?

Grazie
 
Discussioni simili
Autore Titolo Forum Risposte Data
L (risolto) MySQL 0
B getElementById su piu id(Risolto) Javascript 7
L Esercitarsi con Js [RISOLTO] Javascript 4
C [RISOLTO]Inserimento variabile php in input html PHP 20
L risolto visualizzazione e ordinamento dati PHP 1
moustache [RISOLTO] SQL PHP IIS PHP 8
Sergio Unia Ricezione email con destinatari multipli [Risolto] PHP 2
L update tabelle in php mysql [risolto] PHP 6
M Semplice visualizzatore di immagini [risolto con plugin wp] PHP 7
L [RISOLTO] Stampa a video risultato count in html PHP 13
L [RISOLTO] Eliminare una discussione creata PHP 3
tomorc [HTML] Problema con scroll bar (risolto) HTML e CSS 0
A [PHP] Problema query insert [RISOLTO] PHP 14
B [PHP] recuperare IP dei server in load balancing [RISOLTO] PHP 3
K [RISOLTO] Problema Griglia Php+Mysql PHP 13
S [RISOLTO] aggiorna tabella da select option asp classic Classic ASP 7
elpirata [RISOLTO][Javascript] Datapicker e autocompletamento campo input Javascript 2
elpirata [RISOLTO][Mysql] Problema insert valori apostrofati MySQL 1
elpirata [RISOLTO][Mysql] Contare le occorrenze in un campo tipo varchar MySQL 2
G [MS Access] Gestione biglietti [RISOLTO] MS Access 2
G [MS Access] Casella combinata & Query [RISOLTO] MS Access 4
G [MS Access] Query mese corrente con conteggio [RISOLTO] MS Access 2
M [RISOLTO]Windows media player non mi funziona più su win 10 pro 64 bit Windows e Software 2
C [RISOLTO][PHP] Errore di sintassi PHP 8
IT9-Gpp [RISOLTO] Leggere variabile restituita da success Ajax 3
Kolop [RISOLTO][PHP] Problema Pagination PHP 2
C [RISOLTO][PHP] Funzione ONclick PHP 14
C [RISOLTO][PHP] Conteggio righe di una tabella PHP 4
N [PHP] Utilizzo variabili di sessione [Risolto] PHP 13
Tommy03 [RISOLTO][PHP] Webserver o devserver? PHP 2
Sergio Unia Recupero dati da una vecchia versione MySql [Risolto] MySQL 4
spider81man [PHP] Problemi cancellazione dato su DB [RISOLTO] PHP 1
A [RISOLTO]Inserimento Immagini da pc a MySql PHP 15
A [PHP] RISOLTO Invio Mail con Tabella PHP 2
felino Risolto - [Wordpress][WooCommerce] PayPal Checkout e campi di fatturazione WordPress 2
elpirata [PHP][RISOLTO] Sommare gli importi estratti da un ciclo while PHP 3
elpirata [PHP][RISOLTO] Effettuare la somma dei tempi di lavorazione PHP 3
elpirata [PHP] [RISOLTO]Sovrascrivere testo in una tabella PHP 2
A [RISOLTO]Recuperare dati inviati con json tramite php PHP 4
C [RISOLTO][PHP] Passaggio variabili senza refresh di pagina PHP 7
elpirata [PHP][RISOLTO] Errore di tipo Notice: Undefined index - Come risolvere quando si hanno tante var PHP 10
S Problema in PHP per invio file XML - RISOLTO- PHP 8
A [Javascript] [RISOLTO] Doppio "submit", in uno stesso "Form" , che puntino ad "action" diversi Javascript 1
marino51 [Risolto]videochat di messenger ha smesso di funzionare sul telefonino Smartphone e tablet 1
A [Javascript] [HTML] RISOLTO...Allungare un box all'apertura della pagina No Mouse over Javascript 9
ken_korn [Javascript][Risolto] browser.tab.Tabs.favIconUrl non funziona Javascript 5
A [RISOLTO] HighChart e PHP PHP 4
A [RISOLTO] PHP Selezionare tutti i file con stessa estensione PHP 2
A [RISOLTO] Table elaborata da codice PHP con dati da DB non visualizzata in IFRAME PHP 15
T [Photoshop] Problema creazione pennello personalizzato [RISOLTO] Photoshop 3

Discussioni simili