2010-07-08 3 views
4

Salut, je composais une expression rationnelle pour un champ de mot de passe de mon site et avait une préoccupation:Un ensemble de caractères valides pour le site web des mots de passe

Y a-t-il des personnages que je dois bloquer un utilisateur d'entrer? Si oui, pourquoi? Ou est-ce suffisant d'échapper des caractères dangereux comme = et 'lors du traitement des données? Il semble bon pour ce sujet d'énumérer les fonctions PHP pour échapper à ceux-ci, si vous voulez.

Merci!

Répondre

7

Je hache tout ce qu'un utilisateur saisit comme un mot de passe, donc je me fiche de ce qu'il écrit, il ne touche jamais ma base de données et ne peut causer aucun dommage. md5 ($ _ POST [ 'password'])

D'autres champs sont une autre histoire ...

mysql_real_escape_string() est une grande fonction pour échapper à des données dans les requêtes.

+2

+1 Le hachage est également un bon point. – TNi

+0

thats bon - n'a pas md5 et sha1 se fissuré cependant? –

+1

fissuré? .. si quelqu'un entre dans votre base de données, ils pourraient être en mesure de google quelques mots de passe déchiffrés, mais ils devraient entrer en premier droit? Séparer complètement le problème ... le hacher avant l'entrée SQL éliminera toute chance que le mot de passe lui-même soit utilisé pour l'injection SQL ou endommager votre site. – Fosco

1

Aucune restriction ne doit être placée sur les mots de passe. Laissez l'utilisateur décider. Comme pour les caractères d'échappement pour l'entrée de la base de données, pas besoin; Je fais juste des recherches sur

1

Sur quels points protégez-vous spécifiquement? Si c'est une injection SQL, alors vous ne devriez pas compter sur l'échappement des paramètres fournis par l'utilisateur, vous devriez utiliser des requêtes paramétrées.

http://us.php.net/manual/en/mysqli-stmt.bind-param.php

+0

tout, donc je suppose que si le hachage est la seule option sécurisée alors les injections sql sont moins préoccupantes maintenant –

+0

L'injection SQL est toujours une énorme préoccupation pour autre chose que des mots de passe dans ce cas. Et quand allez-vous jamais avoir une requête SQL avec un mot de passe seul? – TNi

+0

je suis d'accord - merci. C'est beaucoup de code à regarder si - est-ce la seule page que je dois me familiariser avec afin de se prémunir contre les injections? –

3

Comme d'autres personnes ont déjà dit, hachant le mot de passe de l'utilisateur avant de l'enregistrer à la base de données vous n'avez pas dire à vous soucier de ce que l'utilisateur entre. Alors que nous sommes sur le sujet du hachage, vous pouvez même envisager d'ajouter un «sel» au mot de passe avant qu'il ne soit haché. Un salt est une chaîne aléatoire (par exemple, l'adresse email de l'utilisateur) qui aidera à améliorer l'unicité du hachage généré (différents utilisateurs qui ont le même mot de passe génèrent le même hachage sans sel).

Pour plus d'informations prendre une lecture de: http://phpsec.org/articles/2005/password-hashing.html

+0

beaucoup de bonnes réponses - merci je cherchais un bon tutoriel de sel –

-2

J'utilise MD5/Hash et BASE64 ENCODE Fonctions pour les mots de passe, donc je n'ai pas vraiment un soin ce qu'ils entrent aussi longtemps qu'ils répondent aux exigences minimales ... Les mots de passe fortement typés sont recommandés.

function get_rnd_iv($iv_len) 
    { 
     $iv = ''; 
     while ($iv_len-- > 0) { 
      $iv .= chr(mt_rand() & 0xff); 
     } 
     return $iv; 
    } 

    function md5_encrypt($string_value, $salt_key, $iv_len = 16) 
    { 
     $string_value .= "\x13"; 
     $n = strlen($string_value); 
     if ($n % 16) $string_value .= str_repeat("\0", 16 - ($n % 16)); 
     $i = 0; 
     $enc_text = get_rnd_iv($iv_len); 
     $iv = substr($salt_key^$enc_text, 0, 512); 
     while ($i < $n) { 
      $block = substr($string_value, $i, 8)^pack('H*', md5($iv)); 
      $enc_text .= $block; 
      $iv = substr($block . $iv, 0, 512)^$salt_key; 
      $i += 16; 
     } 
     return urlencode(base64_encode($enc_text)); 
    } 

    function md5_decrypt($enc_text, $salt_key, $iv_len = 16) 
    { 
     $enc_text = urldecode(base64_decode($enc_text)); 
     $n = strlen($enc_text); 
     $i = $iv_len; 
     $string_value = ''; 
     $iv = substr($salt_key^substr($enc_text, 0, $iv_len), 0, 512); 
     while ($i < $n) { 
      $block = substr($enc_text, $i, 8); 
      $string_value .= $block^pack('H*', md5($iv)); 
      $iv = substr($block . $iv, 0, 512)^$salt_key; 
      $i += 16; 
     } 
     return preg_replace('/\\x13\\x00*$/', '', $string_value); 
    } 
+0

merci - cela aidera sur ma quête salée;) –

+1

quel est le but de tout ce code? pourquoi ne pas juste md5/sha1 (pass.salt)? –

+0

Il s'agit d'un modèle réutilisable qui peut être placé à l'intérieur d'une classe ou utilisé comme inclusion ... Dans cette méthode, vous pouvez continuellement réutiliser la méthode md5/sha1/base64_encode ... c'est une solution solide. Vous pouvez également l'utiliser pour valider/vérifier les données de chaîne de requête en ajoutant les données hachées. Vous pouvez également utiliser un datetime unix pour le coder davantage afin que les données codées ne soient valides que pour la date d'instanciation. :) –

Questions connexes