2009-07-01 10 views
0

Je suis en train de mettre un cookie. Quelque chose comme:SHA salt dans la requête MySQL

$_COOKIE['test'] = SHA1('124'.'mysalt'); 

Maintenant 124 est mon identifiant que je veux. Donc, dans ma table MySQL, je suis en train d'exécuter une requête comme:

$sql = ("SELECT * FROM users WHERE SHA1(`id`) = '".mysql_real_escape_string($_COOKIE['test'])."'"); 

Comment ajouter le « mysalt » à la requête SQL? Car sinon je veux obtenir l'id correct.

Répondre

4

L'utilisation peut utiliser Concat() pour cela.

SELECT ... Sha1(Concat(`id`, 'mysalt'))=... 
+0

Gardez à l'esprit: MySQL ne peut pas utiliser d'index pour accélérer la recherche dans ce cas. Il pourrait être préférable d'ajouter un autre champ à la table, de sorte que vous pouvez interroger quelque chose comme SELECT ... WHERE id = 124 ET tempkey = '87gesafouvgbaesofiuigsaf' – VolkerK

1

La requête doit être:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,`mysalt`)) = '".mysql_real_escape_string($_COOKIE['test'])."'"); 

si je comprends bien ce que vous essayez de faire.

+0

n'a pas vérifié les nouvelles réponses alors que j'ai pris trop de temps pour répondre, mon mauvais. – Roberto

+1

Ceci est moche et fera s'effondrer les performances car la table 'users' va croître car MySQL devra calculer' SHA1 (CONCAT ('id', 'mysalt')) 'chaque fois que la requête est exécutée. Envisagez d'ajouter une nouvelle colonne 'id_hash' contenant' SHA1 (CONCAT ('id', 'mysalt')) ', indexez-la et placez votre requête sur 'id_hash = mysql_real_escape_string ($ _ COOKIE [' test '])' – MaxAuray

0

Utilisation CONCAT:

$sql = ("SELECT * FROM users WHERE SHA1(CONCAT(`id`,'mysalt')) = '".mysql_real_escape_string($_COOKIE[''test''])."'"); 
+0

Pourquoi devriez-vous l'OP utilise-t-il une concat? – markus

1

Les solutions déjà fournies fonctionnera probablement très bien, mais êtes-vous certain que vous voulez faire? Si le champ "id" est vraiment une identification distincte, vous pouvez utiliser "LIMIT 1" pour empêcher mysql de chercher dans tous vos éléments. Une autre chose est, pourquoi n'utilisez-vous pas un champ précalculé séparé pour cela? Je veux dire dans chaque requête, mysql doit inutilement calculer toutes ces valeurs sha1. Une dernière chose. Je ne sais pas pourquoi vous utilisez votre approche, mais ma meilleure idée est de mettre en place une sorte de clé de session. Je pense que c'est une mauvaise idée pour plusieurs raisons: Si quelqu'un se bloque, il a accès à tous vos comptes. Si quelqu'un renifle une "session", il peut la réutiliser quand il veut. Choisir un sel faible pourrait avoir de graves conséquences. HTH.