16 Byte Passwort ändern auf 41 Byte (1500 Einträge)
Hallo zusammen,
ich hoffe Ihr könnt mir mal wieder helfen.
Ich möchte in einer MYSQL Tabel das die Passwörter der User von 16Byte auf 41 Byte ändern.
Leider habe ich keinen Ansatz wie diese Änderung möglich ist.
Jeder User hat ja ein anderes Passwort und soll dieses nach der Umstellung auch behalten.
Habe es mit dem SQL-Befehl versucht, jedoch ist danach bei allen Usern das Passwort gleich.
UPDATE mysql.user SET Password = PASSWORD('password') WHERE 1;
Wie kann ich die 1500 Datensätze per Script abarbeiten?
Gruß Marcel
ich hoffe Ihr könnt mir mal wieder helfen.
Ich möchte in einer MYSQL Tabel das die Passwörter der User von 16Byte auf 41 Byte ändern.
Leider habe ich keinen Ansatz wie diese Änderung möglich ist.
Jeder User hat ja ein anderes Passwort und soll dieses nach der Umstellung auch behalten.
Habe es mit dem SQL-Befehl versucht, jedoch ist danach bei allen Usern das Passwort gleich.
UPDATE mysql.user SET Password = PASSWORD('password') WHERE 1;
Wie kann ich die 1500 Datensätze per Script abarbeiten?
Gruß Marcel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 195898
Url: https://administrator.de/contentid/195898
Ausgedruckt am: 19.11.2024 um 19:11 Uhr
10 Kommentare
Neuester Kommentar
Hi Bommel1302,
Du könntest z.B. die Update-Anweisung, . . . set spalte = wert where . . ., spalte = wert where . . . usw.,
in einer Schleife zusammensetzen. Leider hat die Tabelle user keinen eindeutigen Index, z.B. eine ID, und
in den Spalten host und user können Hosts und User auch noch mehrfach unter gleichem Namen vorhanden sein.
Eine korrekte Anweisung wäre dann . . . password = PASSWORD(password) where host = 'host' and user = 'user'
für jede Zeile der Tabelle.
<code type = "PHP">
<?php
$query = "select host, user, password from user";
$result = mysql_query($query);
/*
$update = "update user set ";
/*
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
$update.=" password = PASSWORD(".$row['password'].") where host = ".$row['host']." and user = ".$row['user'].",";
}
/*
$update = substr($update, 0, -1);
/*
echo $update;
// mysql_query($update);
?>
Natürlich nicht selber getestet, da ich meine eigene user-Tabelle nicht verändern will
Gruß
Günni
Wie kann ich die 1500 Datensätze per Script abarbeiten?
Du könntest z.B. die Update-Anweisung, . . . set spalte = wert where . . ., spalte = wert where . . . usw.,
in einer Schleife zusammensetzen. Leider hat die Tabelle user keinen eindeutigen Index, z.B. eine ID, und
in den Spalten host und user können Hosts und User auch noch mehrfach unter gleichem Namen vorhanden sein.
Eine korrekte Anweisung wäre dann . . . password = PASSWORD(password) where host = 'host' and user = 'user'
für jede Zeile der Tabelle.
<code type = "PHP">
<?php
$query = "select host, user, password from user";
$result = mysql_query($query);
/*
- Update-Anweisung in Variable speichern
$update = "update user set ";
/*
- Die Änderungs-Anweisung, where-Klausel und ein Komma an die Anweisung anhängen
while($row = mysql_fetch_array($result, MYSQL_ASSOC)){
$update.=" password = PASSWORD(".$row['password'].") where host = ".$row['host']." and user = ".$row['user'].",";
}
/*
- Das letzte Komma entfernen
$update = substr($update, 0, -1);
/*
- Ausgabe zum Prüfen
echo $update;
// mysql_query($update);
?>
Natürlich nicht selber getestet, da ich meine eigene user-Tabelle nicht verändern will
Gruß
Günni
Hi Bommel1302,
Das ist jetzt kein direkter Fehler im Script. mysql_fetch_array erwartet ein Abfrageergebnis,
das von mysql_query geliefert wurde. Der Fehler liegt dann in der Formulierung der Abfrage
und/oder in der Korrektheit der abgefragten Tabellen und Feldnamen.
Das Update würde eh' nicht funktionieren, da du die tabelle user abfragst . . .
. . . aber in der Update-Anweisung eine Tabelle namens username angibst . . .
Gruß
Günni
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource . . .
Das ist jetzt kein direkter Fehler im Script. mysql_fetch_array erwartet ein Abfrageergebnis,
das von mysql_query geliefert wurde. Der Fehler liegt dann in der Formulierung der Abfrage
und/oder in der Korrektheit der abgefragten Tabellen und Feldnamen.
<?php
$result = mysql_query($query);
if(!$result){
echo mysql_error();
exit;
}
?>
Das Update würde eh' nicht funktionieren, da du die tabelle user abfragst . . .
$query = "select id, username, pwd from user";
. . . aber in der Update-Anweisung eine Tabelle namens username angibst . . .
$update = "update username set ";
Gruß
Günni
Hallo,
Das http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html hast du verstanden welche Problme dir die Umstellung geben kann?
Gruß,
Peter
Zitat von @Bommel1302:
Bei der Ausführung wird das Passwort ja ausgelesen aber nur der Hash nicht in den Klartext.
Was denn sonst? Dachtest du das du so das Passwort in Klarschrift geliefert bekommst?Bei der Ausführung wird das Passwort ja ausgelesen aber nur der Hash nicht in den Klartext.
Um das Passwort in ein 41Byte Hash zu wandeln muss es ja einmal im Klartext sein um es dann zu wandeln.
Wie soll es denn anders gehen? Der 41 Byte lange Hasch ist doch neu berechnet und hat mit dem alten 16Byte langen Hadch doch nichts gemeinsam. Wenn du die Passwörter der 1500 Einträge nicht kennst, dann kann nur der Inhaber der Passwörter dies Ändern. Ist doch auch gut so, oder?Das http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html hast du verstanden welche Problme dir die Umstellung geben kann?
Gruß,
Peter
Das klingt mir stark nach einem PHP update, welches das Standard verhalten des Befehls crypt() geändert hat - wenn Du crypt() verwendest, dann lies mal die Beschreibung auf http://php.net/manual/de/function.crypt.php durch und frag ggf deinen Provider nach den PHP Versionen welche verwendet wurden.
EDIT: .. oder gib uns mal einen Code Schnippsel - welcher zeigt wie bei Dir diese Hashes gebaut werden.
EDIT: der Link von Pjordorf ( http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html ) zeigt eigentlich schon das Problem und die Lösung.
benutze OLD_PASSWORD() in der SQL Anweisung wenn der Hash 16 Zeichen lang ist - wenn dieser bei der Prüfung passt, sollte ggf gleich ein Hash mit der aktuellen PASSWORD() Funktion angelegt werden.
EDIT: .. oder gib uns mal einen Code Schnippsel - welcher zeigt wie bei Dir diese Hashes gebaut werden.
EDIT: der Link von Pjordorf ( http://dev.mysql.com/doc/refman/5.1/de/password-hashing.html ) zeigt eigentlich schon das Problem und die Lösung.
benutze OLD_PASSWORD() in der SQL Anweisung wenn der Hash 16 Zeichen lang ist - wenn dieser bei der Prüfung passt, sollte ggf gleich ein Hash mit der aktuellen PASSWORD() Funktion angelegt werden.