2009-07-01 3 views
0

Ich setze einen Cookie. Etwas wie:SHA Salz in MySQL Abfrage

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

Jetzt ist 124 meine ID, die ich will. Also in meiner MySQL-Tabelle, Ich versuche, eine Abfrage wie auszuführen:

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

Wie die „mysalt“, um die SQL-Abfrage hinzufügen? Denn sonst möchte ich die richtige ID bekommen.

Antwort

4

Verwendung kann Concat() dafür verwenden.

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

Denken Sie daran: MySQL kann in diesem Fall keinen Index verwenden, um die Suche zu beschleunigen. Es könnte besser sein, ein anderes Feld zur Tabelle hinzuzufügen, so dass Sie etwas wie SELECT ... WHERE ID = 124 AND Tempkey = '87gesafouvgbaesofiuigsaf' – VolkerK

1

sollte die Abfrage sein:

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

wenn ich das richtig verstehen, was Sie zu tun versuchen.

+0

nicht nach neuen Antworten suchen, während ich zu lange zu beantworten, mein schlechtes nahm. – Roberto

+1

Dies ist hässlich und lässt die Performances zusammenbrechen, da die "Benutzer" -Tabelle wächst, weil MySQL bei jeder Ausführung der Anfrage 'SHA1 (CONCAT ('id', 'mysalt'))' berechnen muss. Überlegen Sie, ob Sie eine neue Spalte 'id_hash' mit' SHA1 (CONCAT ('id', 'mysalt')) '' hinzufügen, indizieren und Ihre Anfrage-Filterung auf 'id_hash = mysql_real_escape_string ($ _COOKIE ['test']) setzen' – MaxAuray

0

Verwendung CONCAT:

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

Warum sollte das OP concat benutzen? – markus

1

Die Lösungen bereits wahrscheinlich zur Verfügung gestellt wird gut funktionieren, aber sind Sie sicher, dass Sie dies tun wollen? Wenn das Feld "id" wirklich eine eindeutige Identifikation ist, können Sie "LIMIT 1" verwenden, um zu verhindern, dass mysql alle Ihre Elemente durchsucht. Eine andere Sache ist, warum verwendest du nicht ein getrenntes vorberechnetes Feld für dieses? Ich meine, in jeder Abfrage muss mysql unnötigerweise all diese sha1-Werte berechnen. Eine letzte Sache. Ich bin unsicher, warum Sie Ihren Ansatz verwenden, aber meine beste Vermutung ist, eine Art Sitzungsschlüssel zu implementieren. Ich denke, das ist aus zwei Gründen eine schlechte Idee: Wenn jemand Ihr Salz in die Hand nimmt, hat er Zugriff auf alle Ihre Konten. Wenn jemand eine "Sitzung" schnüffelt, kann er sie jederzeit wiederverwenden. Die Wahl eines schwachen Salzes könnte schwerwiegende Folgen haben. HTH.