webForumDet fria alternativet

"Så hängs du ut på nätet"

Databaser & SQLur Databashanterare & SQL

31 svar · 2 704 visningar · startad av Bender

BenderMedlem sedan jan. 2001271 inlägg
#1

Har någon läst Expressens artikel idag om den dåliga säkerheten på webbplatser?

http://www.expressen.se/article.asp?id=108908

Kan någon här inne förklara vilket SQL-kommando de syftar på som används för att logga in dem? :o

skymanMedlem sedan juli 20012 450 inlägg
#2

Jag tror inte att expressens reporter vet vad han talar om...

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Gör en sökning på

SQL injection

på google så finns det en hel del artiklar att läsa

sgtpepperMedlem sedan apr. 20007 588 inlägg
#4

Inkompetenta utvecklare som antagligen passar bättre i Konsums kassa än framför en dator är orsaken till detta.

Jag brukar själv roa mig med att langa in en singelquote i inloggningsformulär, särskilt om sajten kör ASP. Förvånansvärt många gånger så renderar det ett felmeddelande med delar av SQL-satsen och sedan är det ju bara att använda denna information för att ta sig in..

Exempel:
user: Arne Anka
password: ' or password<>'

ger t.ex SQL-strängen SELECT username FROM users WHERE username='Arne Anka' AND password='' or password<>'' och saken är biff...

Kör man Java använder man med fördel PreparedStatement för att slippa dessa typer av superlama säkerhetshål.

AGMedlem sedan mars 20001 266 inlägg
#5

Rent praktiskt hur gör man lättast för att ta bort detta i asp och java, exempel-kod vore trevligt.

Andreas

aleborgMedlem sedan jan. 20013 341 inlägg
#6

Replace(Request.Form("Password"), "'", "''")
Borde fungera

sgtpepperMedlem sedan apr. 20007 588 inlägg
#7

Rent praktiskt hur gör man lättast för att ta bort detta i asp och java, exempel-kod vore trevligt.

I Java använder man PreparedStatement och "förebereder" SQL-frågan innan den exekveras, PreparedStatement ser till att filtrera bort singelquotes från strängdatat, det finns även många andra fördelar med att använda PreparedStatements.

Connection conn = ....

PreparedStatement pStmt = conn.prepareStatement("[blue]SELECT * FROM users WHERE user=? AND password=?[/blue]");

pStmt.setString(1, request.getParameter("username"));
pStmt.setString(2, request.getParameter("password"));

ResultSet rs = pStmt.executeQuery();
emissionMedlem sedan dec. 19996 721 inlägg
#8

Replace(Request.Form("Password"), "'", "''")
Borde fungera

Ja, men man måste köra replace även på username.

aleborgMedlem sedan jan. 20013 341 inlägg
#9

Man ska väl helst köra replace på alla request.form som jämförs eller läggs in i en databas?

@ndersMedlem sedan juni 200032 969 inlägg
#10

Ja, det är en bra idé, inte bara av säkerhetsskäl, utan även för att faktiskt kunna använda tecknet ' i strängar.

Mvh,

eriksMedlem sedan apr. 20011 418 inlägg
#11

Nu forstar jag inte? Varfor skulle man behova anvanda replace i alla falt som laggs in i databasen, eller i username-faltet?

aleborg (formodligen dum fraga), om man ska skriva "Replace(Request.Form("Password"), "'", "''") ", maste man inte da skriva en varningstext "du kan av sakerhetsskal inte anvanda ordet password i ditt password"?

sgtpepperMedlem sedan apr. 20007 588 inlägg
#12

aleborg (formodligen dum fraga), om man ska skriva "Replace(Request.Form("Password"), "'", "''") ", maste man inte da skriva en varningstext "du kan av sakerhetsskal inte anvanda ordet password i ditt password"?

Det kodsnutten gör är att ersätta alla förekomster av ' i den inskickade form-variabeln "password" med ''. Den ersätter alltså inte förekomster av ordet password..

eriksMedlem sedan apr. 20011 418 inlägg
#13

ahaaaa. Sa det ar bara ' som man ska ta bort i alla falt som laggs in i databasen? Gors det i denna databasen ocksa? Hur gors det? Ersatter man ' med " eller med ' '? (Ny dum fraga) Sedan maste man val ocksa ha en replace nar man hamtar datan fran databasen?

LarsGMedlem sedan dec. 200012 464 inlägg
#14

Det har inget med lagringen i databasen att göra. Det är bara i SQL man byter.

insert into ogrish values('a''b')

innebär att a'b lagras

CoperMedlem sedan mars 2002554 inlägg
#15

...

eriksMedlem sedan apr. 20011 418 inlägg
#16

LarsG, det hangde jag inte med pa.

spangoMedlem sedan juni 20008 205 inlägg
#17

Två enkelfnuttar i en SQL-sträng byts av SQL-kompilatorn ut mot en enkelfnutt i stället för att markera slutet på en sträng. En syntaktisk feature som finns i de flesta SQL-dialekter (i vissa säger man \' i stället). När man sedan hämtar strängen finns där bara en enkelfnutt. Testa LarsG:s exempel så torde allting framstå i högönsklig klarhet.

aleborgMedlem sedan jan. 20013 341 inlägg
#18

Rätta mig om jag har fel, borde man inte i det här fallet även replaca % tecknet? För säkerhetsskull?

sgtpepperMedlem sedan apr. 20007 588 inlägg
#19

Måste man veta ett giltigt användar namn på deras server för att man ska kunna komma för bi lösenordet????

Nej, men det kan vara bra om man vill åt en specifik användares konto. Annars kan man ju alltid plocka det första som börjar på A eller liknande.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#20

% tecknet behöver man inte ersätta. Jag brukar istället göra tvärtom att jag ersätter * till % så besökare kan söka på wildcards.

Det verkar som om att detta är något helt nytt för många. Mycket förvånande. Men det är väl bra att det uppmärksammas så många fixar såna buggar.

' bör ju ersättas var man än söker efter/insertar in strängar i databasen. Smidigast tycker jag det är att ha en enkel funktion för det.

Function SQLEncode(ByVal sString)
	SQLEncode = Replace(sString, "'", "''")
End Function
131 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)