Toon posts:

Parametrized queries vs SQL Injection

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb mij eens zitten verdiepen in parametrized queries en SQL Injection.
Ik hier een aantal topics over doorgelezen en nog een aantal tutorials en webartikelen doorgenomen.

Daarin kwam naar voren dat je data die van de client komt nooit kunt vertrouwen.
Zo kan men bijvoorbeeld SQL Injection gebruiken.

Ik las echter dat parametrized queries hierin de uitkomst biedt.

Mijn vraag is of je bij het gebruik van parametrized queries nooit meer last zult hebben van SQL Injection?

En is het dan nog nodig om de teruggekregen data te escapen, of voorziet de parameterized queries hierin? ( Ik neem aan dat het wel nodig is om de data te controleren ivm met datatype errors.)

Ook las ik ergens dat het aanmaken van de parameters in de juiste volgorde moet gebeuren omdat er geen rekening met de parameters wordt gehouden. Geldt dit ook voor asp/vbscript?

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
dim sqlquery
    sqlquery = "SELECT id, foo FROM tbl_foo WHERE id=? AND foo=?;"
    
With objCom
  .ActiveConnection     = objCon
  .CommandText         = sqlquery        
  .CommandType         = adCmdText        
        
    .Parameters.Append .CreateParameter("@id", adInteger, adParamInput, 4, intID)
    .Parameters.Append .CreateParameter("@foo", adVarWChar, adParamInput, 4, strFoo)

  .Execute    
End With


Ik snap alleen nog niet waarom de parameter bij het juiste veld wordt gebruikt. Aan die ? is immers toch weining af te leiden. (alleen dat er een parameter hoort, maar niet welke)
Of komt dat door de naam van de parameter (Moet die hetzelfde zijn als het veldnaam?)
Of juist door de volgorde...

B)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:21

mulder

ik spuug op het trottoir

Ook las ik ergens dat het aanmaken van de parameters in de juiste volgorde moet gebeuren omdat er geen rekening met de parameters wordt gehouden. Geldt dit ook voor asp/vbscript?
Dit is juist bij vbscript het geval. Lekker vbscript crappy ;)

oogjes open, snaveltjes dicht


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Don Facundo schreef op dinsdag 29 november 2005 @ 18:19:
[...]

Dit is juist bij vbscript het geval. Lekker vbscript crappy ;)
bij VBScript is het sowieso niet nodig in combinatie met het gebruik van MSSQL Server. Met mySQL weer wel, omdat die in de query ? moet hebben, tegenover MSSQL @naam.

Alleen bij een parameter van het type RETURN moet je even oppassen, maar uit mn hoofd weet ik niet meer of die vooraan of juist achteraan moest.

ennnuh, vbscript doet heus niet veel onder voor php hoor ;) (in geval van gebruik in asp-pagina's bedoel ik dan)

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


  • whoami
  • Registratie: December 2000
  • Laatst online: 22-04 14:33
Verwijderd schreef op dinsdag 29 november 2005 @ 18:03:
Mijn vraag is of je bij het gebruik van parametrized queries nooit meer last zult hebben van SQL Injection?

En is het dan nog nodig om de teruggekregen data te escapen, of voorziet de parameterized queries hierin? ( Ik neem aan dat het wel nodig is om de data te controleren ivm met datatype errors.)
Nee, je hoeft je gegevens niet meer te escapen; ook datums etc worden goed afgehandeld.
Ook las ik ergens dat het aanmaken van de parameters in de juiste volgorde moet gebeuren omdat er geen rekening met de parameters wordt gehouden. Geldt dit ook voor asp/vbscript?
Dat is niet altijd waar, en hangt af van verschillende factoren.
In .NET moet je bv geen rekening houden met de volgorde als je gebruik maakt van de SqlClient classes, maar wel als je gebruik maakt van de OleDb classes.
Ik geloof dat je in asp/vbs ook wel rekening zult moeten houden met de volgorde.
Ik snap alleen nog niet waarom de parameter bij het juiste veld wordt gebruikt. Aan die ? is immers toch weining af te leiden. (alleen dat er een parameter hoort, maar niet welke)
Dat zal dus idd te maken hebben met de volgorde.
De parameter die je als eerste toevoegt, is de parameter voor de eerste placeholder, etc...

https://fgheysels.github.io/


Verwijderd

Verwijderd schreef op dinsdag 29 november 2005 @ 18:03:
Daarin kwam naar voren dat je data die van de client komt nooit kunt vertrouwen.
Zo kan men bijvoorbeeld SQL Injection gebruiken.

Ik las echter dat parametrized queries hierin de uitkomst biedt.

Mijn vraag is of je bij het gebruik van parametrized queries nooit meer last zult hebben van SQL Injection?
Jazeker dat je last kan hebben van SQL Injection met parameters. Maar eigenlijk met name in MSSQL als je de functie 'EXEC' of 'EXECUTE' gebruikt (in een storedprocedure). Dan kan er nog steeds SQL Injection ontstaan, omdat je een dynamische string uit gaat voeren.
Weet niet of MySQL ook zoiets kent...

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:21

mulder

ik spuug op het trottoir

wizzkizz schreef op dinsdag 29 november 2005 @ 18:25:
[...]
bij VBScript is het sowieso niet nodig in combinatie met het gebruik van MSSQL Server. Met mySQL weer wel, omdat die in de query ? moet hebben, tegenover MSSQL @naam.
Show me. We hebben het niet over sp's hier he :)

oogjes open, snaveltjes dicht


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Don Facundo schreef op dinsdag 29 november 2005 @ 20:50:
[...]


Show me. We hebben het niet over sp's hier he :)
i know ;)

maar je kunt je commandType toch op adCmdText zetten en dan in je query iets als:
"UPDATE blah SET veld1=@veld1, veld2=@veld2 WHERE veld3=x"

voor mySQL moet je je query dan hebben:
"UPDATE blah SET veld1=?, veld2 = ? WHERE veld3=x"

voor de eerste (de mssql versie dus) kun je de volgorde van de parameters omwisselen, voor de mySQL versie niet, omdat je daar (afaik) geen naam aan toe kunt kennen ;)

[ Voor 12% gewijzigd door wizzkizz op 29-11-2005 20:57 ]

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:21

mulder

ik spuug op het trottoir

maar je kunt je commandType toch op adCmdText zetten en dan in je query iets als:
"UPDATE blah SET veld1=@veld1, veld2=@veld2 WHERE veld3=x"
Zover ik weet kan dit dus ook niet met MSSQL, dit is echt een vbscript (nood)oplossing.

oogjes open, snaveltjes dicht


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Don Facundo schreef op dinsdag 29 november 2005 @ 21:29:
[...]


Zover ik weet kan dit dus ook niet met MSSQL, dit is echt een vbscript (nood)oplossing.
oh, ik heb het een aantal keer gebruikt ipv een sp en het werkt toch echt als een tierelier hoor. Heeft toch niets met een noodoplossing te maken? Heeft als belangrijkste voordeel boven de ? als placeholder de duidelijkheid, vind ik.

[ Voor 11% gewijzigd door wizzkizz op 29-11-2005 21:37 ]

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:21

mulder

ik spuug op het trottoir

Dan zeg ik dus show me! :)

oogjes open, snaveltjes dicht


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

keej dan :p
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set oCmd = Server.createObject( "ADODB.Command" )
    oCmd.activeConnection = oCustConn
    oCmd.commandType      = adCmdText           
    oCmd.commandText      = query_update_title

    oCmd.Parameters.Append oCmd.createParameter( "@title", adVarchar, adParamInput, 255, title )        
    oCmd.Parameters.Append oCmd.createParameter( "@id", adChar, adParamInput, 38, sArticleId )

    oCmd.Execute

    ' hier wordt het object oCmd nog een aantal keer gebruikt, vandaar de generieke naam ;)
    ....
Set oCmd = Nothing


die query staat dan in een ander bestand, maar ziet er zo uit:
SQL:
1
2
3
UPDATE content_metadata 
SET    title = @title
WHERE  id = @id     

[ Voor 39% gewijzigd door wizzkizz op 29-11-2005 22:20 . Reden: uitlijningen enzo :s ]

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Verwijderd

wizzkizz schreef op dinsdag 29 november 2005 @ 20:55:
[...]
voor mySQL moet je je query dan hebben:
"UPDATE blah SET veld1=?, veld2 = ? WHERE veld3=x"

voor de mySQL versie niet, omdat je daar (afaik) geen naam aan toe kunt kennen ;)
In het algemeen is de ? notatie voor parameters in je query toch gewoon DB onafhankelijk bij prepared statements? Je hoeft helemaal geen rekening te houden met welke DB er achter hangt. De specificatie zegt ook duidelijk dat ALS een DB prepared statements niet ondersteund, dat dan de JDBC driver zelf voor de juiste escaping zal zorgen

Het is overigens 'redelijk' simpel om zelf een layer bovenop je prepared statements te schrijven die de @param notatie omzet naar de ? notatie. Je kunt dan in code gewoon de parameters via name zetten, en pas op het moment dat de querie ge-execute laat worden genereer je eerst de ? versie van de SQL text, daar roep je vervolgens in volgorde de setParam functies op aan, en klaar is Henk ;)

Verwijderd

Topicstarter
whoami schreef op dinsdag 29 november 2005 @ 19:35:

...ook datums etc worden goed afgehandeld.
Datums, ook altijd lastig ja.

Is er hierbij een standaard format om de datums in te voeren en op te halen, zodat de dag en maand niet wordt omgedraaid. bv yyyy-mm-dd (heb wel eens gelezen dat er met dit format nooit probelemen zijn)

ASP:
1
2
3
4
5
6
7
8
9
myDate = Year(Date) & "-" & Month(Date) & "-" & Day(Date)
'Of misschien
'myDate = FormatDate(Date,"yyyy-mm-dd")
'Of werkt FormatDate niet bij asp en alleen bij vb?

cmd.CommandText = "Select * from Users Where datum = ?
cmd.CommandType = adCmdText         

Set param = cmd.CreateParameter("@datum", 7, adParamInput, 0, myDate)cmd.Parameters.Append param

[ Voor 7% gewijzigd door Verwijderd op 29-11-2005 23:53 ]


  • wizzkizz
  • Registratie: April 2003
  • Laatst online: 19-12-2025

wizzkizz

smile...tomorrow will be worse

Verwijderd schreef op dinsdag 29 november 2005 @ 23:19:
[...]


In het algemeen is de ? notatie voor parameters in je query toch gewoon DB onafhankelijk bij prepared statements? Je hoeft helemaal geen rekening te houden met welke DB er achter hangt. De specificatie zegt ook duidelijk dat ALS een DB prepared statements niet ondersteund, dat dan de JDBC driver zelf voor de juiste escaping zal zorgen

Het is overigens 'redelijk' simpel om zelf een layer bovenop je prepared statements te schrijven die de @param notatie omzet naar de ? notatie. Je kunt dan in code gewoon de parameters via name zetten, en pas op het moment dat de querie ge-execute laat worden genereer je eerst de ? versie van de SQL text, daar roep je vervolgens in volgorde de setParam functies op aan, en klaar is Henk ;)
klopt wel, ik zei ook alleen maar dat het mogelijk was (en dat ik het idd wel eens heb gebruikt ;) )
Ik gebruik zelf tegenwoordig ook altijd de ? - notatie

[edit]
dat van die layer is een goed idee, btw :) ga ik binnenkort eens proberen te implementeren ;)

[ Voor 6% gewijzigd door wizzkizz op 29-11-2005 23:58 ]

Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.


Verwijderd

wizzkizz schreef op dinsdag 29 november 2005 @ 23:57:
[...]

klopt wel, ik zei ook alleen maar dat het mogelijk was (en dat ik het idd wel eens heb gebruikt ;) )
Ik gebruik zelf tegenwoordig ook altijd de ? - notatie

[edit]
dat van die layer is een goed idee, btw :) ga ik binnenkort eens proberen te implementeren ;)
Suc6 ermee. Wat je globaal doet is de @params eruit filteren, en deze dan te inserten (op volgorde) in een lijst (Vector, ArrayList, whatever). Vervolgens heeft je layer ook een hash map waarin je de user van je layer de values voor de parameters laat zetten. Eenmaal bij execution aangekomen loop je gewoon je lijst af met een for each loopje en voor elke param name in je lijst haal je de waarde uit je hash map en roep je de set param functie van het prepared statement aan.

Enige moeilijkheid is de " in ( @param ) constructie. Als je deze ook wilt supporten, dan moet je ergens apart het type van deze param aangeven. Een input als 1,2,3 moet namelijk vertaald worden naar ?,?,? omdat "in ( ? )" niet bestaat voor meerdere waardes. Hierbij kun je niet direct meer je hash map gebruiken maar moet je een aparte lijst met values gaan bijhouden. Opzich is dit ook wel makkelijk, op het moment dat je het vraagteken naar je output schrijft, stop je ook meteen je value in de andere list.

Verwijderd

Verwijderd schreef op dinsdag 29 november 2005 @ 23:53:
[...]
ASP:
1
myDate = Year(Date) & "-" & Month(Date) & "-" & Day(Date)
Nee, klopt niet. Je vergeet dat Jaar uit 4 cijfers moet bestaan. Maand uit 2 cijfers en Dag uit 2 cijfers.
Verwijderd schreef op dinsdag 29 november 2005 @ 23:53:
code:
1
2
3
'Of misschien
'myDate = FormatDate(Date,"yyyy-mm-dd")
'Of werkt FormatDate niet bij asp en alleen bij vb?
Nee, sowieso niet gebruiken om op deze manier een datum string te laten genereren voor gebruik in queries.
Verwijderd schreef op dinsdag 29 november 2005 @ 23:53:
code:
1
2
3
4
cmd.CommandText = "Select * from Users Where datum = ?
cmd.CommandType = adCmdText         

Set param = cmd.CreateParameter("@datum", 7, adParamInput, 0, myDate)cmd.Parameters.Append param
Wat is dit voor onzin?
Dit zou het volgens mij moeten zijn...
ASP:
1
2
3
4
5
cmd.CommandText = "Select * from Users Where datum = ?
cmd.CommandType = adCmdText         

Set param = cmd.CreateParameter("@datum", 7, adParamInput, 0, Date)
cmd.Parameters.Append param

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 23:21

mulder

ik spuug op het trottoir

wizzkizz schreef op dinsdag 29 november 2005 @ 22:14:
[...]
keej dan :p
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set oCmd = Server.createObject( "ADODB.Command" )
    oCmd.activeConnection = oCustConn
    oCmd.commandType      = adCmdText           
    oCmd.commandText      = query_update_title

    oCmd.Parameters.Append oCmd.createParameter( "@title", adVarchar, adParamInput, 255, title )        
    oCmd.Parameters.Append oCmd.createParameter( "@id", adChar, adParamInput, 38, sArticleId )

    oCmd.Execute

    ' hier wordt het object oCmd nog een aantal keer gebruikt, vandaar de generieke naam ;)
    ....
Set oCmd = Nothing


die query staat dan in een ander bestand, maar ziet er zo uit:
SQL:
1
2
3
UPDATE content_metadata 
SET    title = @title
WHERE  id = @id     
Ja hèhè, maar dan parse je de query zelf nog eerst even, het is dus geen vbscript functionaliteit :D

oogjes open, snaveltjes dicht


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
[b][message=24708127,noline]sinaasappelsap schreef op woensdag 30 november 2005 @
Dit zou het volgens mij moeten zijn...
ASP:
1
2
3
4
5
cmd.CommandText = "Select * from Users Where datum = ?
cmd.CommandType = adCmdText         

Set param = cmd.CreateParameter("@datum", 7, adParamInput, 0, Date)
cmd.Parameters.Append param
Hoe vreemd het ook mag lijken dit soort constructies werkt wel, net als bijvoorbeeld:

MyValue = MyCommand.Execute("SELECT bla FROM Tabel").Fields(0).Value

Oops! Google Chrome could not find www.rijks%20museum.nl


Verwijderd

Topicstarter
ASP:
1
myDate = Year(Date) & "-" & Month(Date) & "-" & Day(Date)


In dit geval is het natuurlijk makkelijker om direct de date() aan te roepen.
Echter in het volgende geval moet ik lijk me wel de datumstring aanmaken
omdat ik anders af moet wachten hoe die in de db wordt gezet.

ASP:
1
2
3
4
myDateInvoer = Request.Forms("txtDatumInvoer")
myDateInvoer = CDate(Year(myDateInvoer) & "-" & Month(myDateInvoer) & "-" & Day(myDateInvoer))
'Of
myDateInvoer = FormatDateTime(myDateInvoer, 2)


Wat ik eigenlijk altijd deed is de datum altijd inserten met als format "dd-mm-yyyy"
En via SQLstring ophalen met als format "mm-dd-yyyy"

Dit gaat wel goed, maar misschien zijn er slimmere manieren met het oog op parametrized queries :)

[ Voor 11% gewijzigd door Verwijderd op 30-11-2005 10:36 ]

Pagina: 1