Avatar billede foralias Praktikant
29. november 2006 - 09:56 Der er 26 kommentarer og
3 løsninger

Sikkerhed på online løsning.

Jeg sidder og laver en online løsning til vores grundejerforening. Og jeg kan godt se det ikke sådan er ligetil SQL injection og lign.
Spm. 1: I min conn.open står der både IP og login oplysninger til min SQL database, kan man få fat i det?

Spm. 2:
Jeg har lavet en login side, hvor jeg fjerner ' og har tænkt mig at trimme for alle de der "farlige" tegn ("select", "drop", ";", "--", "insert", "delete" og "_")
Når det så er gjort så logger brugeren på. Derefter holder en session styr på om brugeren er kommet korrekt ind ellers redirectes han til login siden.
Kan jeg så roligt POSTe oplysninger frem og tilbage imellem de sessions sikrede sider? Eks. tage brugernavn og POSTe videre fra login siden og bruge den resten af vejen igennem.

Der er mange point på spil, da jeg måske har flere spørgsmål undervejs.
Avatar billede The Real Yoda Juniormester
29. november 2006 - 10:07 #1
Hejsa
spm1:
Du kan lægge din connectionstring i en global.asa som der er eksempel på i artikler, eller du kan lægge den i en include fil.
bare husk at i en includefil, skal du huske at kalde filen noget som parses og ikke bare hentes. eks. kald den dbconn.asp i stedet for dbconn.inc

En .asp fil vil blive beregnet af serveren og leverer derfor ingen oplysninger til brugeren.
En .inc fil popper bare op som download og kan derfor hentes af brugere.


Spm2.
Som udgangspunkt er sessions det sværeste at manipulere for udefrakommende .. så jo mere du kan lægge i sessions jo bedre. Dog med måde, da sessions kræver en del af serverens resourcer.

en anden god ting er, at altid kigge på det der postes, og om det passer.
F.eks. hvis du forventer der postes et tal, er det fornuftigt at kigge om det nu også er et tal der kommer.

Samtidig er det godt at have checks i dine sql kommandoer..
Dvs ikke at lave conn.execute "delete from users where id="&request.form("userid")
For på den måde kan andre hurtigt slette brugere.
Det er her smart at lave så man i en delete kigger på flere felter. Det gør det sværere for irriterende typer at pille ved ens data.
Alle kan jo gætte et andet idnummer, men det er sværre hvis du skal have brugerens id, telefonnummer og sidst brugte ipadresse til at passe sammen, ud fra gætterier.

Håber du kan bruge det lidt ?
Avatar billede keysersoze Ekspert
29. november 2006 - 10:11 #2
1) det afhænger af flere ting - hvis din conn.open ligger i en asp-fil er det ikke muligt, men har du gemt det som en include-file og med filetype fx .inc så vil brugere godt kunne se det hvis de ellers kan gætte sig til files placering og navn. asp-filer kan kun eksekveres på serveren og kun med adgang til ftp kan indholdet i asp-filerne ses.

2) som udgangspunkt er det nok at replace enkeltpling (') med to enkeltplinger ('') - når dette er gjort kan brugerne ingenting gøre selvom de skriver select eller hvad som helst andet.

Når sider er sikrede med sessions kan du roligt gøre hvad du end har lyst til - men det lyder underligt hvis du vil poste brugernavn videre fra side til side for det er jo netop en variabel som denne der er mulig at lægge i din session. Men måske har jeg misforstået den del af det og i så fald bare se bort fra den sidste del af min kommentar - men ellers jo, session-sikrede sider er sikre, men det betyder ikke at du ikke skal tænke dig om når du laver det restede arbejde, dvs du skal stadig sikre mod sql-injections ligesom det ikke skal være muligt at "komme til" at opdatere eller slette forkerte data.
Avatar billede fennec Nybegynder
29. november 2006 - 10:12 #3
1: Kun ved at hacke webserverne kan man få fat på ASP filen og derved læse login oplysningerne.

2: Sålænge du sikre dig mod ' tegnet, og typecaster alle variabler er du sikret mod problemer. Lav en DBDate, DBText og DBNum funktion til at typecaste med, og send alle variabler igennem dem.
Avatar billede foralias Praktikant
29. november 2006 - 11:11 #4
Puha, det var hurtigt. Tak for det.
Jeg prøver lykken og poster koden (det er en del sammenklip fra forskellige sider), vil i ikke lige tjekke om der så er ting der skal ændres.
Mht. spm. 1 ville jeg gerne kunne beholde min connection string i filen, da jeg arbejder med DW og det gør det lidt nemmere for mig. Men ikke hvis det kompromittere sikkerheden.
Avatar billede foralias Praktikant
29. november 2006 - 11:15 #5
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%
If Request.Form("Action") = "Login" Then
stripQuotesUID=Request.Form("Brugernavn")
stripQuotesPWD=Request.Form("Adgangskode")
strUID = replace(stripQuotesUID, "'", "")
strPWD = replace(stripQuotesPWD, "'", "")

dim badChars
dim newChars
dim coun

badChars = array("select", "drop", ";", "--", "insert", "delete", "xp_")
newChars = strUID

for coun = 0 to uBound(badChars)
newChars = replace(newChars, badChars(coun), "")
next


  If Len(newChars) > 0 And Len(strPWD) > 0 Then

    Set myConn = Server.CreateObject("ADODB.Connection")
    myConn.Open "Driver={SQL Server};Server=[lokal ip adresse];Database=[databasenavn];Uid=[bruger];Pwd=[password];"

    strSQL = "SELECT Usernr FROM Adgang WHERE (Userid = '" & newChars & "') AND (Password = '" & strPWD & "')"

    Set rs = myConn.Execute(strSQL)
    If Not (rs.BOF Or rs.EOF) Then
      intUID = rs("Usernr")
    Else
      strERR = "Du blev ikke godkendt af systemet"
    End If

    myConn.Close
    Set myConn = Nothing

    If Len(intUID) Then
      Session("Usernr") = intUID
      Response.Redirect("success/komind.asp")
    End If
  Else
    strErr = "Du skal skrive både brugernavn og adgangskode"
  End If

  If Len(strErr) > 0 Then
    strErr = "<p><font color=red>" & strErr & "</font></p>"
  End If
End If
%>
<html><head>
<title>Login script</title>
</head><body>

<form method="POST" action="login.asp">
<p><font size="4">Angiv brugernavn og adgangskode</font></p><%=strErr%>
<p>

<table border="0">
<tr>
<td width="50%">Brugernavn:</td>
<td width="50%"><input type="text" name="Brugernavn" size="20"></td>
</tr>
<tr>
<td width="50%">Adgangskode:</td>
<td width="50%"><input type="password" name="Adgangskode" size="20"></td>
</tr>
</table>
<p><input type="submit" value="Login" name="Action"></p>
</form>

<p>Kan du ikke komme ind , kontakt da vores it afdeling ved at klikke
  <%
response.write("<a href='mailto:[min mail adresse]?subject=Loginfejl hjemmeside'>HER.</a></p>")
%>
</body></html>

Jeg har sat alle de "hemmelige" oplysninger i []
Grunden til at jeg har response.write på min mail adresse, er fordi jeg har hørt at dette kan hjælpe imod SPAM. Passer det?
Avatar billede fennec Nybegynder
29. november 2006 - 11:34 #6
Spam: Nej det passer ikke. Spambotter søger HTML kodne igennem, og her kan de se din email i fuld udgave.
Avatar billede fennec Nybegynder
29. november 2006 - 11:39 #7
Måden at komme uden om edt er via JS. Her er et simpelt eks:
<a href="#" onclick="this.href='mailto:'+ emailFunk('din(a)mail.dk');">dkfv</a>

<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
function emailFunk(fEmail)
{
    return fEmail.replace("(a)","@")
}
//-->
</SCRIPT>
Avatar billede keysersoze Ekspert
29. november 2006 - 11:40 #8
det passer ikke - kig på det resultat der kommer i din browser (vis ->kilde) og det ser ud præcis som var det skrevet med almindelig html... så absolut ingen forskel i det.

Din kode minder meget om den herfra http://activedeveloper.dk/articles/88/ (mon ikke også det er den?) og den er ganske udmærket - men jeg vil stadig mene at dine "badChars" er spild og at replace af ' er tilstrækkeligt.

Så længe din conn-string ligger i en fil der tolkes af serveren (.asp) og ikke en txt-fil (.inc og lignende) er der ingen problemer og du kan placere den hvor du har lyst.
Avatar billede fennec Nybegynder
29. november 2006 - 11:45 #9
Flere spambotter kan dog godt finde den email alligevel, da denne formatering næsten er blevet standard på forumer o.lign, men erstat @ med %¤#% i stedet så det bliver til:
<a href="#" onclick="this.href='mailto:'+ emailFunk('din%&¤%mail.dk');">email</a>

Og du kan være forholdsvis sikker. Smide evt en kryptering/dekrypt ind så der står:
<a href="#" onclick="this.href='mailto:'+ emailFunk('b238787mnb327idsjb');">email</a>

Og du er helt sikret.
Avatar billede foralias Praktikant
29. november 2006 - 12:02 #10
keysersoze -> jo du har fuldstændig ret, det er den kode. Tilføjet lidt hist og her.
Men det vil sige at har jeg siden som en login.asp sker der ikke noget ved at have conn.string i den?
fennec -> Super dvs. jeg skifter response.write("<a href='mailto:[min mail adresse]?subject=Loginfejl hjemmeside'>HER.</a></p>") ud med <a href="#" onclick="this.href='mailto:[min adresse]'+ emailFunk('b238787mnb327idsjb')+[mit domæne];">HER.</a> Ja undskyld jeg spørger så dumt, men jeg aner ikke en brik om Java.
Avatar billede foralias Praktikant
29. november 2006 - 12:03 #11
Mht. spm. 2 så kan jeg da godt se at sessionen er brugerid'en så det løser jo sig selv. Har jeg ikke ret?
Avatar billede fennec Nybegynder
29. november 2006 - 12:18 #12
Ikke helt men tæt på :o)

<a href="#" onclick="this.href='mailto:'+ emailFunk('[min adresse]b238787mnb327idsjb[mit domæne]');">

function emailFunk(fEmail)
{
    return fEmail.replace("b238787mnb327idsjb","@")
}
Avatar billede foralias Praktikant
29. november 2006 - 12:21 #13
Ok godt så :-)
Så lærte jeg også noget i dag. Sejt!
Avatar billede keysersoze Ekspert
29. november 2006 - 12:37 #14
korrekt - der sker intet ved at have din conn-string i login.asp.
Avatar billede foralias Praktikant
29. november 2006 - 13:07 #15
Så det hele kogt sammen, så er den login.asp side jeg har lavet ikke så dårlig?
Med den mail-adresse ændring så skulle den være så godt som sikker?
Therealyoda -> Mht. spm. 2 så skal jeg vel kun bruge en session pr. bruger dvs. brugerid ikke? Du skriver også noget om checks i SQL kommandoer, det er vel det jeg laver med badChars, hvis jeg ellers har forstået det korrekt, er det ikke?
Avatar billede fennec Nybegynder
29. november 2006 - 13:42 #16
Det Therealyoda mener, og som også er illustreret, er at du skal være opmærksom på dine sqlsætninger/links. Mange bruger f.eks noget ala dette til at slette med:
<a href="sletSide.asp?delId=<%= rs("id") %>">Slet</a>

sletSide.asp
dilId = request.querystring("delID")
conn.execute("delete from enTabel where id="& delID)

Det giver brugerne/ondsindet personer mulighed for at ændre ID'et ved at skrive linket manuelt i deres browser. F.eks kunne de bare skrive:
sletSide.asp?delId=123
sletSide.asp?delId=124
sletSide.asp?delId=125

Også bliver de 3 linjer slette.
Avatar billede fennec Nybegynder
29. november 2006 - 13:44 #17
Jeg var med i et tidligere ? som netop omhandlede dette problem, hvilket mundet ud i en hash kryptering af ID'erne:
http://www.eksperten.dk/spm/695272

Bruger selv denne kode nu, da den praktisk talt er umulig at hacke.
Avatar billede foralias Praktikant
29. november 2006 - 14:45 #18
Aha. Men det problem har jeg vel ikke, forudsat jeg kører det i en session?
Avatar billede keysersoze Ekspert
29. november 2006 - 14:57 #19
det kommer jo an på hvad du reelt set vil beskytte - for har du den typer links fennec beskriver kan dine brugere kan jo sagtens fifle ved dem session eller ej.
Avatar billede fennec Nybegynder
29. november 2006 - 14:59 #20
Det har ikke noget med sessions at gør, så jo det problem har du.

Session bruger du kun til at tjekke om man er logget ind, derefter kan brugerne, som er logget ind, godt skrive de før omtalte url'er, men du kan jo stole på dine brugere også håbe de ikke gør det.
Avatar billede foralias Praktikant
29. november 2006 - 16:10 #21
Det jeg mente var at jeg i stedet for de links i beskriver, vil overføre de 2 informationer som jeg skal bruge, nemlig bruger og nummer, via sessions.
Avatar billede fennec Nybegynder
29. november 2006 - 16:35 #22
Det kan du ikke.
Forstil dig du har en liste af et eller andet (f.eks kommentare), hvor du skal kunne slette dem. Det ville f.eks se sådan her ud:
<table width="100%" border="0" cellspacing="0" cellpadding="2">
<tr>
    <td>kommentar 1</td>
    <td><a href="sletKom.asp?delId=1">Slet</a></td>
</tr>
<tr>
    <td>kommentar 2</td>
    <td><a href="sletKom.asp?delId=2">Slet</a></td>
</tr>
<tr>
    <td>kommentar 3</td>
    <td><a href="sletKom.asp?delId=3">Slet</a></td>
</tr>
<tr>
    <td>kommentar 4</td>
    <td><a href="sletKom.asp?delId=4">Slet</a></td>
</tr>
</table>

Der kan du ikke overføre "3" til session uden at skulle sende det. Hvordan havde du tænkt dig at indsætte "3" i en session så den kan slettes, via en knap/link/whatever??
Avatar billede foralias Praktikant
29. november 2006 - 20:41 #23
Hej igen undskyld jeg lige var offline.
Pigerne skulle lige fodres og konen er syg :-( Så farmand står for det hele herhjemme.

Hvis jeg skulle slette en record, så ville jeg konvertere sessionen til en variabel og så via en mellemside, slette recorden.
Tror jeg da. ;-) Jeg kører som sagt DW og den kan jo lave en masse ting.
Ikke desto mindre vil jeg helt sikkert lige give mig tid til at kigge på krypteringen.
Avatar billede keysersoze Ekspert
29. november 2006 - 21:09 #24
først og fremmest vil jeg lige indskyde, at du skal passe på med ikke at blive slave af DW. Ingen tvivl om at det på visse punkter er et smart program - men det har bestemt også sine ulemper.

Den tanke du har mht sletning af filer lyder ikke så smart - en querystring (enten krypteret som foreslået eller via 2 parametre for at sikre mod pilfingre) er alt du behøver.
Avatar billede foralias Praktikant
30. november 2006 - 01:01 #25
Helt enig. Det er bare så nemt ;-)
Men ja der er nogle gange hvor man bruger lidt for meget tid på at finde ud af hvorfor den gør det, som den nu engang gør.
Jeg kom egentlig i tanke om at jeg havde noget java script liggende som fjernede navigation og adresse linie. Ville man så ikke helt være ude over det der med URL "hacking", eller er det ikke alle brovsere?
Avatar billede keysersoze Ekspert
30. november 2006 - 08:00 #26
igen en falsk sikkerhed - enhver kan højreklikke og kopiere linket eller læse i kildekoden.
Avatar billede foralias Praktikant
30. november 2006 - 09:06 #27
Ok.
Hvis i ikke mener der er mere jeg bør vide mht. sikkerhed så må jeg hellere lukke. Jeg har efterhånden taget en del af jeres tid. Mange tak for hjælpen.
fennec -> smider du lige et svar, så må du og keysersoze dele i porten.
Avatar billede fennec Nybegynder
30. november 2006 - 09:22 #28
.o) <-- One Eyed Jack
Avatar billede foralias Praktikant
08. december 2006 - 10:40 #29
Sådan så fik jeg lukket. Takker for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester