ironheadMedlem sedan mars 20011 346 inlägg Hej!
Hur gör man så enkelt som möjligt?
Jag har en sträng tex. med värdena: "param1=test1& param2=tackar& param3=sportspegeln"
Dessa värden vill jag spara i en MSSQL-databas där tabellnamnen är densamma som parameternamnen.
med koden nedan får jag värdena såhär:
param1=test1
param2=tackar
param3=sportspegeln
inputString = Request.Querystring("inputString")
myArray = Split(inputString,"&")
for i=0 to Ubound(myArray)
Response.Write myArray(i)
next
Men hur gör jag nästa sväng när jag vill lägga in värdena?
INSERT INTO test(param1,param2,para3) VALUES("test1","tackar","sportspegeln")
Ska man splitta igen, eller finns den nån finurlig loop eller?
ironheadMedlem sedan mars 20011 346 inlägg Gjode såhär:
arrData = Split(myDecodedString, "&")
For i = 0 To Ubound(arrData)
arrDetail = Split(arrData(i), "=")
param = Trim(arrDetail(0))
val = Trim(arrDetail(1))
if c=1 then
d=","
end if
a = a & d & param
b = b & d & "'"" & " & val & " & ""'"
c=1
Next
strSQL = "INSERT INTO Highscore(" & a & ") VALUES('" & b & "')"
mm, man kan göra så men... jag skulle inte göra så! :)
jag skulle aldrig lägga tabellnamn m.m. i en querystring, absolut inte om man även har tillgång till ms-sqlserver som hanterar stored procedures.
för vad händer om man avbryter en sådan sträng eller "förstör" den? då blir det ju tok!
ex.
param1=test1& param2=tackar& param3=sportspegeln');delete from Highscore;
man lär i och för sig veta tabellnamnet med koden ovan, men ändå, du förstår kanske att det är en stor säkerhetsrisk.
bara som en liten upplysning! :)
Ja, du får nog först förklara vad din insert gör, i vilket sammanhang.
ironheadMedlem sedan mars 20011 346 inlägg min insert skall lagra poäng från ett webspel (shockwave).
alltså:
nick, score, game
till att börja med.
Kommer till sidan som en sträng.
nick=Ivan&score=8890&game=mindwars
En enkel lagrad procedur skulle kunna se ut så här:
Create Procedure dbo.upInsertScore
@Nick varchar(50),
@Score numeric(10,0),
@Game varchar(50)
As
Set nocount on
Insert Into Highscore
(Nick, Score, Game) Values
(@Nick, @Score, @Game)
Denna kör du i query analyzer till din databas
För att sedan anropa den byter du bara ut din sql-rad till:
<%
Dim Nick, Score, Game, strSql
Nick = Request.QueryString("Nick")
Score = Request.QueryString("Score")
Game = Request.QueryString("Game")
strSql = ("upInsertScore '" & sqlInject(Nick) & "', " & sqlInject(Score) & ", '" & sqlInject(Game) & "'; ")
Public Function sqlInject(Byref str)
If len(str) >0 Then sqlInject = Replace(str, "'", "''")
End Function
%>
Sen är det bara att bygga på proceduren om du får flera kolumner. :)
ironheadMedlem sedan mars 20011 346 inlägg Åh! Så snitsigt :)
1000-tack! Ska testa detta...
ironheadMedlem sedan mars 20011 346 inlägg Denna kod hade funkat utmärkt om jag inte hade förbisett en liten grej :\
Querysträngen jag tar emot är Base64 kodad, så jag måste avkoda den först, och sedan in i databasen.
Hur bör man göra då?
ps. avkodningen har jag fixat, men sen då?
BrimbaMedlem sedan dec. 19995 875 inlägg Swesecure skriver om sql-injection och hur det kan motverkas. http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a
För att decoda en base64-sträng i asp så hittade jag denna funktion:
' Functions to provide encoding/decoding of strings with Base64.
'
' Encoding: myEncodedString = base64_encode( inputString )
' Decoding: myDecodedString = base64_decode( encodedInputString )
'
' Programmed by Markus Hartsmar for ShameDesigns in 2002.
' Email me at: [email]mark@shamedesigns.com[/email]
' Visit our website at: [url]http://www.shamedesigns.com/[/url]
'
Dim Base64Chars
Base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _
"abcdefghijklmnopqrstuvwxyz" & _
"0123456789" & _
"+/"
' Functions for encoding string to Base64
Public Function base64_encode( byVal strIn )
Dim c1, c2, c3, w1, w2, w3, w4, n, strOut
For n = 1 To Len( strIn ) Step 3
c1 = Asc( Mid( strIn, n, 1 ) )
c2 = Asc( Mid( strIn, n + 1, 1 ) + Chr(0) )
c3 = Asc( Mid( strIn, n + 2, 1 ) + Chr(0) )
w1 = Int( c1 / 4 ) : w2 = ( c1 And 3 ) * 16 + Int( c2 / 16 )
If Len( strIn ) >= n + 1 Then
w3 = ( c2 And 15 ) * 4 + Int( c3 / 64 )
Else
w3 = -1
End If
If Len( strIn ) >= n + 2 Then
w4 = c3 And 63
Else
w4 = -1
End If
strOut = strOut + mimeencode( w1 ) + mimeencode( w2 ) + _
mimeencode( w3 ) + mimeencode( w4 )
Next
base64_encode = strOut
End Function
Private Function mimeencode( byVal intIn )
If intIn >= 0 Then
mimeencode = Mid( Base64Chars, intIn + 1, 1 )
Else
mimeencode = ""
End If
End Function
' Function to decode string from Base64
Public Function base64_decode( byVal strIn )
Dim w1, w2, w3, w4, n, strOut
For n = 1 To Len( strIn ) Step 4
w1 = mimedecode( Mid( strIn, n, 1 ) )
w2 = mimedecode( Mid( strIn, n + 1, 1 ) )
w3 = mimedecode( Mid( strIn, n + 2, 1 ) )
w4 = mimedecode( Mid( strIn, n + 3, 1 ) )
If w2 >= 0 Then _
strOut = strOut + _
Chr( ( ( w1 * 4 + Int( w2 / 16 ) ) And 255 ) )
If w3 >= 0 Then _
strOut = strOut + _
Chr( ( ( w2 * 16 + Int( w3 / 4 ) ) And 255 ) )
If w4 >= 0 Then _
strOut = strOut + _
Chr( ( ( w3 * 64 + w4 ) And 255 ) )
Next
base64_decode = strOut
End Function
Private Function mimedecode( byVal strIn )
If Len( strIn ) = 0 Then
mimedecode = -1 : Exit Function
Else
mimedecode = InStr( Base64Chars, strIn ) - 1
End If
End Function
ironheadMedlem sedan mars 20011 346 inlägg Brimba: öööh? Tack, men...
<citat>ps. avkodningen har jag fixat, men sen då?</citat>
Det jag mest ville veta är hur man på ett bra sätt tar hand om den sträng man "avkodat" och nu har i formatet:
myDecodedString = "param1=varde1& param2=varde2& param3=varde3"
för att dela upp & lägga in värdena i databasen på rätt ställe.
Jag hade gjort såhär, vilket var en dålig lösning:
'# Hämta Querysträngen
'# Avkoda den lägg den i "myDecodedString"
'# Dela upp parametrarna vid &
arrData = Split(myDecodedString, "&")
For i = 0 To Ubound(arrData)
'# Separera Param & värdet
arrDetail = Split(arrData(i), "=")
param = Trim(arrDetail(0))
val = Trim(arrDetail(1))
'# Separara värdena med komma, dock ej första rundan
if c=1 then
d=","
end if
'# Parametrarna
a = a & d & param
'# Värdena
b = b & d & "'" & val & "'"
'# Räknare för att räkna bort första rundan
c=1
Next
'# Databaskoppling
'# Lägg in parametrarna & värdena i databasen
strSQL = "INSERT INTO Highscore(" & a & ") VALUES(" & b & ")"