PHP Code optimieren?

  • Wäre es möglich den Code noch besser zu optimieren oder ist das für den Anfang schon ganz okay so wie es ist, und würdet ihr sagen es ist eine Lücke vorhanden in dieser Abfrage?

  • Bevor du eine Datenbankabfrage machst solltest du $user escapen. Das verhindert das jemand in das Namensfeld zum Beispiel das hier eingibt: "';DROP DATABASE;'" wodurch er deine Datenbank löschen kann. (Keine Ahnung ob man das jetzt genau so schreiben muss mit den Anführungszeichen auf jeden fall gibt es die Möglichkeit)

    PHP
    $sql = "SELECT Admin FROM spieler WHERE Name = '".mysqli_real_escape_string($user)."' LIMIT 1";


    Und bevor du den Namen auf der Seite ausgibst solltest du das hier machen:


    PHP
    echo "Willkommen ".htmlspecialchars($_SESSION["UserName"])."<br>";

    Damit kann der Benutzer keine HTML Befehle in den Namen schreiben. Dieser Text: "<a href='http://breadfish.de'>MEINName</a>" würde mit htmlspecialchars genau so ausgegeben werden wie du ihn hier siehst. Ohne htmlspecialchars würde ein Link erstellt werden.

  • Ich danke dir vielmals ;) Im Login ist die Abfrage so gerelelt. Danach kommt keine weitere Eingabe.


    PHP
    $sql = "SELECT * FROM spieler WHERE Name = '". $database->real_escape_string($user)."' AND Passwort = md5('".$database->real_escape_string($pass)."') LIMIT 1";
  • Wenn du mit der Abfrage nur checken willst ob der Account existiert würde ich "SELECT id" verwenden. Wenn du dann gleich aus dieser Abfrage die Benutzerdaten ausliest ist es ok.
    Das "LIMIT 1" am Ende wäre auch nicht unbedingt notwendig da du ja wsl ohnehin schon keine Registrierungen mit dem gleichen Namen erlaubst UND da der Code dann sowieso etwa so aussehen sollte:

    PHP
    $sql = "SELECT * FROM spieler WHERE Name = '". $database->real_escape_string($user)."' AND Passwort = md5('".$database->real_escape_string($pass)."')"; 
    $result = $database->query($sql); 
    if($result->num_rows == 0) 
    {
    // Nicht richtig
    }
    else 
    {
    $row = $result->fetch_object(); // $row bezieht sich sowieso nur auf das erste Ergebnis der Query
    }