PHP Login

Id wird automatisch immer um 1 erhöht. eigentlich

*GIGA FACEPALM*

$query = "INSERT INTO `bromedsql5`.`$netname` (`ID`, `name`, `channel`, `vpd`, `subscriber`, `views`, `earnings`, `paypayl`, `accepted`, `contractid`, `mail`) VALUES (NULL, '$legalname', '$channelname', '0', '0', '0', 'n/a', '$paypalmail', 'in progress', '$contractid', '$email')";

:D I am a genius
 
Zuletzt bearbeitet:
Hi,

mysql_real_escape_string, addslashes, striptags hat in heutigen skripten eigentlich keine daseinsberechtigung mehr.

Code:
<?php
session_start();


class basic_encryption {

    private $key = "deinKeyAKAmd5hash";
    private $iv  = "deinIvAKAmd5hash";

    public function encrypt($plain){
        $crypted   = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->key, $plain, MCRYPT_MODE_CBC, $this->iv);
        $crypted   = base64_encode($crypted);
        $crypted   = preg_replace('/[+]/', '-',$crypted);
        return $crypted;
    }
    public function decrypt($crypted){
        $crypted   = preg_replace('/[-]/', '+',$crypted);
        $crypted   = base64_decode($crypted);
        $plain     = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->key, $crypted, MCRYPT_MODE_CBC, $this->iv);     
        return $plain;
    }
}


class sanitize{

    private $regex;

      // set regex to cleanup invalid characters
      public function clPM($string) { 
        $this->regex = "/[^\p{L}\d_!,;:.\s\/\-\"\'@®+&§]/ui";
        return $this->{'add_selection'}($string);
      }

      private function add_selection($string){
        $std   = preg_replace($this->regex, "", $string);
        $clean = preg_replace('/[\x80-\xFF]/', '?', $std);
        $clean = str_replace(chr(0), '', $std);

        return $clean;
      }

}





if( empty($_POST['password']) || empty($_POST['mail']) ){ 
	header( 'Location: /index.php?login=failed&reason=empty.values' ); 
	exit(); 
}

// sessiontoken auf der loginseite erzeugen
if( !isset($_SESSION['token']) ){ 
	header( 'Location: /index.php?denied=true' ); 
	exit(); 
 }

else{

  unset($_SESSION['token']); 

  $clean  = new sanitize;

  $passwd = $clean->{'clPM'}($_POST['password']);
  $mail   = $clean->{'clPM'}($_POST['mail']);


  $aes    = new basic_encryption;
  $user   = 'unprivilegeduser';
  $keeper = trim($aes->{'decrypt'}('VerschlüsseltesDBpasswd'));
  $dbh    = new PDO("mysql:host=127.0.0.1;dbname=DeineDB", $user, $passwd);  


  $sth = $dbh->prepare("SELECT COUNT(*) FROM users WHERE Email = ? AND Password = ?  ");
  $sth->execute(array($mail,$passwd));
  $r = $sth->fetch(); 
  $r = $r[0]; 

  if( $r > 0 ){

      $sth = $dbh->prepare("SELECT id,username FROM users WHERE Email = ? AND Password = ? ");
      $sth->execute(array($mail,$passwd));
      $r = $sth->fetch(); 

      $_SESSION['UserDetails'] = array('UserID' => $r['0'],'Username' => $r[1]);
      $_SESSION['Admin'] = $r[1] == 'Admin' ? true : false;
      $dbh = NULL;
      header( "Location: /index.php?session=started" );
      exit();

      }

   else{
      $dbh = NULL;
      die(header( "Location: /index.php?login=failed&reason=some.reason" ));
}


}


?>


PS: Sorry für das Chaos. Hab das schnell zusammengeschnippelt. Geht natürlich auch mit einer einzelnen Abfrage.
 
Zuletzt bearbeitet:
Was ist denn Sanitize für ne schlechte Idee? (Viele Sonderzeichen, die ein Passwort sicher machen, werden gefiltert. Performance war nicht das Entwicklungskriterium?)
Und warum verwendest du immer $class->{'name'} wenn auch $class->Name gehen würde?
PDO wirft ne Exception, wenn die Datenbank überlastet ist (daher try-catch drumrum, damit deine Logindaten nicht im Klartext an die Öffentlichkeit kommen).

Aber wenigstens PreparedStatements, damit haste auf jeden Fall SQL-Injections abgewehrt.
 
Das sind Beispiele. Die Frage ist wie komplex soll es werden um Neueinsteigern sowas verständlich zu machen?

Passwörter gehören natürlich gehashed. Die Zeilen schnippel ich aus aktuellen Projekten raus und editier sie halbwegs passend (aus dem kontext rausarbeiten). Die Originalklasse umfasst 6-7 verschiedene Optionen. Dateiordner, numericsonly, minimalreinigung etc. Stört mich da jetzt weniger.

Edit: Die regex ist negiert. Wer nutzt schon andere Zeichen als die "erlaubten"?

Warnungen und Fehler sind in meiner php.ini deaktiviert, habs aber grad getestet und ne Fehlerseite wäre schon angebracht.
Ergänzung ()

PS: Die feine englische Art wäre es auch die Queries in eine Funktion zu packen, Fehler zu sammeln und dann erst anhand der Fehler zu entscheiden ob abgebrochen wird oder die Funktion aufgerufen wird. Ohne quer verteilte echos.
 
Zuletzt bearbeitet:
Na ja, wenn da ein Chinese kommt, dann wird der sich nicht freuen, wenn der nicht den Namen seiner Freundin nehmen kann. Und mit dem negiert hast recht, hab ich übersehen. Persönlich würd ich Passwörter immer als BLOB behandeln.

Ich würde immer mit allen Warnungen programmieren, dann merkst du direkt, wenn du was vermurkst hast.

@feine englische Art:
Da kann man eine tolles Symbiose aus Transaktionen und Exceptions bauen, falls man das will.
 
Solange er die auf die erlaubten Zeichen hingewiesen wird sollte das Ok sein. Ist es garantiert das Prepared Statements nicht zu brechen sind?

Denke es ist besser nicht blind auf Prepared St. zu vetrauen.
 
Zurück
Oben