Ralf Rummert: Passwortabfrage

Hi,

ich habe ein Problem bei einer Passwortabfrage, vielleicht könnt Ihr mir da ja mal weiterhelfen!

Der Code sieht so aus :
In der Datenbank gibt es die Spalte "user" und die Spalte "pass". In jeder Spalte ist ein Wert vorhanden. Aus einen Formular wird ein User übergeben z.b. "tschneider"

<% set db=Server.CreateObject("ADODB.Recordset")
db.open "SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1 %>

<% if Request("passwort") = db("pass") then %>

RICHTIG

<% else %>

FALSCH

<% end if %>

Ich bekomme immer folgende Fehlermeldung:

Kompilierungsfehler in Microsoft VBScript- Fehler '800a03ea'

Syntaxfehler

/iisHelp/common/500-100.asp, line 160

elseIf (objASPError.Description > "") Then
^
Microsoft OLE DB Provider for ODBC Drivers- Fehler '80040e10'

[Microsoft][ODBC Microsoft Access Driver] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.

/neu.asp, line 67

  1. Hallo Ralf,

    vermutlich liegt es an Deinem SQL-String

    db.open "SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1 %>

    der nicht wirklich so zusammengebaut ist, wie man sich das von einem String vorstellt. Das ist die Zeile 67, stimmts ? Ich würde empfehlen, vor dem db.open, den String als Stringvariable zu definieren und ihn mit Response.Write auszugeben. Dann bekommst Du zwar immer noch die Fehlermeldung, aber vorher wird die Wurzel des Übels ausgegeben. Nur so kannst Du sichergehen, wie der SQL-String wirklich aussieht.

    Was bitte soll eigentlich bei: Request("user") passieren ?

    Ciao
    Hans-Peter

    1. Hallo Hans-Peter,

      Das mit dem user ist so:

      In einem Formular wird der user ausgewählt und an hierhin übergeben. Dannach soll er alle Felder aus der Datenbabank auswählen wo der user z.b. Hans-Peter ist. (Das ist der Sinn des Strings)Dannach wird geprüft ob das vorher zum user eingegebene Passwort aus dem Formular mit dem Passwort aus der DB übereinstimmt. Du hast schon Recht, dass ist die Zeile 67, ich kann jeddoch keinen Fehler im String finden. Und der user wird auch richtig übergeben (habe ich mit Response.Write überprüft.)

      Hmmm...vielleicht nen Vorschlag wie ichs besser machen kann so dass es funzt?

      Danke für deinen Beitrag!

      Gruss

      Ralf

      1. Hi, hallo

        ich würde nicht unbedingt das Recordset (welches sich mit 'rs' besser abkürzen lässt als mit 'db') als 'db' verwenden, wenn du schon Application("db") verwendest, das könnte zu Verwirrungen führen. Aber das ist deine Sache mit dem Programmierstil.

        wenn "user" ein Textfeld ist, sollte das SQL besser lauten:

        SELECT User, Pass FROM tblPass WHERE user='" & Request("user") & "'"

        ein SELECT * FROM bringt nichts, wenn du nur das Feld 'Pass' brauchst, außer weniger Performance, weil mehr Daten zu schaufeln sind..

        nach dem Fehler zu urteilen ist Request("user") NULL und dein SQL sieht so aus

        "SELECT * FROM tblPass WHERE user="

        es könnte auch sein, dass deine Tabelle kein Feld namens user enthält

        du solltest statt Request("user") immer die Request-Collection mit angeben, es sei denn bestimmte Einrichtungen verhindern dies

        der Übersicht halber, sollten SQL-Statements immer erst in einem String zusammengebaut werden, bevor sie verwendet werden. Aber das ist deine Sache mit dem Programmierstil.

        Für solch eine Abfrage empfiehlt sich auch die Verwendung einer Stored Procedure bzw. parameterisierten Abfrage, damit gehst du auch gekonnt dem Thema SQL-Injection aus dem Weg.
        Bzw. die Zuweisung set rs = Application("db").execute(sql_statement)
        das erzeugt das schnellste Datensatzobjekt, dass man bekommen kann, forwardOnly und ReadOnly
        wenn du allerdings beim Überprüfen in der selben Tabelle gleichzeitig noch etwas ändern möchtest, z.b. das Last_Login oder so, kommst du mit sql,db-connection,3,3
        3 = adOpenStatic bzw. adLockOptimistic  besser

        dein Fehler ist nicht besonders kompliziert, du wirst ihn sicherlich schnell herausfinden und dir dann sprichwörtlich in den Hintern beissen

        HTH
        Tschau, tschüß,
        Frank

  2. Hallo Ralf,

    ich habe zwar seit Jahren nicht mehr mit ASP gearbeitet, aber ich denke mal, dass das bei ASP genauso sein wird wie bei Visual Basic. Dort musst du nämlich bei einer Funktion, der du mehr als einen Parameter übergibst, die Parameter in eine Klammer dahinter setzen. Also sprich aus deinem

    db.open "SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1

    mach ein

    db.open ("SELECT * FROM tblpass WHERE user=" & Request("user") , Application("db"), 3, 1)

    Das könnte der Grund sein, bin mir aber nicht sicher. Mal ausprobieren ;-)

    MfG,
    Mirko Hansen