Authentifizierung des Benutzernamens, Passwort durch Verwendung von Filtern in Java (Kontaktaufnahme mit der Datenbank)

8

Das Folgende ist der Teil des Java-Codes, der Filter verwendet, die die Fehlerseite jedes Mal anzeigen, wenn der Benutzername und das Passwort ebenfalls korrekt sind. Bitte helfen Sie mir, ich habe nicht viel Wissen über dieses Konzept.

%Vor%     
Ramu4u 22.12.2009, 10:05
quelle

4 Antworten

30
  

String sql="wähle * aus reg wo username = '" + user + "' und pass = '" + pwd + "'";

Das ist eine extrem schlechte Übung. Dieser Ansatz erfordert, dass sowohl der Benutzername als auch das Passwort durch Anfragen an Plain Vanilla weitergeleitet werden. Außerdem haben Sie dort eine SQL-Injection-Angriffslücke.

Nutzen Sie Sitzungen, in JSP / Servlet haben Sie die HttpSession für. Es ist wirklich auch nicht nötig, die DB bei jeder Anfrage immer wieder mit einem Filter zu treffen. Das ist unnötig teuer. Setzen Sie einfach User in Sitzung mit Servlet und verwenden Sie Filter , um die Anwesenheit bei jeder Anfrage zu überprüfen.

Beginnen Sie mit einem /login.jsp :

%Vor%

Erstellen Sie dann ein LoginServlet , das auf url-pattern von /login abgebildet ist und das doPost() wie folgt implementiert hat:

%Vor%

Dann erstellen Sie eine LoginFilter , die auf url-pattern von /secured/* abgebildet ist (Sie können aber auch Ihre eigene auswählen, zB /protected/* , /restricted/* , /users/* , usw.), aber diese muss mindestens abdecken Bei allen gesicherten Seiten müssen Sie die JSPs in den entsprechenden Ordner in WebContent einfügen und% code_de% wie folgt implementieren:

%Vor%

Das sollte es sein. Hoffe das hilft.

Um zu erfahren, wie ein doFilter() aussehen würde, finden Sie dies Artikel nützlich. Sie erfahren auch, wie Sie UserDAO verwenden können, um Ihre Webanwendung vor der SQL-Injektion zu schützen Angriffe.

Siehe auch:

BalusC 22.12.2009 12:34
quelle
3

Verwenden Sie eine vorbereitete Anweisung, Ihr Code ist eine offene Einladung für eine SQL-Injektion .

%Vor%

Nun zu Ihrer Frage, überprüfen Sie bitte:

  • dass die Tabellen- und Spaltennamen die richtige sind (haben Sie keine "Login" - und "Benutzername" -Spalte?)
  • dass die Werte wirklich korrekt sind (versuchen Sie die Abfrage in sqldeveloper zum Beispiel)
  • dass es mit einem ascii-7 Passwort und Benutzernamen funktioniert (es könnte ein Verschlüsselungsproblem sein)
  • dass die Passwortspalte das echte Passwort und kein Hash davon enthält
Jerome 22.12.2009 10:08
quelle
2

So viele Dinge sind falsch mit diesem ...: - /

  1. Der große - SQL Injection . Schreibe keine weitere SQL-Zeile in deinen Code, bis du sie verstanden hast. Und das ist keine Übertreibung für den Effekt; Code, der ohne dieses Verständnis geschrieben wurde, gibt einem Angreifer wahrscheinlich einen beliebigen Zugriff auf Ihre Datenbank.
  2. Eine Abfrage wie diese sollte nicht möglich sein, da Sie Kennwörter niemals im Nur-Text-Format speichern sollten. Stattdessen sollten Sie eine Art von (vorzugsweise gesalzenem) Hash des Passworts berechnen und speichern und dann das übergebene Passwort hashen und vergleichen. Siehe zum Beispiel So speichern Sie den Benutzer am besten Login und Passwort und Dein Passwort auf hier auf SO. Dies ist besonders schlecht, da Ihre SQL-Injection-Schwachstelle besteht.
  3. select * from reg ist unnötig, da Sie nur wissen wollen, ob eine Zeile existiert. Wenn Sie stattdessen select 1 verwenden, muss die Datenbank den Inhalt der Zeile nicht überprüfen und die Abfrageergebnisse nur aus dem Index liefern. Wenn Sie erwarten, dass viele Zeilen vorhanden sind, wäre select 1 where exists ... schneller, da die DB die Abfrage dann abkürzen könnte, nachdem sie mindestens eine Zeile gefunden hat.
  4. Sie schließen die Anweisung und die Ergebnismenge nicht in finally blocks. Dies bedeutet, dass sie nicht immer entsorgt werden (z. B. wenn ein SQLException ausgelöst wird), was zu Ressourcen- und Verbindungslecks führt.
Andrzej Doyle 22.12.2009 12:23
quelle
1

Zuallererst sollten Sie dafür parametrisierte Abfragen verwenden. Wenn der Benutzer '";DROP TABLE reg; als Benutzernamen eingibt, wird es große Probleme geben.

Sind Sie sicher, dass Benutzername und Passwort korrekt sind? Wie wäre es mit Groß- und Kleinschreibung?

    
Thomas Lötzer 22.12.2009 10:09
quelle