Sichere SQL Abfragen - Verständnissfrage

  • C#

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von King2k7.

    Sichere SQL Abfragen - Verständnissfrage

    Guten Morgen,
    ich entwickle gerade ein Programm mit dem ich auf eine MySQL Datenbank zugreifen möchte die nicht lokal sondern im Internet auf einem Server liegt.
    Habe jetzt schon einige Threads durchgelesen das es natürlich ein Sicherheitsrisiko ist und man das ganze über PHP machen sollte.

    Soweit so gut.

    Meine Frage ist jetzt: Wie muss ich aus Sicherheitsgründen weiter vorgehen da beim Start nur geguckt wird ob der Username und das Passwort stimmt. Kann ich jetzt einfach mit der Datenbank Arbeiten oder muss/sollte ich vor jedem Zugriff erneut prüfen wie und wer auf die Datenbank zugreift? Wenn ja wie?



    Hier mal mein Ansatz für den Login:

    PHP-Quellcode

    1. <?php
    2. $username = mysqli_real_escape_string($mysqli, $_GET['user']);
    3. $password = md5(mysqli_real_escape_string($mysqli, $_GET['passwd']));
    4. $sql = "SELECT `account_id`, `userid`, `user_pass` FROM `login` WHERE `userid` = '$username' AND `user_pass` = '$password'";
    5. $result = $mysqli->query( $sql );
    6. $row = $result->fetch_object();
    7. if($username == $row->userid && $password == $row->user_pass)
    8. {
    9. echo md5($username."sicher".$password);
    10. }
    11. else
    12. {
    13. echo "failed";
    14. }
    15. ?>

    Mein Programm sendet die Logindaten and diese PHP Datei und im Programm selbst gucke ich ob der selbe Wert errechnet wird wie mit der PHP Datei erst dann öffnet sich die Arbeitsmaske des Programms.
    Hallo King2k7

    Wunderbar, dass du dir Gedanken über Sicherheit machst. :thumbsup:

    Positiv:
    • Verwendung von MySQLi
    • Passwort als Hash in der Datenbank
    Negativ:
    • Keine Überprüfung der Parameter
    • MD5 ist veraltet!
    • Passwort als Klartext an Skript

    1. Parameter prüfen
    Du solltest prüfen, ob Benutzername und Passwort gesetzt sind. So kannst du darauf reagieren und eine Rückmeldung wie "Benutzer und Passwort eingeben" werfen.
    Ob Parameter gefüllt sind, kannst du so bewerkstelligen: PHP isset - Manual

    2. MD5 ersetzen
    Du solltest dir eine Alternative zu MD5 suchen. MD5 ist alt und nicht mehr sicher. 8o
    Hier wurde auch nach einer MD5 Alternative gefragt: Md5 Alternative in PHP?

    3. Passwort als Klartext
    Anhand dieser Zeile$password = md5(mysqli_real_escape_string($mysqli, $_GET['passwd'])); erkenne ich, dass du das Passwort nicht gehast überträgst.
    Sprich, wenn du das PHP Skript nicht über HTTPS aufrufst, kann das Passwort mitgelesen werden.
    Besser: Passwort im Programm hashen und dann an das Skript weitergeben. ^^

    4. Wie weiter

    King2k7 schrieb:

    Kann ich jetzt einfach mit der Datenbank Arbeiten oder muss/sollte ich vor jedem Zugriff erneut prüfen wie und wer auf die Datenbank zugreift? Wenn ja wie?

    Das ist eigentlich dir überlassen.

    Zuerst mal zum WER:
    Wenn Personen ohne Login auf die Skripts Zugriff haben sollen: Nein. Ansonsten: Ja!

    Dann zum WIE WAS:
    Wenn du Aktionen von Benutzer einschränken möchtest, zum Beispiel das nur Person XY dieses PHP Skript aufrufen dürfen: Ja. Ansonsten: Nein.

    Jetzt zum WIE:
    Das kannst du am besten mit PHP Sessions lösen. Such mal nach: PHP Sessionbasiertes Loginsystem :thumbup:

    So, dass wars fürs erste. Hoffe das hilft dr weiter.

    Edit: Fast vergessen! Guck dir doch mal die vordefinierten Statements an, relativ praktisch :D
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    php bietet auch keine wirkliche Sicherheit.
    Zwar kann ein Angreifer durch sniffen nun nicht mehr die ganze Datenbank übernehmen, aber immer noch den Zugang eines einzelnen Users.


    Sicherheit bietet allein TLS - Verschlüsselte Kommunikation, weil da kann man nur den Public Key eines Users für eine Sitzung mit-sniffen (mit dem man nur ver-, aber nix ent-schlüsseln kann), und das wars schon.
    TLS bindet auch Zertifikate ein, damit ist auch der ManInTheMiddle-Angriff abgewehrt.