SQL Injection in VBA

  • Word

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von KronSii.

    SQL Injection in VBA

    Hallo liebe Community,

    wie der Titel bereits sagt, beschäftige ich mich zurzeit mit dem Thema SQL Injection, allerdings bin ich in diesem Thema ein absoluter Neuling. Ich weiß nur, dass es möglich ist einen SQL-String so zu manipulieren, dass die Datenbank komplett ausgelesen werden kann und sogar gelöscht werden kann. Dies soll in meinem Programm nicht möglich sein, daher habe ich etwas im Internet gesucht und bin direkt bei Wikipedia auf eine Lösung gestoßen. Allerdings würde ich mich doch vorher absichern, weil Wikipedia ja nicht unbedingt die sicherste Quelle ist :D

    Dort steht:

    Anstatt

    Visual Basic-Quellcode

    1. cn.Execute "SELECT spalte1 FROM tabelle WHERE spalte2 = '" & spalte2Wert & "'"


    sollte Folgendes verwendet werden:

    Visual Basic-Quellcode

    1. Dim cmd As ADODB.Command, rs as ADODB.Recordset
    2. With cmd
    3. Set .ActiveConnection = cn
    4. Set .CommandType = adCmdText
    5. .CommandText = "SELECT spalte1 FROM tabelle WHERE spalte2 = ?"
    6. .Parameters.Append .CreateParameter("paramSp2", adVarChar, adParamInput, 25, spalte2Wert) '25 ist die max. länge
    7. Set rs = .Execute
    8. End With



    So wie es scheint wird hier über Append das ? mit Text ersetzt. Ist dies sicher?
    Wenn ja, ist es auch möglich zwei ? einzufügen?
    Also z.B.

    Visual Basic-Quellcode

    1. .CommandText = "SELECT spalte1 FROM tabelle WHERE spalte2 = ? AND spalte 3 = ?"
    2. .Parameters.Append .CreateParameter("paramSp2", adVarChar, adParamInput, 25, spalte2Wert)
    3. .Parameters.Append .CreateParameter("paramSp2", adVarChar, adParamInput, 25, spalte3Wert)


    Mit freundlichen Grüßen
    KronSii
    Hallo nochmal :)

    Das freut mich schonmal, das diese Variante sicher ist.
    Ich habe nun versucht meinen Quellcode anzupassen, stoße dabei allerdings auf ein Problem. Mein Quellcode schaut jetzt so aus:

    Visual Basic-Quellcode

    1. Dim cmd As ADODB.Command
    2. Dim rec as ADODB.Recordset
    3. With cmd
    4. Set .ActiveConnection = cn
    5. Set .CommandType = adCmdText
    6. .CommandText = "SELECT Companies.Name1, Companies.code, Personel.code, Personel.Adress, Personel.Lastname " & _
    7. "FROM Companies INNER JOIN Personel ON Comapnies.code = Personel.code " & _
    8. "WHERE Companies.Name1 = ?"
    9. .Parameters.Append .CreateParameter("paramSp2", adVarChar, adParamInput, 25, Firmenname) '25 ist die max. länge
    10. Set rec = .Execute
    11. End With


    Bei dem Befehl ".CommandType" schmeißt das Programm den Folgenden Fehler:

    Fehler beim Kompilieren:
    Unzulässige Verwendung einer Eigenschaft

    Dieser Fehler sagt mir leider gar nichts. Kann mir dabei jemand helfen?

    Gruß
    KronSii
    Erstens brauchst du ein Objekt, nicht nur eine Deklaration

    Visual Basic-Quellcode

    1. Dim cmd As New ADODB.Command


    Zweitens ist CommandType eine Property vom Typ CommandTypeEnum was quasi einem Int oder Long entspricht.
    Daher darf man dort kein SET verwenden sondern einfach normal zuweisen:

    Visual Basic-Quellcode

    1. .CommandType = adCmdText
    Das ist meine Signatur und sie wird wunderbar sein!