[Tipp] Sql-Injections verhindern

  • PHP

    [Tipp] Sql-Injections verhindern

    Wenn man eine Datenbankabfrage braucht, zum Beispiel für ein Loginsystem, greifen viele zu einem php-Skript. Dies ist aber relativ unsicher, wie folgender Comic darstellt:


    Hier zeige ich euch, wie ihr euer php-Skript weitgehend gegen Sql-Injections absichern könnt.

    Sicherheitstipps:
    • Verbinde dich niemals mit dem root- bzw. Superuseraccount, sondern nimm einen neuen Benutzer:





      Anmelden mit Root-RechtenBenutzerkonten anwählenNeuen Account erstellenHostname möglichst auf Lokal stellen, damit keine Drittverbindungen bestehen können. Auch sollte man eine Datenbank mit gleichen Namen erstellen und wenn nötig alle mit username\_%.

      So kann der Angreifer nicht als zu viel Schaden anrichten, da er auf die eine Datenbank gebunden ist.
    • Verwende Prepared-Statements mit gebundenen Variablen:

      PHP-Quellcode

      1. <?php
      2. // SELECT-Bespiel
      3. // 1. Neue Datenbankverbindung
      4. $handler = new mysqli("host", "nutzer", "passw", "datenbankname");
      5. // 2. Statement vorbereiten ohne Userinput. Das ? wird gleich ersetzt.
      6. $stmt = $handler->prepare("SELECT * FROM vb-paradise_user WHERE (username = ?)");
      7. // 3. Den Platzhalter ? mit einem s für String binden. Es gibt folgende Parameter: i nteger, d ouble, s tring und b lob (paketweise)
      8. $stmt->bind_param('s', $name);
      9. // 4. $name festlegen, im Normalfall durch eine POST-Abfrage erfragte Daten
      10. $username = "Michdi";
      11. // 5. Query ausführen
      12. $stmt->execute();
      13. // 6. Daten zuweisen
      14. if (!$stmt->get_result()) {
      15. var_dump("no data in 'vb-paradise_user' with username = '$name'");
      16. // 6.1. Query mit einem anderen Wert wiederholen (optional)
      17. $name = "JemandAnderes";
      18. $stmt->execute();
      19. // ...
      20. } else {
      21. // Ergebnis ausgeben
      22. var_dump($res->fetch_all());
      23. }
      24. // 7. Verbindung schließen
      25. $stmt->close();
      26. ?>
      27. <?php
      28. // INSERT-Beispiel
      29. // 1. Query vorbereiten
      30. $stmt = $handler->prepare("INSERT INTO vb-paradise_user (id, username) VALUES (?, ?)");
      31. // 2. Platzhalter binden ("is" = integer und string, man kann so mehrere Parameter nacheinander nutzen (z. B. sssd)
      32. $stmt->bind_param("is", $id, $username);
      33. // 3. $id einen Wert zuweisen
      34. $id = 24049;
      35. // 3.1. $username einen Wert zuweisen
      36. $username = "Michdi";
      37. // 4. Ausführen
      38. $stmt->execute();
      39. // 5. Schliessen
      40. $stmt->close();
      41. ?>


    Das sind erstmal zwei Tipps, wie ihr eure Datenbank sicherer machen könnt.
    Ich hoffe ich konnte helfen! Und ich werde erstmal meine Skripte umschreiben... :D

    *Topic verschoben, da im T&T-Bereich keine PHP-Tipps zulässig sind.
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()