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
Databaser & SQLur Databashanterare & SQL
31 svar · 2 704 visningar · startad av Bender
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
Jag tror inte att expressens reporter vet vad han talar om...
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.
Rent praktiskt hur gör man lättast för att ta bort detta i asp och java, exempel-kod vore trevligt.
Andreas
Replace(Request.Form("Password"), "'", "''")
Borde fungera
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();
Replace(Request.Form("Password"), "'", "''")
Borde fungera
Ja, men man måste köra replace även på username.
Man ska väl helst köra replace på alla request.form som jämförs eller läggs in i en databas?
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,
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"?
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..
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?
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
...
LarsG, det hangde jag inte med pa.
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.
Rätta mig om jag har fel, borde man inte i det här fallet även replaca % tecknet? För säkerhetsskull?
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.
% 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