dahlgrenMedlem sedan aug. 20011 442 inlägg
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
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
Tack, nu funkar det.
Varför behöver man köra replacen?
LarsGMedlem sedan dec. 200012 465 inlägg
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
Ok, nu blev jag lite klokare. :)
aasahMedlem sedan mars 20033 451 inlägg
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
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
TACK! Jag tror jag fattar... :)
SQL tolkar "' (tre fnuttar) som ' (en fnutt)?
Så att ur SQLs perspektiv så blir login = hela det inmatade uttrycket?