php.de

Zurück   php.de > Lösungen durch Skripte > Scriptbörse

Scriptbörse PHP Lösungen für nen schmalen Taler

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.12.2010, 14:37  
Neuer Benutzer
 
Registriert seit: 12.12.2010
Beiträge: 2
PHP-Kenntnisse:
Anfänger
Andreasx befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Athentifizierung an phpbb-datenbank

Hallo alle miteinander!


Ich würde gerne die Authentifizierung von ejabberd mit Hilfe der mysql-Datenbank von phpbb 3.08 bewerkstelligen.


Nach einigen Recherchen bin ich auf ein Skript gestoßen, das allerdings nur mit per Crypt verschlüsselten Passwörtern in Datenbanken zurecht kommt.
Somit sollte sich die Anpassungsarbeit in Grenzen halten.

Hinzugefügt habe ich bisher:
Code:
use Digest::MD5 qw(md5 md5_hex md5_base64);
und
Code:
bei 'auth' crypt durch md5 ersetzt.
Allerdings funktioniert das bisher nicht.

Hier das vorläufige Skript:

Code:
#!/usr/bin/perl

# Mysql external auth script
# Features: auth isUser and change password
# Password is an encrypted password !!


# Settings
my $sDatabaseHost='localhost';        # The hostname of the database server
my $sDatabaseUser="*********";        # The username to connect to mysql
my $sDatabasePass='*********';        # The password to connect to mysql
my $sDatabaseName="forum";        # The name of the database contain the user table
my $sUserTable="phpbb_users";            # The name of the table containing the username and password
my $sUsernameTableField="username";    # The name of the field that holds jabber user names
my $sPasswordTableField="user_password";# The name of the field that holds jabber passwords

# Libs
use DBI;
use DBD::mysql;
use Digest::MD5 qw(md5 md5_hex md5_base64);

while(1) {
my $sBuffer = "";
my $readBuffer = sysread STDIN,$sBuffer,2;
my $iBufferLength = unpack "n",$sBuffer;
my $readBuffer= sysread STDIN,$sBuffer,$iBufferLength;
my ($sOperation,$sUsername,$sDomain,$sPassword) = split /:/,$sBuffer;
my $bResult;

SWITCH: {
$sOperation eq 'auth' and do {
$bResult   = 0;
$connect    = DBI->connect('DBI:mysql:'.$sDatabaseName, $sDatabaseUser,  $sDatabasePass) || die "Could not connect to database: $DBI::errstr";
$query = "SELECT $sPasswordTableField FROM $sUserTable WHERE $sUsernameTableField='$sUsername';";
$statement = $connect->prepare($query);
$statement->execute();
while ($row = $statement->fetchrow_hashref()) {
$sCryptstring = md5($sPassword,$row->{$sPasswordTableField});
if ($row->{$sPasswordTableField} eq $sCryptstring) {
$bResult = 1;
}
}
},last SWITCH;

$sOperation eq 'setpass' and do {
$connect    = DBI->connect('DBI:mysql:'.$sDatabaseName, $sDatabaseUser,  $sDatabasePass) || die "Could not connect to database: $DBI::errstr";
$myquery   = "UPDATE $sUserTable SET $sPasswordTableField=ENCRYPT('$sPassword') WHERE $sUsernameTableField='$sUsername';";
$statement = $connect->prepare($myquery);
$statement->execute();
$bResult = 1;
},last SWITCH;

$sOperation eq 'isuser' and do {
$bResult   = 0;
$connect    = DBI->connect('DBI:mysql:'.$sDatabaseName, $sDatabaseUser,  $sDatabasePass) || die "Could not connect to database: $DBI::errstr";
$myquery   = "SELECT count(*) AS iCount FROM $sUserTable WHERE $sUsernameTableField='$sUsername';";
$statement = $connect->prepare($myquery);
$statement->execute();
$row = $statement->fetchrow_hashref();
if($row->{'iCount'} >= 1){
$bResult = 1;
}
},last SWITCH;
};

my $sOutput = pack "nn",2,$bResult ? 1 : 0;
syswrite STDOUT,$sOutput;
}
closelog;
Die Funktion der Passwortänderung muss für mich nicht zwingend funktionieren.
Wirklich wichtig ist nur ein funktionierende Authentifizierung.


Und zu guter Letzt noch ein paar Infos für die Coder, damit sie nicht erst ewig suchen müssen
phpbb benutzt folgende Funktionen bei der Verschlüsselung (zu finden in /includes/functions.php):

Code:
/**
*
* @version Version 0.1 / slightly modified for phpBB 3.0.x (using $H$ as hash type identifier)
*
* Portable PHP password hashing framework.
*
* Written by Solar Designer <solar at openwall.com> in 2004-2006 and placed in
* the public domain.
*
* There's absolutely no warranty.
*
* The homepage URL for this framework is:
*
*http://www.openwall.com/phpass/
*
* Please be sure to update the Version line if you edit this file in any way.
* It is suggested that you leave the main version number intact, but indicate
* your project name (after the slash) and add your own revision information.
*
* Please do not change the "private" password hashing method implemented in
* here, thereby making your hashes incompatible.  However, if you must, please
* change the hash type identifier (the "$P$") to something different.
*
* Obviously, since this code is in the public domain, the above are not
* requirements (there can be none), but merely suggestions.
*
*
* Hash the password
*/
function phpbb_hash($password)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

$random_state = unique_id();
$random = '';
$count = 6;

if (($fh = @fopen('/dev/urandom', 'rb')))
{
$random = fread($fh, $count);
fclose($fh);
}

if (strlen($random) < $count)
{
$random = '';

for ($i = 0; $i < $count; $i += 16)
{
$random_state = md5(unique_id() . $random_state);
$random .= pack('H*', md5($random_state));
}
$random = substr($random, 0, $count);
}

$hash = _hash_crypt_private($password, _hash_gensalt_private($random, $itoa64), $itoa64);

if (strlen($hash) == 34)
{
return $hash;
}

return md5($password);
}

/**
* Check for correct password
*
* @param string $password The password in plain text
* @param string $hash The stored password hash
*
* @return bool Returns true if the password is correct, false if not.
*/
function phpbb_check_hash($password, $hash)
{
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
if (strlen($hash) == 34)
{
return (_hash_crypt_private($password, $hash, $itoa64) === $hash) ? true : false;
}

return (md5($password) === $hash) ? true : false;
}

/**
* Generate salt for hash generation
*/
function _hash_gensalt_private($input, &$itoa64, $iteration_count_log2 = 6)
{
if ($iteration_count_log2 < 4 || $iteration_count_log2 > 31)
{
$iteration_count_log2 = 8;
}

$output = '$H$';
$output .= $itoa64[min($iteration_count_log2 + ((PHP_VERSION >= 5) ? 5 : 3), 30)];
$output .= _hash_encode64($input, 6, $itoa64);

return $output;
}

/**
* Encode hash
*/
function _hash_encode64($input, $count, &$itoa64)
{
$output = '';
$i = 0;

do
{
$value = ord($input[$i++]);
$output .= $itoa64[$value & 0x3f];

if ($i < $count)
{
$value |= ord($input[$i]) << 8;
}

$output .= $itoa64[($value >> 6) & 0x3f];

if ($i++ >= $count)
{
break;
}

if ($i < $count)
{
$value |= ord($input[$i]) << 16;
}

$output .= $itoa64[($value >> 12) & 0x3f];

if ($i++ >= $count)
{
break;
}

$output .= $itoa64[($value >> 18) & 0x3f];
}
while ($i < $count);

return $output;
}

/**
* The crypt function/replacement
*/
function _hash_crypt_private($password, $setting, &$itoa64)
{
$output = '*';

// Check for correct hash
if (substr($setting, 0, 3) != '$H$')
{
return $output;
}

$count_log2 = strpos($itoa64, $setting[3]);

if ($count_log2 < 7 || $count_log2 > 30)
{
return $output;
}

$count = 1 << $count_log2;
$salt = substr($setting, 4, 8);

if (strlen($salt) != 8)
{
return $output;
}

/**
* We're kind of forced to use MD5 here since it's the only
* cryptographic primitive available in all versions of PHP
* currently in use.  To implement our own low-level crypto
* in PHP would result in much worse performance and
* consequently in lower iteration counts and hashes that are
* quicker to crack (by non-PHP code).
*/
if (PHP_VERSION >= 5)
{
$hash = md5($salt . $password, true);
do
{
$hash = md5($hash . $password, true);
}
while (--$count);
}
else
{
$hash = pack('H*', md5($salt . $password));
do
{
$hash = pack('H*', md5($hash . $password));
}
while (--$count);
}

$output = substr($setting, 0, 12);
$output .= _hash_encode64($hash, 16, $itoa64);

return $output;
}
So, ich hoffe das sind genügend Informationen für den Datenbankzugriff.

Alles was jetzt kommt ist nicht notwendig, wäre aber super:

Ein zusätzliches nettes Future wäre ein kleiner Filter um die Datenbank zu schützen:
Code:
    
# Filter dangerous characters
    $user =~ s/[."\n\r'\$`]//g;
    $password =~ s/[."\n\r'\$`]//g;
weiter von Interesse wäre eine Logdatei.

Für einen erfahrenen Coder sollte das jetzt kein allzu großes Problem mehr darstellen.

Einfach ein Angebot machen für Preis und Umfang, gerne auch per PN!

Nette Grüße

Andreas
Andreasx ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 16.12.2010, 17:22  
Neuer Benutzer
 
Registriert seit: 12.12.2010
Beiträge: 2
PHP-Kenntnisse:
Anfänger
Andreasx befindet sich auf einem aufstrebenden Ast
Standard

Hallo

das Problem hat sich erledigt.

Nette Grüße

Andreas
Andreasx ist offline   Mit Zitat antworten
Alt 17.12.2010, 16:40  
Erfahrener Benutzer
 
Registriert seit: 21.12.2009
Beiträge: 415
PHP-Kenntnisse:
Fortgeschritten
G.Schuster ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von Andreasx Beitrag anzeigen
Ein zusätzliches nettes Future wäre ein kleiner Filter um die Datenbank zu schützen:
Code:
    
# Filter dangerous characters
    $user =~ s/[."\n\r'\$`]//g;
    $password =~ s/[."\n\r'\$`]//g;
Nur mal so als netter Hinweis: es gibt bedeutend mehr "böse" Zeichen als die paar gezeigten.
Sofern du mit mysql/mysqliarbeitest empfiehlt es sich doch, auch mal einen Blick auf real_escape_string() zu werfen, statt sich an einer RegExp zu versuchen.
__________________
actra.development - Schwabstr. 2 - 70825 Münchingen
www.actra.de/velopment/ - eMail: php.de@actra.de
Zend Certified Engineer for PHP5
G.Schuster ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Mitmachquiz] Gästebuch mit beliebiger Datenbank Asipak Off-Topic Diskussionen 69 02.03.2011 11:03
Variablenname aus Datenbank auswerten Eratech PHP Tipps 2010 6 04.05.2010 18:09
Allgemein Werte in Datenbank updaten chunky PHP Tipps 2010 1 08.04.2010 22:35
Datenbank richtig aufgebaut? bageleudi Datenbanken 2 31.03.2010 21:01
Direkten Zugriff auf Datenbank verhindern heyho PHP Tipps 2008 7 07.02.2008 11:41
schribt nichts in die datenbank Cheesy92 PHP Tipps 2006 9 27.10.2006 14:03
String in Datenbank finden Pimbolie1979 Datenbanken 11 13.10.2006 15:37
Sql Datenbank durchsuchen und vergleichen Teambyte PHP Tipps 2006 5 14.09.2006 11:11
Wann Datenbank öffnen/schließen tayke PHP Tipps 2006 10 24.05.2006 17:29
Klappmenü aus Datenbank PHP Tipps 2007 1 12.12.2005 15:02
Mehrere Anwendungen eine Datenbank... Datenbanken 5 15.08.2005 11:22
mysql datenbank anlegen...aber WIE??? Datenbanken 0 05.08.2005 19:33
[Erledigt] mysql datenbank anlegen...aber WIE??? PHP Tipps 2005-2 0 05.08.2005 19:33
Eintrag in Datenbank mittels Formular? Datenbanken 5 16.12.2004 17:36
INSERT in die Datenbank PHP Tipps 2004-2 4 13.12.2004 19:51

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
ejabberd postgresql md5 salt, php datenbank update set where, benutzername datenbank phpbb3, phpbb datebnak user passwört, ejabberd auth phpass, \ejabberd\ postgresql password md5, phpbb3 input wie passwort hashen

Alle Zeitangaben in WEZ +2. Es ist jetzt 01:17 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum