2016-04-29 3 views
2

Die SQLite.swift documentation for filtered queries diesem Beispiel gibt:korrekte Variablenbindung und die Vermeidung von SQL-Injection mit SQLite.swift fragt

users.filter(email.like("%@mac.com")) 
// SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com') 

Da ich auf eine Benutzereingabe, die Datenbank basierend suchen wollen, ich denke, ich folgendes tun könnte:

let stringPrefix = userInput + "%" 
users.filter(email.like(stringPrefix)) 
// SELECT * FROM "users" WHERE ("email" LIKE 'johndoe%') 

Gehe ich den richtigen Weg? Mit anderen SQLite-Umgebungen in der Vergangenheit habe ich variable binding mit ? verwendet, um SQL injection zu vermeiden. Wird das hinter den Kulissen mit SQLite.swift gemacht? Ich habe keine Informationen in der Dokumentation gesehen, außer ein wenig über das Binden im Bereich Executing Arbitrary SQL.

Antwort

2

aus this Quelldatei genommen:

@warn_unused_result public func like(pattern: String, escape character: Character? = nil) -> Expression<Bool> { 
    guard let character = character else { 
     return "LIKE".infix(self, pattern) 
    } 
    return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)]) 
} 

Dies ist nur eine der Überlastung der gleichartigen Funktion ist. Die andere Überladung sieht ziemlich ähnlich aus und verwendet tatsächlich auch die Parameterbindung. Spazieren Sie im Quellcode, um dies selbst zu überprüfen.

Ich würde jedoch erwarten, dass Sie interne Tests haben, um zu überprüfen, dass SQLite-Injektionen nicht möglich sind.

+1

Vielleicht ist dies eine separate Frage, aber ich bin mir nicht sicher, welche anderen internen Tests ich machen sollte, wenn die Parameterbindung schon erledigt ist. – Suragch

Verwandte Themen