webForumDet fria alternativet

Säker eller lätt hackad?

ASP

23 svar · 790 visningar · startad av ptr_lks

Medlem sedan juni 2005584 inlägg
Frågan#1
admin.htm<HTML>
<HEAD>
<TITLE>Inloggning som admin</TITLE>

<BODY>
<FORM ACTION="admin_gb.asp" METHOD="post">
<TABLE WIDTH="500" BORDER="3" CELLSPACING="5" CELLPADDING="5">
  <TR> 
    <TD>Användarnamn:</TD>
      <TD><INPUT NAME="Anamn" TYPE="text" SIZE="75"></TD>
  </TR>
  <TR> 
    <TD>Lösenord</TD>
    <TD><INPUT NAME="pword" TYPE="password" SIZE="75"></TD>
  </TR><TR ALIGN="RIGHT" VALIGN="MIDDLE"><TD><INPUT NAME="in" TYPE="submit" VALUE="stig in"></TD></TR>
</TABLE>

</FORM>
</BODY>
</HTML>

admin_gb.asp

<%
if Request.Form("in") = "stig in" Then 'vill användaren logga in?

	Set minCon = Server.CreateObject( "Adodb.Connection" )
	minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\spif93\db\guests.mdb")	
        strUser = Request.Form("Anamn")
	strPasw = Request.Form("pword")

	strSQL = "SELECT* FROM admin WHERE anvnamn='"& strUser &"'"
	Set User = minCon.Execute(strSQL)
        strSQL ="SELECT* FROM admin WHERE password ='" & strPasw & "'"
	Set Losen = minCon.Execute(strSQL)
	If User.EOF Then
         Response.Redirect("fel_anv.html")
	End IF
	If Losen.EOF Then
	     Response.Redirect("fel_passw.html")
	End If
	
	If NOT User.EOF AND NOT Losen.EOF Then
	    Session("Inloggad") = "Ja"
		Set User = Nothing
		Set Losen = Nothing
		 
	strSQL ="SELECT * FROM admin WHERE password = '" & Request.Form("pword")&"'"
	Set Fornamn = minCon.Execute(strSQL)
	
	While NOT Fornamn.EOF
	    Response.Write "<p align=center><font size=7><b><i><font color=#FFCC33 SIZE=""+3"">"
        Response.Write "Nu kan du " & Fornamn("Fnamn") 
        Response.Write " redigera gästboken!"
	Fornamn.MoveNext
	Wend
	Set Fornamn = Nothing
	%>

Förslag på förbättring av säkerhet

Medlem sedan dec. 20025 483 inlägg
#2

Gör en sökning på SQL-injection i forumet och du skall hitta en del matnyttigt. ;)

Medlem sedan okt. 20041 556 inlägg
#3

Grymt osäker...

Använd parameteriserade frågor eller en function för att plocka bort farliga tecken.

function SQLEncode(str)
SQLEncode = replace(str,"'","''")
End function

strSQL = "SELECT* FROM admin WHERE anvnamn='"& SQLEncode(strUser) &"'"
Set User = minCon.Execute(strSQL)
strSQL ="SELECT* FROM admin WHERE password ='" & SQLEncode(strPasw) & "'"
'osv
Medlem sedan maj 200010 687 inlägg
#4

Inte bara SQL-injections som kan ställa till det här. Med den koden så behöver man fylla i ett användarnamn som finns och ett lösenord som finns. Dock behöver de inte finnas på samma användare...

Medlem sedan juni 20003 076 inlägg
#5

Denna rad känns felaktig:

strSQL ="SELECT * FROM admin WHERE password = '" & Request.Form("pword")&"'"
	Set Fornamn = minCon.Execute(strSQL)

Vad händer om flera användare har samma lösenord!? Då vet inte koden vilket förnamn som ska hämtas.
Är lösenorden unika så är koden ok annars bör du lägga till användarnamnet också i selecten (för användarnamnet är väl unikt!?):

strSQL ="SELECT * FROM admin WHERE anvnamn='"& strUser &"' and password = '" & strPasw & "' "
	Set Fornamn = minCon.Execute(strSQL)
Medlem sedan juli 2003465 inlägg
#6

Jag hade gjort såhär

<%
if Request("in") = "stig in" Then 'vill användaren logga in?
	Set minCon = Server.CreateObject( "Adodb.Connection" )
	minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\spif93\db\guests.mdb")	
             strUser = replace(Request("Anamn"), "'", "''")
	strPasw = replace(Request("pword"), "'", "''")

	strSQL = "SELECT id, Fnamn FROM admin WHERE anvnamn='"& strUser &"' AND password ='" & strPasw & "'"
	Set User = minCon.Execute(strSQL)
	If User.EOF Then
	     Response.Redirect("fel_anvochpassw.html")
             Else
                  Session("Inloggad") = User("id")
                  Response.Write "<p align=center><font size=7><b><i><font color=#FFCC33 SIZE=""+3"">"
                  Response.Write "Nu kan du " & User("Fnamn") 
                  Response.Write " redigera gästboken!"
	End If
end if
%>

Kan man ha flera användare på samma lösenord ?

/R ha ha många som han att svara innan jag var klar...

Medlem sedan juni 20003 076 inlägg
#7

Liten påbyggnad av Travonis function, så man slipper error om strängen är null. :)

function SQLEncode(str)
     If isNull(str) Then Exit Function

     SQLEncode = replace(str,"'","''")
End function
Medlem sedan okt. 20041 556 inlägg
#8

Jag skulle ha gjort så här i stället:

function SQLEncode(str)
     SQLEncode = replace(str & "","'","''")
End function
Medlem sedan juni 2005584 inlägg
#9

doggelito skrev:

Liten påbyggnad av Travonis function, så man slipper error om strängen är null. :)

function SQLEncode(str)
     If isNull(str) Then Exit Function

     SQLEncode = replace(str,"'","''")
End function

Var skulle den funktionen passa in?

Medlem sedan okt. 20041 556 inlägg
#10

Så som jag skrev i mitt tidigare inlägg.

Så fort som du ger någon möjighet att via ett formulär skicka in saker till din databas.

http://www.webforum.nu/showthread.php?p=1102718#post1102718

Medlem sedan juni 2005584 inlägg
#11

tack för era synpunkter :birp

Har frösökt söka här på forumet men blev bara förvirrad :OO
På de sidor jag vill skydda tänkte jag ha

<!--#Include File="koll.inc"-->

och koll.inc

<% 
If Session("Inloggad") = "" Then 
     Response.Redirect("error.htm") 
End If 
%>
  1. en bra lösning?
  2. en lösning ni rekomenderar
  3. andra förslag ( i så fall gärna med förklaring)?
Medlem sedan juni 20003 076 inlägg
#12

gör istället en fil som du alltid inkluderar på ALLA sidor och gör en sub där för inloggningskontrollen.
dinfil.asp:

<!--#include virtual="common.asp"-->
<% Call PageAccess() %>
blabla
...

common.asp:

<%
Public Sub PageAccess()
     If Session("Inloggad") = "" Then 
          Response.Redirect("error.htm") 
     End If 
End Sub
%>

så på alla sidor som du sedan vill kolla inloggningen så kallar du bara på subben:

<% Call PageAccess() %>

Och döp aldrig includefiler till .inc utan till .asp :)

/RED
Å så lägger du SQLinjectfunktionen i filen common.asp också så du kan använda den när du vill!

Medlem sedan juni 2005584 inlägg
#13

på vilekt sätt är din lösning bättre :stud

Medlem sedan juni 20003 076 inlägg
#14

Jo, om du t.ex har en sida som du inte vill kolla inloggning på så måste du ta bort inkluderingen av din fil: koll.inc och detta blir jobbigt att komma ihåg hela tiden, inkludera eller inte inkludera.
Gör du som jag skrev så kan du inkludera filen på alla sidor och sedan kalla på subben på de sidor du vill spärra.
Detta blir väldigt användbart när du börjat samla på dig en massa div. funktioner och subbar. Återanvändning av kod kallas det! :)

Medlem sedan juni 2005584 inlägg
#15

tack doggelito för att du delar med dig av din kunskap och erfarenhet :birp

  1. kan common.asp användas där inte global.asa kan användast, typ Brinkster?

  2. Om jag fattat rätt så skall jag inkludera common.asp på ALLA mina sidor

  3. och på de sidor som jag vill skydda från obehöriga: inkluderar jag BÅDE

     <!--#include virtual="common.asp"-->
    <% Call PageAccess() %>
    
Medlem sedan juni 20003 076 inlägg
#16

ptr_lks skrev:

tack doggelito för att du delar med dig av din kunskap och erfarenhet

Alltid roligt att kunna hjälpa till! :)
Dina frågor:
1. Ja, eftersom det är en helt vanlig inkluderad fil. Dock vissa webbhotell tillåter inte att man länkar via "include file" utan bara med "include virtual".
2. Japp!
3. Korrekt!

Varför man döper filen till .asp och inte .inc är för att skydda innehållet i filen.
En .inc går att ladda ner och sedan öppna i sin textredigerare. :)

Man kan väl säga så här när det gäller subbar och funktioner:
Allt som du skriver mer än en gång gör du om till en sub eller function och anropar istället! (lite överdrivet kanske, men ändå)
Återanvända kod är något man alltid ska sträva efter.

Medlem sedan juni 200032 967 inlägg
#17

En .inc går att ladda ner och sedan öppna i sin textredigerare.

Oftast inte nuförtiden. Det är väl bara på ofixade installationer av IIS4 man behöver oroa sig om det. Jag förordar dock också filändelsen .asp, och en placering av includefiler i en egen mapp istället.

Medlem sedan juni 2005584 inlägg
#18

Hittade just detta info från Brinkster

Use Include Files:
<!-- #include virtual="/includes/common.asp" -->

Innebär detta månne, att jag måste skapa en mapp kallad "includes" och lägga common.asp där?

Medlem sedan juni 200032 967 inlägg
#19

Nej, det har jag svårt att tänka mig. Det är nog bara ett exempel.

Medlem sedan juni 2005584 inlägg
#20

@nders skrev:

Nej, det har jag svårt att tänka mig. Det är nog bara ett exempel.

Ok
Men

Jag förordar dock också filändelsen .asp, och en placering av includefiler i en egen mapp istället.

men enligt ovan, så borde jag skapa en mapp för mina inkludes

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)