[PHP/OOP] "Externe" Konstanten in Klasse

paddya

Well-known member
ID: 296438
L
4 September 2007
529
61
Hey,

ich sitze hier gerade an einem neuen Script und versuche dabei, möglichst objektorientiert zu arbeiten.

Ich habe mir eine "statische Klasse" Tools erstellt, die alle Methoden enthält, die von anderen Klassen genutzt werden können.

In diesem Fall habe ich eine Konstante "SCRIPT_SECRET", die als Passwort-Salt genutzt werden soll.

PHP:
    class Tools {
        
        public static function hashPassword($password) {
            
            $salt = (defined('SCRIPT_SECRET')) ? SCRIPT_SECRET : '';
            
            return md5(sha1($password . $salt));
            
            
        }
        
    }

Nun stellt sich die Frage, inwiefern es "legitim" ist, auf die externe Konstante zu prüfen. Wäre es eventuell sinnvoller, den Salt-String über einen Parameter zu übergeben?

Wenn ich das Salt über einen Parameter übergebe, müsste ich ja auch auf die Konstante zugreifen.

Der Aufruf würde dann in etwa so aussehen:

PHP:
    class User {
        
        private function checkPassword() {
            return $this->passwordHash === Tools::hashPassword($this->request->post('password'), SCRIPT_SECRET);
        }
    }

Das Ganze würde sich natürlich erübrigen, wenn es Modelle oder Ähnliches geben würde, die den Umgang mit globalen Variablen/Konstanten regeln. Sollte ich für solche Fälle eine Art "System"-Objekt erstellen, das alle möglichen Konfigurationsdinge enthält?

Würde mal gerne ein paar Meinungen zu dem Thema hören :)

Greetz

paddya
 
du möchtest objektorientiert arbeiten und nimmst eine PHP-Konstante? Wie wäre es mit einer Klassen-Konstante? ;)
PHP-Konstanten sind meiner Meinung nach unwartbar, sie fliegen überall rum und die Kontrolle behält man nur schwer.

Also ich habe auch so eine Tools-Klasse (nennt sich bei mir Utilities) und da sieht die Methode ungefähr so aus:
PHP:
final class Utilities {
  public static function hashPassword($pass, $salt){
    // do sth.
  }
}

Diese ist eine Blackbox zum Password-Hashing, welchen Hashing-Algorithmus ich darin verwende (Sha512) und wie gesalted wird, weiß der Code eben nicht, er bekommt nur ein definitiv sicheres Password heraus.

Nebenbei bemerkt ist der Parameter $salt ein Salt, welcher für jeden User unterschiedlich ist, zusätzlich wird an diesen Salt noch von der Methode wieder ein langer globaler Salt angehängt.
Wie gesagt, eine Blackbox (;)), man gibt ein Password und ein Salt hinein, was dadrinnen, passiert ist ungewiss, man weiß nur, es kommt etwas sicheres heraus.

aufgerufen sieht es dann so in etwa aus (findet eigentlich in Zend_Auth statt und ist daher anders, aber egal):
PHP:
$user = $this->db->fetchRow('SELECT pass, salt FROM users WHERE nick = ?', $form->getValue('username'));
$pass = Utilitites::hashPassword($form->getValue('pass'), $user['salt']);
if($user['pass'] === $pass) {
  // access granted
}

Ps: unbedingt Sonderzeichen in den userspezifischen und globalen Salt ;)
 
du möchtest objektorientiert arbeiten und nimmst eine PHP-Konstante? Wie wäre es mit einer Klassen-Konstante? ;)
PHP-Konstanten sind meiner Meinung nach unwartbar, sie fliegen überall rum und die Kontrolle behält man nur schwer.

Daran hatte ich auch bereits gedacht. Problem: Der globale Salt muss/soll in der Konfigurationsdatei festgelegt werden. Die Klasse an sich wird erst später geladen.

Also ich habe auch so eine Tools-Klasse (nennt sich bei mir Utilities) und da sieht die Methode ungefähr so aus:
PHP:
final class Utilities {
  public static function hashPassword($pass, $salt){
    // do sth.
  }
}

Diese ist eine Blackbox zum Password-Hashing, welchen Hashing-Algorithmus ich darin verwende (Sha512) und wie gesalted wird, weiß der Code eben nicht, er bekommt nur ein definitiv sicheres Password heraus.

Nebenbei bemerkt ist der Parameter $salt ein Salt, welcher für jeden User unterschiedlich ist, zusätzlich wird an diesen Salt noch von der Methode wieder ein langer globaler Salt angehängt.
Wie gesagt, eine Blackbox (;)), man gibt ein Password und ein Salt hinein, was dadrinnen, passiert ist ungewiss, man weiß nur, es kommt etwas sicheres heraus.

Dein globaler Salt ist in der Klasse hardcoded? Oder wie bekommst du den da rein? Über den Konstruktur der Utilities-Klasse?

Ps: unbedingt Sonderzeichen in den userspezifischen und globalen Salt ;)

Selbstverständlich, sonst wäre das Ganze ja witzlos^^

Greetz

paddya
 
Zuletzt bearbeitet:
Daran hatte ich auch bereits gedacht. Problem: Der globale Salt muss/soll in der Konfigurationsdatei festgelegt werden. Die Klasse an sich wird erst später geladen.
Wozu? Ein Script soll an mehrere Personen verteilt werden und diese sollen sich zur "Sicherheit" einen eigenen Hash einstellen können?
Nimm doch einfach 20 Sonderzeichen und gut ist.
Der Großteil verwendet nicht mal Salts:biggrin:
Ansonsten geh doch den Weg, dass dieser Salt als 3. Parameter übergeben wird, dann kannst du ihn an der Stelle des Funktionsaufrufes direkt übergeben.

Dein globaler Salt ist in der Klasse hardcoded? Oder wie bekommst du den da rein? Über den Konstruktur der Utilities-Klasse?
Jup, hardcodet.
Konstruktor? Die Hash-Methode ist eine statische Funktion :ugly:
 
Wozu? Ein Script soll an mehrere Personen verteilt werden und diese sollen sich zur "Sicherheit" einen eigenen Hash einstellen können?
Nimm doch einfach 20 Sonderzeichen und gut ist.
Der Großteil verwendet nicht mal Salts:biggrin:
Ansonsten geh doch den Weg, dass dieser Salt als 3. Parameter übergeben wird, dann kannst du ihn an der Stelle des Funktionsaufrufes direkt übergeben.

Okay. Dann werde ich das so machen. Klingt eigentlich auch logisch.
Konstruktor? Die Hash-Methode ist eine statische Funktion :ugly:

Stimmt. *pfeif*

Danke für deine Ausführungen :)

Greetz

paddya