Avatar billede canedo Nybegynder
22. oktober 2002 - 16:35 Der er 42 kommentarer og
1 løsning

Sikker login

Hvordan kan jeg gøre følgende script mere sikkert mod hackerangreb?

<% Option Explicit %>
<!--- #include file="db.asp" --->
<%
Dim username, password, strSQL, rs
username = replace(Request.Form("navn"),"'","")
password = replace(Request.Form("password"),"'","")

strSQL= "SELECT * FROM liste WHERE (Bruger = '" & username & "' AND Pass='" & password & "');"
Set rs = connect.Execute(strSQL)

if not rs.EOF then
  session("aakjaer") = "ind"
  session("brugerID") = rs("Id")
  session("brugerNavn") = rs("Navn")
  Session.Timeout = 60
  connect.Close
  Response.Redirect("in.asp")
else
  'Fejl i brugernavn eller password
  Response.Redirect("log.htm")
end if
%>
Avatar billede game_tracker Nybegynder
22. oktober 2002 - 16:39 #1
kan jo ikke laves helt sikkert :)
Avatar billede avlund Nybegynder
22. oktober 2002 - 16:40 #2
Stored procedures. Som det er nu, kan jeg indtaste en hel SQL sætning som smadrer din database i stedet for brugernavn og slippe afsted med det.

Hvis du ikke har adgang til SQL Server/PostGreSQL/Oracle, så tjek de indgående variabler for evt. mistænkelige tegn og måske også SQL-kommandoer.
Avatar billede canedo Nybegynder
22. oktober 2002 - 16:44 #3
avlund > Jeg skal altså checke om Request.Form indeholder bestemte tegn.... ?¿? Er ikke lige ferm til det med at checke variabler...
Avatar billede canedo Nybegynder
22. oktober 2002 - 16:59 #4
Hvordan kan jeg checke indgående variabler for mistænkelige tegn og SQL kommandoer?
Avatar billede avlund Nybegynder
22. oktober 2002 - 17:04 #5
Du laver nogle replace's ligesom du gjorde i starten af dit script - men leder i stedet efter f.eks. ", (, ), "select", "drop" etc. Hvor mange kommer an på hvor meget du vil gøre ud af det.
Avatar billede canedo Nybegynder
22. oktober 2002 - 17:17 #6
Kunne jeg eventuelt ikke lave en liste (whitelist) over de karakterer som GERNE må indgå i brugernavn og password, - og smide alle logins med andre karakterer tilbage til log.htm? Hvordan kan en sådan liste puttes ind i mit script?
Avatar billede avlund Nybegynder
22. oktober 2002 - 17:38 #7
Ja, det kan du godt, det smarteste vill være med RegExp. Har du erfaring med Regular Expressions?
Avatar billede canedo Nybegynder
22. oktober 2002 - 17:44 #8
nobe.... har aldrig hørt om det. Men kunne man ikke med nogle IF sætninger?
Avatar billede avlund Nybegynder
22. oktober 2002 - 17:50 #9
Jo, men det ville være meget kompliceret. Du vil jo have alle chars fra a-å og A-Å med, ikke?
Avatar billede canedo Nybegynder
22. oktober 2002 - 17:55 #10
jo.... det kan jeg bedre hitte ud af :-) Med mindre det er nemmere med det der Regular Expressions? Er det nemt at sætte ind i mit script?
Avatar billede avlund Nybegynder
22. oktober 2002 - 18:24 #11
Forholdsvis. Du skal først kalde et object kaldet regexp, derefter benytte en regexp-kommando. Jeg prøver lige at finde noget regulær kode til dig.
Avatar billede avlund Nybegynder
22. oktober 2002 - 18:38 #12
Set objRegExp = New RegExp

objRegExp.Pattern = "\w"
objRegExp.IgnoreCase = True
objRegExp.Global = True

if objRegExp.Execute(Request.Form("navn")) then
(godt)
else
(skidt)
end if

Det er IKKE gennemtestet, men det er noget i den retning. PRøv det lige, og sig til hvis du evt. får fejl.
Avatar billede canedo Nybegynder
22. oktober 2002 - 18:41 #13
Jeg kan ikke lige overskue det. Hvad betyder \w og hvor skal det sættes ind i mit script?
Avatar billede avlund Nybegynder
22. oktober 2002 - 18:43 #14
\w betyder ethvert bogstav fra a-z, stort og småt. Vi skal også have æøå på, men det kommer senere.

Det skal sættes ind i starten, før du sætter dine variabler.
Avatar billede canedo Nybegynder
22. oktober 2002 - 18:45 #15
okay, vi behøver ikke tilføje æøå, for dem har jeg alligevel undgået ved tildeling af brugernavn og password. Tester det lige så.
Avatar billede canedo Nybegynder
22. oktober 2002 - 18:47 #16
Gætter på at jeg skal have lavet et eller andet ved (godt) og (skidt) for jeg får pt fejlmeldingen:

En sætning var ventet
/ole/bole/log.asp, linje 11
(godt)
^
Avatar billede avlund Nybegynder
22. oktober 2002 - 18:54 #17
Ja selvfølgelig - (godt) skulle bare indikere at her skulle programmet gå videre, mens den skulle fejlmelde ved (skidt).
Avatar billede canedo Nybegynder
22. oktober 2002 - 18:55 #18
OK. Nu har jeg skrevet dette:
<%
Dim objRegExp
Set objRegExp = New RegExp

objRegExp.Pattern = "\w"
objRegExp.IgnoreCase = True
objRegExp.Global = True

if objRegExp.Execute(Request.Form("navn")) then

Dim username, password, strSQL, rs
username = replace(Request.Form("navn"),"'","")
password = replace(Request.Form("password"),"'","")

strSQL= "SELECT * FROM liste WHERE (Bruger = '" & username & "' AND Pass='" & password & "');"
Set rs = connect.Execute(strSQL)

if not rs.EOF then
  session("aakjaer") = "ind"
  session("brugerID") = rs("Id")
  session("brugerNavn") = rs("Navn")
  Session.Timeout = 60
  connect.Close
  Response.Redirect("in.asp")
else
  'Fejl i brugernavn eller password
  Response.Redirect("log.htm")
end if
end if
%>

Men får denne fejl?¿?

Der opstod en Microsoft VBScript-kørselsfejl fejl '800a01c2'

Antallet af argumenter er forkert eller egenskabstildelingen er ugyldig

/ole/bole/log.asp, linje 11
Avatar billede avlund Nybegynder
22. oktober 2002 - 18:59 #19
Hvilken er linie 11? Den med dim?
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:03 #20
linie 11 er:
if objRegExp.Execute(Request.Form("navn")) then
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:12 #21
Jeg ved ikke om det er relevant, men jeg vil da lige nævne, at jeg øverst i mit dokument har to linier stående:
<% Option Explicit %>
<!--- #include file="db.asp" --->

Ved ikke om det har nogen betydning.
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:28 #22
Kunne jeg eventuelt ikke skrive:
If Request.Form("navn") LIKE "a" OR "b" OR "c" OR "d" etc
then
(godt)
Else
(skidt)
Avatar billede avlund Nybegynder
22. oktober 2002 - 19:32 #23
Joe, men så må det jo kun være på et bogstav. Og udover det skal der bare være et enkelt bogstav i sætningen, og så er resten jo ligegyldigt... så f.eks. "DROP table blabla´" ville blive godkendt, da der jo er min. et bogstav i.
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:35 #24
Hvad er det så der går galt med linie 11?
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:43 #25
Hvad så med If Request.Form("navn") LIKE '%a%' OR '%b%' OR '%c%' etc...
then
(godt)
Else
(skidt)
Avatar billede avlund Nybegynder
22. oktober 2002 - 19:46 #26
Hvad der går galt med linie 11, hmm, det er regexp-syntaksen der er forkert. Som sagt bruger jeg det ikke så tit og er derfor ikke helt sikker i den.

Med din anden løsning er problemet stadigvæk, at et af bogstaverne skal bare være i variablen, men den vil stadig godtage den, også selv om der er "farlige" tegn. Så længe der er et bogstav i den, vil den godkende.
Avatar billede avlund Nybegynder
22. oktober 2002 - 19:47 #27
Derudover blander du SQL-kommandoer direkte ind i ASP-syntaksen. Det kan ikke lade sig gøre.
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:47 #28
okay.... så er jeg med.
Avatar billede avlund Nybegynder
22. oktober 2002 - 19:52 #29
Prøv i stedet:

Function ValidateString(strRE)
  Dim re
  Set re = new RegExp

  re.IgnoreCase = false
  re.global = false
  re.Pattern = "^[a-zA-Z]{1,x}$"

  ValidateString = re.Test(strRE)
End Function

Hvor x er lig det antal bogstaver, brugernavnet max må være på.

Så kalder du simpelthen funktionen:

if ValidateString( Request.Form("navn") ) then
(godt)
else
(øv)
end if

osv
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:57 #30
YES det virker tilsyneladende. Kan jeg eventuelt tilføje flere ting i
"^[a-zA-Z]{1,10}$" ? Hvilke tegn ville være relevant i forhold til SQL sætninger?
Avatar billede canedo Nybegynder
22. oktober 2002 - 19:57 #31
hvad betyder ^ og $?
Avatar billede canedo Nybegynder
22. oktober 2002 - 20:12 #32
okay, - har lige været inde på:
http://www.asp.dk/articles.asp?mode=show_article&tech_id=8&article_id=77

og ud fra det kan jeg læse at "^[a-zA-Z]{1,10}$" betyder
at jeg skal finde alle tal fra a-z og A-Z og op mellem 1-10 karakterer, -
$ betyder slutningen af linien og
^ betyder find alle
Avatar billede canedo Nybegynder
22. oktober 2002 - 20:31 #33
hmm... nej det virker stadig ikke, jeg oprettede for sjov en person med et password som indeholdte 'å' og vedkommende kan sagtens logge sig ind alligevel... hvad skal laves om?
Avatar billede avlund Nybegynder
22. oktober 2002 - 20:36 #34
Tilbage igen, skulle lige spise osv.

Jamen, du siger at det virker med alle andre chars end æøå eller hvad? Altså den kan godt finde ud af at filtrere tegn fra?
Avatar billede canedo Nybegynder
22. oktober 2002 - 20:46 #35
hmm... undskyld, men jeg bliver nødt til at smutte ind foran fjernsynet sammen med min kæreste, men vil meget gerne fortsætte dialogen i morgen.
På gensyn.
Avatar billede avlund Nybegynder
22. oktober 2002 - 20:51 #36
OK, det siger vi bare. Snakkes senere da.
Avatar billede canedo Nybegynder
23. oktober 2002 - 11:14 #37
Jeg har mod på at fortsætte nu, håber nogle kan hjælpe mig videre idag. Jeg har fundet ud af nogle ting: Når jeg prøver at logge på systemet, så får jeg en hvid blank side, hvis jeg skriver over 10 karakterer som brugernavn, og hvis jeg skriver æ, ø eller å i brugernavnet (ikke passw). Men i stedet for den hvide blanke side ville jeg gerne have at Response.Redirect("log.htm") skulle træde i kraft. Et eller andet er galt med mit script... sender lige hele scriptet som det ser ud nu:
Avatar billede canedo Nybegynder
23. oktober 2002 - 11:14 #38
<% Option Explicit %>
<!--- #include file="db.asp" --->
<%
Function ValidateString(strRE)
  Dim re
  Set re = new RegExp

  re.IgnoreCase = false
  re.global = false
  re.Pattern = "^[a-zA-Z]{1,10}$"

  ValidateString = re.Test(strRE)
End Function

if ValidateString( Request.Form("navn") ) then
%>
<%
Dim username, password, strSQL, rs
username = replace(Request.Form("navn"),"'","")
password = replace(Request.Form("password"),"'","")

strSQL= "SELECT * FROM liste WHERE (Bruger = '" & username & "' AND Pass='" & password & "');"
Set rs = connect.Execute(strSQL)

if not rs.EOF then
  session("aakjaer") = "ind"
  session("brugerID") = rs("Id")
  session("brugerNavn") = rs("Navn")
  Session.Timeout = 60
  connect.Close
  Response.Redirect("in.asp")
else
  'Fejl i brugernavn eller password
  Response.Redirect("log.htm")
end if
end if
%>
Avatar billede avlund Nybegynder
23. oktober 2002 - 11:16 #39
Ja, i stedet for den sidste end if skal du have din response.redirect i en else-sætning dér.
Avatar billede canedo Nybegynder
23. oktober 2002 - 11:27 #40
prøver lige :-)
Avatar billede canedo Nybegynder
23. oktober 2002 - 11:32 #41
Tusind tak for hjælpen, og ikke mindst tålmodigheden. Det ser ud til at det virker 100% nu. Jeg må dog lige researche lidt videre omkring sikkerheden.
Avatar billede avlund Nybegynder
23. oktober 2002 - 11:39 #42
Absolut. Tak for points.

Sig til hvis du har brug for hjælp til andet...
Avatar billede canedo Nybegynder
23. oktober 2002 - 11:41 #43
yep, - så vil jeg da lige være fræk og spørge om du kende nogle sites som skriver om login sikkerhed på web? :)
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