ConnyFoxMedlem sedan aug. 20011 087 inlägg Ok jag har ett litet problem.
på ett ställe på min sida bygger jag ihop en sql fråga med en loop och kan därför inte använda en parameterfråga för att försäkra mig om att det inte går o göra sql-injections mot min databas.
Så nu undrar jag.. finns det möjligtvis någon där ute som skrivit en funktion som kollar igenom så att strängar inte innehåller skadlig kod för databasen?
en vanlig " ersättare är ju tyvärr inte helt säkert så som jag förstått det.
När det handlar om strängar så är ' det man behöver escapa.
Tal, datum, booleans bör man typkonvertera innan man använder dem i SQL.
Använder man sig av saker som användaren kan modifiera (huvudsakligen från Request) som kolumnnamn för filtrering, sortering eller liknande så blir det lite mer special.
T.ex. så kan detta vara farligt:
sql = "SELECT * FROM tblFoo ORDER BY " & Request.QueryString("OrderBy")
Där kan användaren börja mata in lite vad den vill och förstöra...
En lösning för det kan vara detta:
Dim lOrderBy, vOrderBy
lOrderBy = CLng( Request.QueryString("OrderBy") )
vOrderBy = Array("FooName", "Foo")
sql = "SELECT * FROM tblFoo ORDER BY " & vOrderBy(lOrderBy)
Då skickar man bara in en siffra och kan på så sätt inte skicka in nån farlig kod. Alternativt får man med RegExp kontrollera så att strängen bara innehåller tillåtna tecken (t.ex. "\s\w\,").
Och sen vet jag inte om rådet att söka är så bra just för den här frågan. Folk som inte har någon aning kommer med sina lösningar som inte skyddar mot SQL-injection men väl massakrerar den inkommande datan.
Men om du bara litar på rutinerade grabbar som t.ex. emission, Guffa, OveRRidE och fredrik så ska det nog gå bra.
Och så klart mig, jag har alltid rätt! :e
ConnyFoxMedlem sedan aug. 20011 087 inlägg tack för tipset erik det där var en intressant lösning.
Visste dock att det var ' och inte ", var lite trött när jag skrev det där. dock hjälper det mig inte med mitt problem.. :(
min kod ser ut såhär
strFieldName = "artikel"
strFieldName2 = "description"
strQuery = Replace(trim(Request("strSok")), "'", "''")
If InStr(strQuery, " ") Then
arrQuery = Split(strQuery, " ")
If IsArray(arrQuery) Then
For i = 0 To UBound(arrQuery)
strNewQuery = strNewQuery &" LIKE '%"& arrQuery(i) &"%' OR " & strFieldname2 &" LIKE '%"& arrQuery(i) &"%') AND ("& strFieldName & ""
Next
strNewQuery = Left(strNewQuery, Len(strNewQuery)-(Len(strFieldName)+5))
End If
Else
strNewQuery = " LIKE '%"& strQuery &"%' OR " & strFieldname2 &" LIKE '%"& strQuery &"%')"
End If
MySQL = "select fält from tabell where ("& strFieldName & strNewQuery &" ORDER BY '" & order & "'"
set rs = connect.execute(mysql)
det är altså request("strSok") som jag behöver säkra..
Detta är altså till en sökfunktion som söker på samtliga ord man skriver in.
t.ex apa hej, då måste både apa och hej finnas med i antingen fältet artikel eller description, hej apa funkar lika bra.
fick denna koden här på forumet och har modifierat den något.
Ditt skydd mot SQL-injection funkar men jag hade nog nästan gjort Replace grejen i loopen.
Sen så tycker jag vissa andra grejer är lite lustiga. Är verkligen den där koden körbar?
Hur ska SQL-en se ut när den är klar?
Var kommer variablen order ifrån? Som det är nu så kommer du sortera eftervärdet på variablen vilket betyder att det inte blir någon sortering alls. Gissar att du tänkt att order ska innehålla ett kolumnnamn. Tänk då på det jag skrev om sortering i mitt tidigare inlägg...
ConnyFoxMedlem sedan aug. 20011 087 inlägg hehe aa men helt säker e den väll inte, den skyddar väll bara mot enkel ' eller?
Den e fullt körbar, funkar perfekt, vill bara det skall vara säkert också.
order deifneras längre upp, fick visst inte med den.
inenhåller iaf ett kolumnnamn
GuffaMedlem sedan juni 2004533 inlägg Specificera Request.Querystring(), Request.Form(), Request.Cookies() eller Request.ServerVariables() istället för att använda bara Request().
Varför har du en kontroll på om arrQuery är en array? Det förekommer aldrig att den inte är det.
Vad menar du med att den bara skyddar mot "enkel ' "? Vad vill du att den ska skydda emot?
ConnyFoxMedlem sedan aug. 20011 087 inlägg ja som jag har förstått det enligt artiklar på en säkerhets sida som jag inte kommer på namnet på.. swesecure eller nått så går det fortfarande att sabba databaser med sql-injections även om man skyddar sig mot ', dvs den är inte helt säker bara för att man gör det.
kan inte specificera request eftersom den ibland hämtar från querystring och ibland ifrån form. går väll o fixa en ifsats som kollar men känns onödigt.
Som jag förstått det så kollar den ifall det är flera ord i strSok och väljer därefter vad som skall läggas in i sql:en, men som sagt hittade koden här på forumet och är inte helt insatt i den.
rätta gärna alla fel jag har.
Function SafeSQL(strText)
SafeSQL = strText
SafeSQL = Replace(SafeSQL, "\", "\\")
SafeSQL = Replace(SafeSQL, "'", "\'")
End Function
sokord = SafeSQL(Request("strSok"))
ConnyFoxMedlem sedan aug. 20011 087 inlägg tack spray, är den helt säker om jag spärrar \ och ' då?
ConnyFoxMedlem sedan aug. 20011 087 inlägg hehehe ;D men vad SKA jag göra då? :D
GuffaMedlem sedan juni 2004533 inlägg Vad du ska spärra beror på vad du använder för databas. Access och MSSQL använder apostrof (') som escape-tecken. MySQL använder bakstreck (\) och apostrof som escape-tecken.
Funktionen du fick av SprayMaphia är för MySQL, men forumet rensar bort tecken i koden så att det blir fel om du kopierar den koden.
För Access/MSSQL:
Function SafeSQL(strText)
SafeSQL = Replace(strText, "'", "''")
End Function
För MySQL:
Function SafeSQL(strText)
SafeSQL = Replace(Replace(strText, "\", "\\"), "'", "\\'")
End Function
ConnyFoxMedlem sedan aug. 20011 087 inlägg ok jag använder mysql, tackar
uhm, det går fortfarande (beroende på hur din sqlfråga ser ut) injecta mot den, exempelvis om värdet som klipps in i sqlsatsen är numeriskt och inte en sträng.
Exempel på sql (måhända dumt men iaf):
SELECT user FROM usertable WHERE id= <%=variabel%>
FÖr att injecta detta skriver man bara i textboxen:
0 or 1=1 -
Det är också av denna anledning som den första posten i en tabell med användare är en dummyuser med noll rättigheter (så att det inte gör så mycket om hackaren skulle lyckas logga in på detta konto).
GuffaMedlem sedan juni 2004533 inlägg För att skydda sig mot SQL injections i numeriska fält så ser man till att variabler som ska vara numeriska verkligen är det.
http://guffa.com.loopiadns.com/Programming_article.asp?id=1
ConnyFoxMedlem sedan aug. 20011 087 inlägg Men om man spärrar mot enkel ' och enkel / och dessutom kontrollerar så numeriska fält verkligen är numeriska, är man helt skyddad DÅ? :D
GuffaMedlem sedan juni 2004533 inlägg Ja, då är du skyddad mot alla direkta attacker i form av SQL injections.
Det innebär dock ingen garanti för att det inte går att förstöra eller komma åt data genom att manipulera indatat till sidan. Det beror på vad som görs med indatat.
Ifall du till exempel har en sida där en användare kan ta bort objekt som tillhör den användaren, så måste du kontrollera att objektet som tas bort verkligen tillhör den användaren, annars kan man ta bort andras objekt genom att helt enkelt skriva in id på ett objekt som tillhör någon annan.
Samma sak med en sida som till exempel visar meddelanden. Ifall den inte kollar ifall meddelandet bör läsas av den som ser sidan, så kan vem som helst läsa allas meddelanden.
ConnyFoxMedlem sedan aug. 20011 087 inlägg guffa, ja så är det ju givetvis, men då tackar jag för det.