Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireBird - Prepared Statement - SQL Injection (https://www.delphipraxis.net/137182-firebird-prepared-statement-sql-injection.html)

mkinzler 15. Jul 2009 20:55

Re: FireBird - Prepared Statement - SQL Injection
 
In Stored Procedures kann man neben "normalem" SQL-Code auch Strukturierte Anweisungen ( IF..Then..Else, For usw.) verwenden. So kann man Programmlogik auf den Server verlagern

Bernhard Geyer 15. Jul 2009 21:04

Re: FireBird - Prepared Statement - SQL Injection
 
Zitat:

Zitat von mkinzler
Es ging mir nicht um den Queryplan, sondern um die Reduktion der Datenmenge bzw. Verlagerung von Logik vom Client zum Server

Das kann man auch duch ein 3 bzw. N-Tier Architektur. Und m.E. ist es besser sich nicht zu sehr auf DB-Eigenheiten einzulassen um den Vendor-Lockin nicht zu groß werden zu lassen. Und auch Programmupdates erfordern ohne SP's bei weiten seltener ein DB-Update (mit Problem entsprechend die DB kurzzeitig offline schalten zu müssen).

fkerber 15. Jul 2009 21:07

Re: FireBird - Prepared Statement - SQL Injection
 
Also kann ich da rauslesen, dass für ein Statement wie dem obigem die prepared-Sache am besten geeignet wäre?


Grüße, Frederic

mkinzler 16. Jul 2009 05:39

Re: FireBird - Prepared Statement - SQL Injection
 
Zitat:

Zitat von fkerber
Also kann ich da rauslesen, dass für ein Statement wie dem obigem die prepared-Sache am besten geeignet wäre?


Grüße, Frederic

Ja für einfache Abfragen sind SPs meiner Meinung nach oversized. Es gibt aber auch Programmiererer, die alles als SPs implementieren

borwin 16. Jul 2009 07:49

Re: FireBird - Prepared Statement - SQL Injection
 
Hallo,

Zitat:

Ist folgendes "Vorgehen" sicher bzg. SQL Injections?
So wie Du es vor hast sehe ich schon eine Möglichkeit. Wenn man mit ein bischen probieren folgendes eingibt könnte man sich
Userrechte eines Admins 'erschleichen'
Benutzername: 'xxx'
Password: "'XX' OR (username LIKE '%ADMIN%' AND passwd LIKE '%'"

Wenn man die Abfrage in eine SP legt, ist sowas nicht möglich.
Der Vorteil wäre auch noch, dass man weitere Verarbeitungen in die gleiche SP legen kann. z.B. Abspeichern der Anmeldung,
prüfen von SessionsID.
Ich habe für ein Webprojekt alles komplett in SP gelegt. Will ich jetzt von php auf z.B. ASP.net umsteigen muss ich die Verarbeitungslogig gegen die DB
nicht mehr migrieren.

Gruß Borwin

fkerber 16. Jul 2009 09:35

Re: FireBird - Prepared Statement - SQL Injection
 
Hi!

oO
Ich blicke bei den ganzen Anführungszeichen nicht so ganz durch - kannst du ein konkretes Beispiel ohne zusätzliche Anführungszeichen machen.

Also sagen wir, es gibt folgende Nutzer:Passwort-Kombis:

normalerNutzer:pass1
admin:pass2

Was müsste man jetzt als Benutzername und Passwort eingeben, um mit obigem Code sich unrechtmäßig als admin einloggen zu können?
Ich dachte, die prepared-Geschichte würde mich vor diesen Anführungszeichen-Spielereien schützen?



Grüße, Frederic

mkinzler 16. Jul 2009 09:42

Re: FireBird - Prepared Statement - SQL Injection
 
Zitat:

Ich dachte, die prepared-Geschichte würde mich vor diesen Anführungszeichen-Spielereien schützen?
Das ist auch ein einer der Gründe Parameter einzusetzen.

borwin 16. Jul 2009 10:45

Re: FireBird - Prepared Statement - SQL Injection
 
Zitat:

Ich blicke bei den ganzen Anführungszeichen nicht so ganz durch - kannst du ein konkretes Beispiel ohne zusätzliche Anführungszeichen machen.
In Deinem Feld für Benutzername würde ich nur dummy Werte eingeben z.B. xx
Beim Passwort genau diese Zeichenkette : 'XX' OR (username LIKE '%ADMIN%' AND passwd LIKE '%')
Die Hochkomma sind Notwendig, da er die gesamte Zeichenkette quasi als Passwort an das SQL anhängt. Damit würde Dein eigentliches
SQL veränder werden. Wenn Du es als String ausgebe lässt, sieht es dann so aus

SQL-Code:
SELECT id FROM user WHERE username= 'xx' AND passwd = 'XX' OR (username LIKE '%ADMIN%' AND passwd LIKE '%')
Durch das OR wird die eigentliche Passwort/User Abfrage aufgehoben.
Das SQL würde genau so an die Datenbank geschickt.

Mit prepared und Parameter solltes es so wie oben beschrieben eigentlich nicht mehr möglich sein. Da für kenne ich aber php zu wenig.
Wie gesagt ich würde immer eine SP vorziehen. Da bist Du auf der sicheren Seite.

Das Könnte dann so aussehen

SQL-Code:
CREATE PROCEDURE SP_LOGIN (
    USERNAME VARCHAR(40),
    PW VARCHAR(40))
RETURNS (
    ID INTEGER)
AS
BEGIN
  SELECT ID
  FROM USER
  WHERE username = :USERNAME
  AND passwd = :PW
  INTO :ID;
  SUSPEND;
END
Das hatte ich noch vergessen. :-(
Und in Deinem Programm so aufrufen

SQL-Code:
SELECT ID FROM SP_LOGIN(USERNAME,PW)
Gruß Hartmuth

fkerber 16. Jul 2009 11:34

Re: FireBird - Prepared Statement - SQL Injection
 
Hi!

Danke für dein Code-Beispiel.

Jetzt nochmal ganz konkret meine Frage:
Reicht die Verwendung eines prepared-Statements, um die ' und "-Spielereien auszuschalten oder ist die Verwendung einer SP notwendig?


Grüße, Frederic

Bernhard Geyer 16. Jul 2009 11:56

Re: FireBird - Prepared Statement - SQL Injection
 
Zitat:

Zitat von fkerber
Reicht die Verwendung eines prepared-Statements, um die ' und "-Spielereien auszuschalten oder ist die Verwendung einer SP notwendig?

Die verwendung von parametrisierten Abfragen reicht - egal ob du die nun preparst für Performanceverbesserung bei mehrfacher verwendung oder nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:40 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz