Sicurezza dati form per insert e select in database

  • Creatore Discussione Creatore Discussione Malware
  • Data di inizio Data di inizio

Malware

Utente Attivo
19 Lug 2012
112
0
0
Di discussioni come questa se ne vedono a palate per il web, ma non sono riuscito a farmi un'idea chiara.

Nel mio small project devo neutralizzare i dati che gli utenti mandano in input dato che in internet niente è sicuro [cit. Borgo Italia :) ].

Questi dati sono pochi (per ora):
-Username
-Password
-Email
-Testo dei messaggi

Io per ora uso una cosa semplice tipo questa per il login o registrazione:
-Tolgo gli apostrofi (sostituisco "'" con "") (li permetto solo nei messaggi)
-controllo lunghezza min e max
-htmlentities
-addshashes

E per le mail nella registrazione devo ancora aggiungere la funzione per controllare che abbia il formato valido

Mentre per il testo dei messaggi:
-htmlentities
-addslashes

Ora parto con le domande:
1. L'addslashes nel login è inutile se tolgo gli apostrofi vero?
2. Con un metodo del genere quanto sarei sicuro da 1 a 10?
3. Ho visto che alcuni considerano addslashes deprecato. Molti giocano con "get_magic_quotes_gpc()": se è attivo usano stripshashes (dicono che get_magic_quotes non sia perfetto) e poi utilizzano mysql_real_escape_string; se invece è disattivo usano semplicemente mysql_real_escape_string.
Questo ragionamento andrebbe bene dato che il mio host non mi permette di modificare php.ini

Ragazzi è da tutto il pomeriggio che leggi post su post ma niente da fare.
Chiedo qui perchè per altre cose mi sono chiarito bene le idee.
Grazie in anticipo
 
ciao
considera che è ferragosto e molti sono in spiagga.
comunque cominciamo:
più che togliere intanto io verificherei i dati immessi e se non sono adeguati li farei reinserire senza nemmeno avvicinarsi al db.
es per verificare user e pass potresti usare una funzione di questo tipo
PHP:
//$testo=testo da verificare, $mi lunghezza minima del testo, $ma lunghezza massima
function ver_testo($testo,$mi,$ma){
    $pattern="/^[a-zA-Z0-9]{".$mi.",".$ma."}$/";//al pattern poi puoi eggiungere eventuali carratteri particolari es l'undescore
    if(preg_match($pattern, $testo)){
        //testo ok
        return TRUE;
    }else{
        return FALSE;
    }
}
per l'email
PHP:
$verifica=filter_var($email, FILTER_VALIDATE_EMAIL);//restituisce TRUE se email ok, altrimenti FALSE

per un testo lungo userei
PHP:
$tag_ammessi="<br> <br /> <p>";// strip_tags toglie tutti i tag con esclusione degli ammessi se ci sono
$testo=strip_tags($testo, $tag_ammessi);//strip_tags($testo)toglie tutti i tag es <a></a> e <script></script>
fatto questo (ti scrivo in pseudo codice)
se controlli == TRUE salvi (o fai quello che devi fare)
altrimenti rimandi l'utente al form pulito per un nuovo tentativo

ultimo per ora: la pass dovrebbe essere salvata nel db codificata, come minimo con sha1

comunque se cerchi nel forum trovi diversi post sull'argomento
comunque siamo qui
 
Ciao e grazie per la risposta!

Ho alcuni dubbi:

-Ok per la email;
-Ok per l'username;
-Per la pass uso md5, dici che è meglio fare un md5(sha1($pass))?
-Per il testo, io lascio scrivere tutti i tag che un utente vuole scrivere, ma poi li rendo inoffensivi usando htmlentities. Va bene ugualmente?
-Non hai mai usato addslashes: lo metto sempre vero? E per il discorso di get_magic_quotes_gpc() e mysql_real_escape_string? cosa mi consiglieresti?

Grazie mille
 
ciao
-Per la pass uso md5, dici che è meglio fare un md5(sha1($pass))?
dovrebbe essere sufficiente sha1, ho sentito comunque che ci sono delle lib di codifica migliori ma non le conosco, spero che alex legga questo post e ti sappia dire
-Per il testo, io lascio scrivere tutti i tag che un utente vuole scrivere, ma poi li rendo inoffensivi usando htmlentities. Va bene ugualmente?
dipende, se es fai scrivere il testo con uno dei wisi che es aggiungono lo stong, se togli tutto elimini anche lo strong, con strip_tags puoi decidere quali tag lasciare e quali eliminare
io usa addslashes quando salvo nel db e stripslashes quando leggo e visualizzo, non uso mysql_real_escape_string, anche se so che con le pdp ci sono mezzi diversi
 
Per la pass uso md5, dici che è meglio fare un md5(sha1($pass))?
L'ideale sarebbe criptare la password con un salt:
PHP:
$cryptedPassword = sha1(sha1($salt) . sha1($password));
In alternativa se vuoi fare una cosa più semplice ma abbastanza sicura usa sha512 per criptare la password:
PHP:
$cryptedPassword = hash('sha512', $password);


Per il testo, io lascio scrivere tutti i tag che un utente vuole scrivere, ma poi li rendo inoffensivi usando htmlentities. Va bene ugualmente?
Dipende dalle tue esigenze, se vuoi consentire l'utilizzo di alcuni tag usa strip_tags, altrimenti htmlentities può andar bene.


on hai mai usato addslashes: lo metto sempre vero? E per il discorso di get_magic_quotes_gpc() e mysql_real_escape_string? cosa mi consiglieresti?
Per evitare questi problemi potresti usare classi per l'astrazione come pdo, che sono soluzioni nettamente migliori.
Altrimenti per quanto riguarda get_magic_quotes_gpc e mysql_real_escape_string fai cosi (addslashes non lo vedo necessario se utilizzi mysql_real_escape_string):
PHP:
// verifichi se il magic quote è attivo, nel caso lo fosse elimini i backslash inseriti da php con stripslashes
if(get_magic_quotes_gpc()) {
    $username = stripslashes($username);
    $email    = stripslashes($email);
    // eventuali altri dati
}

// fatto questo effettui l'escape di eventuali caratteri pericolosi con mysql_real_escape_string
$username = mysql_real_escape_string($username);
$email    = mysql_real_escape_string($email);
// eventuali altri dati
 
Ultima modifica:
L'ideale sarebbe criptare la password con un salt:
PHP:
$cryptedPassword = sha1(sha1($salt) . sha1($password));
In alternativa se vuoi fare una cosa più semplice ma abbastanza sicura usa sha512 per criptare la password:
PHP:
$cryptedPassword = hash('sha512', $password);



Dipende dalle tue esigenze, se vuoi consentire l'utilizzo di alcuni tag usa strip_tags, altrimenti htmlentities può andar bene.



Per evitare questi problemi potresti usare classi per l'astrazione come pdo, che sono soluzioni nettamente migliori.
Altrimenti per quanto riguarda get_magic_quotes_gpc e mysql_real_escape_string fai cosi:
PHP:
// verifichi se il magic quote è attivo, nel caso lo fosse elimini i backslash inseriti da php con stripslashes
if(get_magic_quotes_gpc()) {
    $username = stripslashes($username);
    $email    = stripslashes($email);
    // eventuali altri dati
}

// fatto questo effettui l'escape di eventuali caratteri pericolosi con mysql_real_escape_string
$username = mysql_real_escape_string($username);
$email    = mysql_real_escape_string($email);
// eventuali altri dati


Ok grazie a entrambi.
Si può chiudere^^
 
ciao
aspetto a chiudere (può rispondere/interessare a qualcun'altro).
comunque vorrei fare un'osservazione sulle pass.
il criptaggio della pass può essere più o meno buono, ma se es come pass usi "123456" anche con il criptaggio migliore in 5 sec bucano il tuo db.
analogo discorso se usi il nome del tuo gatto.
il problema principale (in funzione del grado di sicurezza che ti serve) è la creazione di pass lunghe (12 o più caratteri) senza senzo compiuto con numeri lettere maiscole e minuscole e un pizzico di caratteri particolari (_*£)
poi, come detto, tutto dipende dalla sicurezza che vuoi e che ti serve, se devi proteggere il conto in banca è una cosa se invece serve per diminuire lo spam è un'altra
 
Ciao
Il mio host non mi permette di modificare ini.php
Controlleró tramite un file php
Thanks
 

Discussioni simili