Om man har ett formulär med en textruta för ex fritextsökning. Det är lite beroende på vilket konto som du använder för att göra uppslaget i databasen med. Kort så kan jag säga att det som du gör (bygger upp en SELECT sats) genom ihopslagning av strängar, är HELT fel. Lösningen i ditt fall är följande för att undvika sql-injection: Replace på ' behöver inte alltid lösa alla problem, jag skulle rekommendera att använda parametrar istället, ADO.Net ser till att formatera dem så att inget tecken kan bryta frågan. Kan du ge ett exempel där problemet kvarstår efter replace? --------------- EDIT ----------------------- Räcker med en kontrol på IsNumeric för tal. Finns soim används vid svar tidigare i forumet: Intressant!Säkerhetsfråga vid inmatning av formulär!
Och sen tar emot posten genom
SQL = "SELECT MetaData FROM tMeta WHERE tMeta = " & Request.Form("TxtSearch")
och sedan kör det mot SQL Servern!
Vad kan en illasinnad person ställa till med genom att mata in tecken i TxtSearch?
Han borde ju inte kunna göra så mycket mer än att ställa en subfråga eller liknande eller?
Använder alltid Procedurer men har en del gammal kod som har vanliga SQL frågor enligt ovan.Sv: Säkerhetsfråga vid inmatning av formulär!
Det kallas att öppna sig för SQL Injection och det har funnit en hel del diskussioner runt det i detta forum och det finns många bra dokument att läsa mer om det på internet...
Exempel på ett bra dokument som bör skrämma dig ordentligt:
http://www.nextgenss.com/papers/advanced_sql_injection.pdf
MvhSv: Säkerhetsfråga vid inmatning av formulär!
<code>
Data = Replace(Request.Form("TxtSearch"),"'","''")
SQL = "SELECT MetaData FROM tMeta WHERE tMeta = '" & Data & "'"
</code>Sv: Säkerhetsfråga vid inmatning av formulär!
/Fredrik Normén NSQUARED2Sv: Säkerhetsfråga vid inmatning av formulär!
Sv: Säkerhetsfråga vid inmatning av formulär!
string name = "fredik ' or 1=1--";
string age = "35; shutdown --";
name = name.Replace("'","''");
age = age.Replace("'","''");
string sql = "SELECT * FROM Employees WHERE firstname = '" + name + "' or employeeid = " + age;
Frågan ovan kommer att se till så SQL servern gör en shutdown. För age är integer och innhåller ingen '. Du kan även sätta age till 35 shutdown utan ; och servern skulle startas om.
I boken Writing Secure Code second edition sidorna 401-411 kan du läsa om varför det inte räcker enbart med replace på en enkelfnutt. På sidan 402 står det:
Caution: Escaping characters might not make you immune to SQL injection attacks.
På sidan 404, under rubriken: Remedy #2: Building SQL Statements Securely står det att parametrar ska användas för att göra frågan säker.
Use parameterized queries- not string concatenation-to build queries.
Boken är utgiven av Microsoft Press och har ISBN: 0735617228
--------------- EDIT -----------------------
/Fredrik Normén NSQUARED2Sv: Säkerhetsfråga vid inmatning av formulär!
<code>
Function SQLNumber(Value)
If IsNumeric(Value) Then
SQLNumber = Replace(Value, ",", ".")
Else
SQLNumber = "Null"
End If
End Function
</code>
Det självklara är att alltid validera data. Man bör ge användaren rätta att förändra data om den inte uppfyller de angivna vilkoren. Men genom att efter det använda funktioner som formaterar tal kan man slippa säkerhetshål som man inte förutsett.
T.Ex. om talet kommer från en select i ett forumlär. Måste ju någon medvetet sckia ogiltligt data eftersom en vanlig användare inte kan göra något annat än att välja ett val från listanSv: Säkerhetsfråga vid inmatning av formulär!
Provade att skriva '; DROP TABLE tUsers--
och '; SHUTDOWN--
Inte så roligt...
Parametrar verkar vara säkert! Hände ingenting när jag körde samma fråga mot en sp med parametrar.