2008-10-17 9 views
1

je fais quelque chose comme ce qui suit:base64_encode comportement bizarre

SELECT * FROM table WHERE user='$user'; 
$myrow = fetchRow() // previously I inserted a pass to the db using base64_encode ex: WRM2gt3R= 

$somepass = base64_encode($_POST['password']); 

if($myrow[1] != $somepass) echo 'error'; 
else echo 'welcome'; 

Im toujours obtenir erreur, j'ai même écho somepass de $ et myrow $ [1], ils sont les mêmes, mais toujours une erreur. Qu'est-ce que je fais mal? Merci

+0

S'il vous plaît fournir des informations sur ce que $ myrow et $ _POST contiennent réellement (var_dump ($ myrow) et var_dump ($ _ POST);) –

+0

var_dump ($ somepass); var_dump ($ myrow); et collez la sortie dans votre question. –

Répondre

2

Essayez d'utiliser var_dump au lieu d'echo - peut-être que l'un d'entre eux a un espace ou une nouvelle ligne au début/à la fin.

Edit:

Vous devez être stocker sous forme CHAR (40): A fixed-length string that is always right-padded with spaces to the specified length when stored

Utilisez VARCHAR ou trim()

0

Si myrow $ [1] est en fait le mot de passe correct en base64 codage, Je ne vois aucune erreur.

Essayez cette rouver la fin:

echo "<br />$myrow[1] != $somepass"; 

Que dit-il?

Et en passant: je ne vois aucune raison de base64-encoder les mots de passe. Qu'est-ce que vous essayez d'accomplir?

0

Je pense que d'une certaine manière, si je fais un var_dump() Je reçois:

string (40) "YWRraM2 =" string (8) "YWRraM2 ="

semble en quelque sorte si j'insère les données dans la db en utilisant la console son en ajoutant un espace supplémentaire au champ de passe.

myplacedk: est-il une raison pour laquelle je ne devrais pas le faire? Je pensais que cela ajouterait un leyer de sécurité supplémentaire?

+0

Quelle base de données? Quel type de colonne utilisez-vous pour le champ de mot de passe? –

+0

Une fonction réversible n'est pas meilleure qu'un texte en clair. Vous pouvez regarder dans la fonction crypt() à la place: http://www.php.net/crypt – Powerlord

0

Ce codage fait deux choses:

  1. Il ajoute du code, ce qui rend plus complexe et plus facile de faire des erreurs
  2. Si vous affichez votre base de données sur votre écran, et quelqu'un regarde par dessus votre épaule, les mots de passe peut être un peu plus difficile à retenir.

Donc non, il n'ajoute pas vraiment de sécurité. C'est juste un encodage, c'est facile à décoder.

Peut-être que vous l'êtes confondant md5-hash ou quelque chose comme ça.

Jouer est autour grande, mais en ce qui concerne la sécurité, je vous conseille vraiment de ne pas utiliser quelque chose que vous ne comprenez pas. À long terme, il fera plus de dégâts que de bien.

0

Quelques questions:

  • De vos commentaires ailleurs, je pense que le problème avec le code actuel est que votre champ de base de données est CHAR (40). Un champ CHAR a toujours une taille fixe. Essayez de changer le type de champ de base de données VARCHAR au lieu de CHAR.

  • En utilisant base64_encode avant de les stocker dans une base de données est loin d'être sûr. Une bonne pratique consiste à stocker uniquement un hachage unidirectionnel du mot de passe dans la base de données - typiquement md5 ou (mieux) sha1. Ensuite, lorsque l'utilisateur souhaite se connecter, utilisez la même fonction de hachage sur le mot de passe fourni, puis comparez les deux hachages.
    Cela a également l'avantage de travailler avec des mots de passe de plus de 40 caractères.
    A SHA1 ou md5-hachage prend toujours une quantité fixe d'espace, donc si vous allez dans cette voie, vous ne devez pas changer votre colonne de base de données VARCHAR :)