#171 closed Fehler (fixed)
Datenbank Passwort wird nicht korrekt dekodiert (Patch)
| Erstellt von: | sd@… | Verantwortlicher: | hli@… |
|---|---|---|---|
| Priorität: | normal | Meilenstein: | |
| Komponente: | kivitendo CRM | Version: | 1.1.0 |
| Schweregrad: | normal | Stichworte: | Installation |
| Beobachter: |
Beschreibung
In 'crm/inc/stdLib.php' wird das DB-Password aus der dem *.conf File des
Users ohne dekodierung Übernommen - das Passwort ist im "dbpasswd" Feld aber
UU-Kodiert (Perl: pack 'u').
Der folgende Diff ist mein Hotfix für das Problem - der Fix funktioniert
aber nur für Passwörter bis zu 15 Zeichen Länge:
diff -ur crm/inc/stdLib.php crm.new/inc/stdLib.php
--- crm/inc/stdLib.php 2005-03-03 00:51:37.000000000 +0100
+++ crm.new/inc/stdLib.php 2005-05-10 12:30:41.522615000 +0200
@@ -76,6 +76,54 @@
}
+# Vorsicht HACK!
+#
+# Diese Funktion dekodiert Perl-UU-kodierte Passwort-Strings, aber nur bis zu
+# einer Länge von 15 Zeichen (darüber hinaus gibt's einen Fehler).
+#
+# Wer sich berufen fühlt, mag diese Funktion korrekt implementieren :)
+#
+function decode_password($string)
+{
+ $offset = 0;
+ $register = 0;
+ $result = ;
+
+ if (strlen($string) == 0) return ;
+ if ((ord($string{0}) & 0xf0) != 0x20) {
+ print "password decoding error!\n";
+ return null;
+ }
+ $length = ord($string{0}) & 0xf;
+ for ($index = 0; $index < strlen($string); ++$index) {
+ $x = (int)(ord($string{$index + 1}) - 32);
+ switch ($offset) {
+ case 0:
+ $register = $x << 2;
+ $offset = 6;
+ break;
+ case 2:
+ $y = $register | $x;
+ $result .= chr($y);
+ $offset = 0;
+ break;
+ case 4:
+ $y = $register | ($x >> 2);
+ $result .= chr($y);
+ $register = ($x << 6) & 0xff;
+ $offset = 2;
+ break;
+ case 6:
+ $y = $register | ($x >> 4);
+ $result .= chr($y);
+ $register = ($x << 4) & 0xff;
+ $offset = 4;
+ }
+ if (strlen($result) == $length) break;
+ }
+ return $result;
+}
+
if (!$_SESSIONdns? !$_SESSIONemployee?) { if ($_GETlogin?) {
ini_set("gc_maxlifetime","3600");
@@ -83,7 +131,7 @@
preg_match("/dbname => '(.+)'/",$tmp,$hits);
$dbname=$hits[1];
preg_match("/dbpasswd => '(.+)'/",$tmp,$hits);
- $dbpasswd=$hits[1];
+ $dbpasswd=decode_password($hits[1]);
preg_match("/dbuser => '(.+)'/",$tmp,$hits);
$dbuser=$hits[1];
preg_match("/dbhost => '(.+)'/",$tmp,$hits);
Änderungshistorie (7)
comment:1 Geändert vor 9 Jahren durch m.bunkus@…
comment:2 Geändert vor 9 Jahren durch hli@…
- Lösung auf fixed gesetzt
- Status von new nach closed geändert
comment:3 Geändert vor 9 Jahren durch office.lx@…
- Lösung fixed gelöscht
- Status von closed nach new geändert
(Manchmal) funktioniert leider keine der beiden,
vermutlich dann wenn das kodierte Passwort
Trennzeichen '´`"... enthält.
Zrin
comment:4 Geändert vor 9 Jahren durch office.lx@…
echo "print pack 'u', 'abcdefghi'"|perl
)86)C9&5F9VAI
echo "print unpack 'u', ')86)C9&5F9VAI'"|perl
abcdefghi
(php:)
echo "<br>decode3: " . htmlspecialchars(decode_password(")86)C9&5F9VAI")) . "<br>";
decode3: a†a†a†
comment:5 Geändert vor 9 Jahren durch thomas.hauck@…
(Mit Bezug zu comment 2)
(Manchmal) funktioniert leider keine der beiden,
vermutlich dann wenn das kodierte Passwort
Trennzeichen '´`"... enthält.
Zrin
Hallo Zrin,
das liegt dara, dass Perl seine Strings maskiert abspeichert:
' -> \'
" -> \"
\ ->
Beim Einlesen müssen sie natürlich wieder demaskiert werden. Perl macht das
automatisch, PHP dagegen NICHT ! Ich hab das mit stripslashes() nachgeholt:
inc/stdLib.php Zeile 130:
preg_match("/dbpasswd => '(.+)'/",$tmp,$hits);
if ($hits[1]) {
$dbpasswd=uudecode(stripslashes($hits[1]));
} else {
$dbpasswd="";
};
So funktioniert es bei mir wunderbar !
comment:6 Geändert vor 9 Jahren durch hli@…
- Lösung auf fixed gesetzt
- Status von new nach closed geändert
comment:7 Geändert vor 8 Jahren durch christoph@…
Hallo,
ich habe mit dieser Lösung in Version 1.3.1 immer noch Probleme gehabt, nämlich
mit dem kodierten Passwort
dbpasswd => '\',3Q-$%S;',
Lösung war nach einigem Probieren recht einfach:
function uudecode($encode) {
return convert_uudecode(stripslashes($encode));
}
Ich hoffe das hilft jemandem. lg
Christoph Petschnig

Hallo Holger,
gestern bin auch ich über dieses Problem gestolpert. Hier ist noch eine andere
Implementation von uudecode, die ich auf http://de3.php.net/base64_decode
gefunden habe:
function uudecode($encode) {
}
Sollte mit Passwörtern beliebiger Länge funktionieren.