Erstellt vor 10 Jahren

Geschlossen vor 9 Jahren

Zuletzt geändert vor 8 Jahren

#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@…

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) {

$b64chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

$encode = preg_replace("/./m","",$encode);
$encode = preg_replace("/\n/m","",$encode);
for($i=0; $i<strlen($encode); $i++) {

if ($encode[$i] == )

$encode[$i] = ' ';

$encode[$i] = $b64chars[ord($encode[$i])-32];

}


while(strlen($encode) % 4)

$encode .= "=";

return base64_decode($encode);

}

Sollte mit Passwörtern beliebiger Länge funktionieren.

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

Hinweis: Hilfe zur Verwendung von Tickets finden Sie in TracTickets.