[risolto] Prevenire attacchi hacker

  • Creatore Discussione Creatore Discussione andreto
  • Data di inizio Data di inizio

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:
 
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:
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:
 
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:
8.1)Ricontrolla l'email comunque, quando viene fatto il submit del form alla fine
 
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?
 
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
 
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:
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:
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?
 
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
 
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
 
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