Benutzerverwaltung sicher gestalten

Kneipe

Grünschnabel
Guten Tag,

Erstmal etwas über mich und meine Erfahrung mit PHP:
Ich bin kein blutiger Anfänger was die Entwicklung mit PHP angeht. Ich habe zum Beispiel vor einem Jahr eine Facharbeit im Informatik LK (Abitur) über Objektorientierte Programmierung mit PHP5 geschrieben und diese Prinzipien auch am Beispiel eines eigenes Content Management Systems erläutert. Das bedeutet ich bin mit den Grundlagen der Objektorientierung vertraut.

Ich möchte nun ein Community-Projekt ins leben rufen. Dazu möchte ich mich erstmal mit einer reinen Nutzerverwaltung beschäftigen. Sprich: Registrierung, Rechte, Profil.
Sprich: Man kann sich einloggen/ausloggen und sein Profil bearbeiten.

Nun habe ich dazu einige Fragen:
Wie gestalte ich das ganze relativ sicher? Ich habe damals bei meinem CMS Cookies benutzt. Reicht das aus? Oder sollte man auf eine Kombination von Cookies und Sessions setzen?

Da ich das ganze natürlich Objektorientiert machen möchte, habe ich auch schon mir eine MySQL-Klasse geschrieben mit der ich einfach auf Datensätze zugreifen kann. Was haltet ihr davon?

PHP:
<?php
class mysql {
	public $mysql_server;
	public $mysql_user;
	public $mysql_password;
	public $mysql_db;
	public $mysql_prefix;
	private $db_connected;
	private $db_queries;
	private $db_error;

// Konstruktor: MySQL-Verbindung herstellen
    private function mysql() {
		// Prüfen b Verbindung zur Datenbank besteht, wenn nicht --> herstellen
		if(!($this->db_connected)) {
			$this->dbConnect();
		}
    }

// Verbindet und wählt Datenbank aus
	private function dbConnect() {
		$db_link = @mysql_connect($this->mysql_server, $this->mysql_user, $this->mysql_password, $this->mysql_db);
		$db_selectedDb = mysql_select_db($this->mysql_db);
                if(!$db_link) {
             $this->db_error = mysql_errno().' => '.mysql_error();
                }
                else
                    $this->db_connected = $db_link;
		}

// Überprüft die Verbindung und verbindet gegebenenfalls.
	private function dbCheckConnection() {
		if(!isset($this->db_connected))
			$this->dbConnect();
	}

// SQL-Query ausführen +  Queries zählen
	public function dbQuery($sql_command) {
		$this->dbCheckConnection();
		$result = @mysql_query($sql_command);
		if($result) {
			if($this->db_queries == '' OR $this->db_queries == 0 OR !($this->db_queries))
				$this->db_queries = 1;
			else
				$this->db_queries++;
			return $result;
		}
		else {
			$this->db_error = mysql_error();
			return false;
		}
	}
}
?>

Ich würde mich freuen wenn mir jemand sagen kann, wie ich das ganze relativ sicher gestalte.
 
Ich würde eher Sessions benutzen, da Cookies verändert werden können, Sessions eben nur von der Serverseite aus.
Im Prinzip ist aber die Session ein Cookie, aber der Wert ist eine ID und keine Daten.

Du hast deinen Konstruktor mysql() getauft, aber in PHP5 sollte der Konstruktor immer __construct heißen:
PHP:
private function __construct()
{
}
 
Zuletzt bearbeitet:
Danke für die schnelle Antwort.
Die Sessions würdest du doch dann sicher auch in der Datenbank speichern?
Was muss ich denn beachten wenn ein Nutzer sich zum Beispiel mit 2 verschiedenen Browsern gleichzeitig einloggt? Dann hat er doch praktisch 2 unterschiedliche Sessions oder?
 
[...]
Du hast deinen Konstruktor mysql() getauft, aber in PHP5 muss der Konstruktor immer __construct heißen:
[...]

Nein muss er nicht. Es wird zwar so empfohlen/vorgegeben, folgendes kleines Beispiel läuft allerdings auch ohne Probleme ;)
PHP:
<?php
error_reporting(E_ALL);
class test{
  private $x1;
  private $x2;
  public function test($x1, $x2){
    $this->x1 = $x1;
    $this->x2 = $x2;
  }
  public function dump(){
    echo $this->x1.' : '.$this->x2;
  }
}
$test = new test(1, 'str');
$test->dump(); // 1 : str
 
@timestamp:
Stimmt, habe ich jetzt nochmal schnell nachgelesen.


Die Sessions würdest du doch dann sicher auch in der Datenbank speichern?
Das musst du nicht, aber du bekommst mehr dadurch Möglichkeiten, allerdings musst du deinen eigenen Sessionhandler schreiben (oder einen fertigen nutzen).
Was muss ich denn beachten wenn ein Nutzer sich zum Beispiel mit 2 verschiedenen Browsern gleichzeitig einloggt? Dann hat er doch praktisch 2 unterschiedliche Sessions oder?
Stimmt, versuche es doch z.B. hier mit tutorials.de.
Eigentlich sollte das kein Problem darstellen, wenn du möchtest kannst du einfach 2 hinteranderfolgende Anmeldungen verhindern.

// Und bei deiner MySQL-Klasse kannst du noch einen Destruktor einfügen, der dann die Verbindung per [phpf]mysql_close[/phpf] schließt.

// Außerdem würde ich bei allen Funktionen wie z.B. [phpf]mysql_query[/phpf] auch noch die Verbindung mit angeben, damit deine Klasse auch mehrere offene Verbindungen unterstützen kann.
 
Zuletzt bearbeitet:
okay. also das hat mir schonmal alles sehr geholfen.
Wir sieht es mit Passwörtern der Nutzer aus? MD5 verschlüsselt? Ist das noch Standart? Ich habe vor 4-5 Jahren mal mit dem Woltlab Burning Board (Version 2) gearbeitet.....daher kenne ich viele Sachen nur so, wie sie dort umgesetzt waren.
 
ja, hab ich gelesen. Danke dir.
Ich bin mir nur gerade am überlegen, ob ich wirklich eine komplette Eigenentwicklung anpeile. Das Woltab Community Framework (http://www.woltlab.de) scheint relativ mächtig geworden zu sein. Das bietet mir ja quasi die Grundfunktionalitäten alle schon.

Ich werde mir dann wohl überlegen müssen was sinnvoller für mich ist.

Aufjedenfall Dankeschön an ComFreek.
 
Nur kurz anbei: md5 und sha1 sind Hashalgorithmen - kann man also gar nicht knacken da eine Rückumwandlung unmöglich ist. Es gibt sogennante Rainbowtables in denen Hashes und die zugehörigen Werte stehen, sodass man wenn man einen Hash hat diesen ggf. dort nachgucken kann. Außerdem wurden in md5 schon einige Kollisionen gefunden, das bedeutet wenn dein Passwort z.B. 'ABCDEF' ist, das jedoch denselben Hash hat wie '123456' dies 2 mögliche Passwörter zum einloggen sind. Md5 kann jedoch weiterhin verwendet werden, am besten bildest du einen Salt aus einen paar zufälligen Zeichen (den musst du natürlich auch in der Datenbank abspeichern). Außerdem kannst du noch den Nutzernamen/emailadresse mit-hashen bzw die Hashfunktion mehrmals aufrufen, damit Rainbowtables weniger nützlich sind, sollte überhaupt jemand mal Zugriff auf die Passwörter haben (was dann natürlich eh sinnlos wäre).
 
Zurück