Re: =?UTF-8?Q?Re: SQL-DB Lesen =c3=bcber ODBC-Treiber
Von:Matthias Kahlert usenet@max-pro.de
An:Hans-Peter Grözinger hanspetergr@gmx.de :gelesen
erstellt am:21.02.2018 02:05:03 - #23695 in section Antworten     Antworten mit Zitat
--from Newsreader at Mittwoch, 21. Februar 2018; 02:05:03--

Am 15.02.2018 um 19:01 schrieb Hans-Peter Gr�zinger:
> So ganz habe ich das ganze Szenario noch nicht verstanden
>
> Wie muss denn der SQL-SELECT auf VFP-Seite genau aussehen?
> Beispiel:
> *-- Kurzzeichen des Benutzers.
> lcUser = 'HPG'
> lcSQLSelect = 'SELECT VorName, Name FROM tabBenutzer WHERE KurzZeichen =
> ?lcUser'
>
> Ich lasse dann ausführen:
> lnResult = SQLEXEC( lnConnection, lcSQLSelect, 'cursResult' )
>
> Was passiert denn jetzt bei dem SQLEXEC genau?
>
> Wandelt der ODBC-Treiber oder die VFP-Funktion SQLEXEC den SELECT noch
> um weil ein ? im SELECT steht in:
> DECLARE @KurzZeichen CHAR(3) = N'HPG';
> SELECT VorName, Name FROM tabBenutzer WHERE KurzZeichen = @KurzZeichen';
>
> Es wäre hilfreich mir hier noch etwas aufs Pferd zu helfen, im
> Steigbügel stehe ich schon mal

Wenn du die SQL-Server Vollversion installiert hast, findest Du im SSMS
im Menü Extras --> SQL Server Profiler. Mit dem Profiler kannst Du quasi
die komplette Kommunikation zwischen Server und Client/Applikation
mitlesen. Der siehst Du, welche SQL Befehle durchlaufen, wie viel
CPU-Zeit die jeweils gebraucht haben, wie viele Reads und Writes, und Du
siehst eben auch die echt abgeschickten SQL-Befehl.

Aus Deinem Beispiel wird dann sowas wie:

exec sp_executesql N'SELECT VorName, Name FROM tabBenutzer WHERE
KurzZeichen = @P1 ',N'@P1 varchar(3)','HPG'

Er ruft also in Wahrheit eine StoredProcedure auf, an die der SQL-Befehl
übergeben wird. Der Parameter wird in ein @P1 umgewandelt, und separat
übergeben. Wenn sich also der Parameter ändert, bleibt der SQL-Befehl
identisch.

Im VFP gibt es statt dem SQLEXEC() übrigens auch noch den SQLPREPARE(),
der das SQL-Kommando compiliert ohne es auszuführen, und dann erst
mittels SQLEXEC() ausführt (wobei da der Befehl nicht mehr angegeben
werden muss). Bei Schleifendurchläufen kann man damit also einfach
optimieren.

Zum Beispiel:

SQLPREPARE(lnHandle, "INSERT INTO tabelle ( test ) VALUES ( ?lnI )")
FOR lnI = 1 TO 1000
SQLEXEC(lnHandle)
ENDFOR

Tipp: Mit dem SQL Profiler kann man auch "Fremdprogramme" mitlesen, was
die im SQL Server so machen! Damit kann sogar das SQL Server Management
Studio mitlesen, was der im Hintergrund für SQL Befehle absetzt, wenn
man beispielsweise ein DB-Backup macht oder Optionen verändert.

--
Matthias
Von:Matthias Kahlert usenet@max-pro.de
An:Tom Knauf knauf@pdtgmbh.de
erstellt am:21.02.2018 02:10:29 - #23696 in section Antworten     Antworten mit Zitat
--from Newsreader at Mittwoch, 21. Februar 2018; 02:10:29--

Am 16.02.2018 um 16:11 schrieb Tom Knauf:
> Bei Uebergabe als Parameter an ODBC
> ist eine sqlinjection soweit ich
> weiss nicht moeglich, bei Literalen schon.
> https://xkcd.com/327/
> https://www.explainxkcd.com/wiki/index.php/Little_Bobby_Tables
> https://www.easysoft.com/developer/sql-injection.html

Das ist mit ein Hauptgrund, warum ich zu 99,999% mit Parametern arbeite.
Ich muss mich damit nicht um SQL Injection kümmern, denn die ist dabei
nicht möglich, und ich muss mich auch nicht um Sonderzeichen ö.ä. kümmern.

Oder was machst Du, wenn ein Firmenname eines Kunden >> [Meine] 'tolle'
"Firma" << lautet?

--
Matthias