webForumDet fria alternativet

Problem med update

7 svar · 255 visningar · startad av dahlgren

dahlgrenMedlem sedan aug. 20011 442 inlägg
#1

Jag håller på med en update-fråga som inte vill funka.

SQL = "SELECT * FROM login WHERE Login = " & Trim(Session("login"))
Set RecSet = Conn.Execute(SQL)

RecSet.Close
Set RecSet = Nothing

SQL1 = "UPDATE login SET besok = besok + 1, datum = '"&Now() & "' WHERE Login = " & Trim(Session("login")) 
Conn.Execute (SQL1)

Response.write sql
response.write "<br>"
response.write sql1

När jag skriver ut frågorna så får jag detta.
SELECT * FROM login WHERE Login = admin
UPDATE login SET besok = besok + 1, datum = '2003-04-03 20:31:34' WHERE Login = admin

Så här långt kan inte jag se några konstigheter eller felmedelande. Det ända som visar att det inte fungerar är att det inte uppdateras i databas.
Login är av typen varchar(50)
besok int
datum datetime
Är det någon som har en ide ang vad som kan vara fel?

LarsGMedlem sedan dec. 200012 465 inlägg
#2
SQL1 = "UPDATE login SET besok = besok + 1, datum = '"&Now() & "' WHERE Login = '" & _
replace(Trim(Session("login")),"'","''") & "'" 
Conn.Execute SQL1,,128
dahlgrenMedlem sedan aug. 20011 442 inlägg
#3

Tack, nu funkar det.
Varför behöver man köra replacen?

LarsGMedlem sedan dec. 200012 465 inlägg
#4

Nu kanske du har kontroll över vad som ligger i session, men generellt sett så kan det bli mycket fel om man inte gör replace.

Om du tar ett värde som någon matar in och lägger in det direkt i en sql fråga, t.ex.

' or 1 = 1 -- lurad

I ditt fall så skulle sql-frågan då bli

update login 
set besok = besok + 1, datum = now()
where login = '' or 1=1 -- lurad'

vilket innebär att alla poster uppdateras (-- betyder kommentar i SQL).

dahlgrenMedlem sedan aug. 20011 442 inlägg
#5

Ok, nu blev jag lite klokare. :)

aasahMedlem sedan mars 20033 451 inlägg
#6

Vad innebär strängen:

replace(Trim(Session("login")),"'","''") ?
Byts alla ' mot " eller tvärtom? Jag förstår vad den är till för, bara inte varför den förhindrar exemplet med lurad? Alltså, kan någon förklara hur

where login = '' or 1=1 -- lurad' ser ut efter replace?

LarsGMedlem sedan dec. 200012 465 inlägg
#7

Man byter ' mot två

''

vilket är det sätt SQL har för att ange en ' i en sträng

för att fortsätta på föregående exempel. Om man gör replace så blir det

update login 
set besok = besok + 1, datum = now()
where login = ''' or 1=1 -- lurad'

dvs man jämför login med den inmatade strängen.

aasahMedlem sedan mars 20033 451 inlägg
#8

TACK! Jag tror jag fattar... :)

SQL tolkar "' (tre fnuttar) som ' (en fnutt)?
Så att ur SQLs perspektiv så blir login = hela det inmatade uttrycket?

Genererad på 373 ms · cache AV · v20260730165559-full.f96bc7eb