webForumDet fria alternativet

Inloggning med olika behörighetsnivåer?

ASP

29 svar · 1 119 visningar · startad av MadMange

Medlem sedan aug. 200646 inlägg
Frågan#1

Hej! Första inlägget här, så fan om ni inte välkomnar mig med öppna armar! :birp
(kanske ska påpeka att jag har sökt runt lite snabbt här på forumet, men utan resultat)

Till problemet som jag vet inte är så avancerat för er experter, men dock så knepigt för mig som inte pysslar med kodning av ASP på daglig basis.
Jag försöker fixa till så olika användare har olika behörighetsnivåer ( guest, user, admin) dvs tre olika nivåer. Så tex om en "user" är inloggad så kan han inte komma åt en viss information på index_start.asp som "admin" kan, men i sin tur så skall "admin" kunna se både informationen som "guest" och "user" kan, är ni med på vad jag menar? Skulle det vara så att det är mycket lättare/bättre att koda med endast "user" och "admin" så är det helt ok, "guest" ville jag endast ha bara för att kunna skriva tex "du är endast gäst här så för att komma åt mer information kontakta administratören"

Jag har en kod redan som kanske går att slänga om lite i så det funkar med dem olika behörighetsnivåerna?

1. Först en inloggningssida som heter index.asp där man fyller i användarnamn osv inga konstigheter där.

2. När man har fyllt i sinda uppgifter kommer man till index_check.asp som ser ut så här:

<title>Inloggning</title>
<body>

Administration
<%
if request.querystring("status") <> "check" then
response.redirect("fel.asp")
end if

if request.querystring("status") = "check" then
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("db_ver1.0.mdb")
SQL = "SELECT anvandarnamn, losenord FROM administration " & _
"WHERE anvandarnamn = '"&request.form("anvandarnamn")&"' AND " & _
"losenord = '"&request.form("losenord")&"' "
Set RS = Connect.Execute(SQL)

if RS.eof then %>
Fel användarnamn och lösenord!
<% else
session("inloggad") = true %>
<% Response.Redirect "index_start.asp" %>
<% end if
end if
Connect.close
Set Connect = nothing
Set RS = nothing
%>
</td>
</tr>
</table></td>
</tr>
</table>

3. Är användarnamn osv ok så skickas man till index_start.asp som har index_include.asp includerat i sig för att kolla så allt står rätt till.

<!-- #include file = "index_include.asp" -->
<title>Inloggning</title>
<body>
Administration
<br />Du är nu Inloggad!</td>

"index_include.asp"

<%
if session("inloggad") <> true then
response.redirect("fel.asp")
end if
%>

Medlem sedan dec. 19996 721 inlägg
#2

Enklast möjliga är att du lägger till en kolumn i din användartabell där behörigheten anges. Vid lyckad inloggning lagrar du värdet från denna kolumn i Session, och kan därefter kontrollera användartypen när du vill.

OBS! Din inloggning går att hacka på 0.1 millisekunder. Du MÅSTE ersätta enkelfnuttar i SQL-frågan med dubbla enkelfnuttar...

SQL = "SELECT anvandarnamn, losenord FROM administration " & _
"WHERE anvandarnamn = '"&replace(request.form("anvandarnamn"),"'","''")&"' AND " & _
"losenord = '"&replace(request.form("losenord"),"'","''")&"' "

Annars kan man logga in genom att t.ex ange lösenordet:

' OR ''='

Sök på "SQL Injection" så kommer du att hitta mer om problemet. Det gäller inte bara inloggningar utan alla SQL-frågor som körs med användarstyrda argument.

Välkommen till forumet, förresten! :)

Medlem sedan aug. 200646 inlägg
#3

emission skrev:

Enklast möjliga är att du lägger till en kolumn i din användartabell där behörigheten anges. Vid lyckad inloggning lagrar du värdet från denna kolumn i Session, och kan därefter kontrollera användartypen när du vill.

Precis, men hur ser en sådan kod ut?

emission skrev:

OBS! Din inloggning går att hacka på 0.1 millisekunder. Du MÅSTE ersätta enkelfnuttar i SQL-frågan med dubbla enkelfnuttar...

Tackar för den kodsnutten och varningen, ska kolla lite närmare på det här med SQL Injection.

emission skrev:

Välkommen till forumet, förresten! :)

Det tackar jag för! :bire

Medlem sedan dec. 19996 721 inlägg
#4

MadMange skrev:

Precis, men hur ser en sådan kod ut?

<title>Inloggning</title>
<body>

Administration
<%
if request.querystring("status") <> "check" then
response.redirect("fel.asp")
end if

if request.querystring("status") = "check" then
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("db_ver1.0.mdb")
SQL = "SELECT anvandarnamn, losenord,behorighet FROM administration " & _
"WHERE anvandarnamn = '"&replace(request.form("anvandarnamn"),"'","''")&"' AND " & _
"losenord = '"&replace(request.form("losenord"),"'","''")&"' "

if RS.eof then %>
Fel anv&auml;ndarnamn och l&ouml;senord!
<% else
session("inloggad") = true 
session("behorighet") = RS("behorighet")

%>
<% Response.Redirect "index_start.asp" %>
<% end if
end if
Connect.close
Set Connect = nothing
Set RS = nothing
%>
</td>
</tr>
</table></td>
</tr>
</table>
Medlem sedan aug. 200646 inlägg
#5

emission skrev:

kod....

Kör jag den koden så får jag detta meddelande:

Körningsfel i Microsoft VBScript (0x800A01A8)
Objekt krävs.: 'RS'
index_check.asp, line 17

Sen hur skriver jag ut informationen i sin tur på index_start.asp ?
Jag hittade detta, men jag vet inte om det funkar.

<!-- #include file = "index_include.asp" -->
<title>Inloggning</title>
<body>
Administration

<% select case session("behorighet")
case user
Hej användare.
case admin
Hej administrator.
end select %>
<br />Du är nu Inloggad!</td>

Medlem sedan dec. 19996 721 inlägg
#6

MadMange skrev:

Kör jag den koden så får jag detta meddelande:

Raden "Set RS = Connect.Execute(SQL)" försvann

MadMange skrev:

Sen hur skriver jag ut informationen i sin tur på index_start.asp ?
Jag hittade detta, men jag vet inte om det funkar.

Det är strängvärden du kontrollerar, och det finns ingen VBScript-funktion som heter "Hej", så:

<% select case session("behorighet")
case "user"
%>Hej användare.<%
case "admin"
%>Hej administrator.<%
end select %>
<br />Du &auml;r nu Inloggad!</td>
Medlem sedan aug. 200646 inlägg
#7

emission skrev:

Raden "Set RS = Connect.Execute(SQL)" försvann

Nu är jag inte med, vart ska Set RS = Connect.Execute(SQL) in? får bara felmeddelanden hela tiden.. =/ Som jag skrev innan så är jag nybörjare så jag hoppas du har överseende med att jag ställer så konstiga frågor, men jag vill lära mig!. =)

Medlem sedan dec. 19996 721 inlägg
#8

Den ska in där den låg förut.

Medlem sedan aug. 200646 inlägg
#9

emission skrev:

Den ska in där den låg förut.

aaa självklart! Tack för hjälpen (y)

Medlem sedan aug. 200646 inlägg
#10

Fler frågor

Hur gör jag för att sätta en session på användarnamnet? är det så enkelt som jag har gjort i exemplet nedan? Hur skriver jag ut det sedan < % session bla bla "anvandarnamn" %> ???

<%
if request.querystring("status") <> "check" then
response.redirect("fel.asp")
end if

if request.querystring("status") = "check" then
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ="& Server.MapPath("../../db/db_ver1.0.mdb")
SQL = "SELECT anvandarnamn, losenord, behorighet FROM administration " & _
"WHERE anvandarnamn = '"&replace(request.form("anvandarnamn"),"'","''")&"' AND " & _
"losenord = '"&replace(request.form("losenord"),"'","''")&"' "
Set RS = Connect.Execute(SQL)

if RS.eof then %>
Fel användarnamn och/eller lösenord!
<% else
session("inloggad") = true
session("behorighet") = RS("behorighet")
session("anvandarnamn") = RS("anvandarnamn")

%>
<% Response.Redirect "../_medlemszon/" %>
<% end if
end if
Connect.close
Set Connect = nothing
Set RS = nothing
%>

Medlem sedan juni 200032 967 inlägg
#11

är det så enkelt som jag har gjort i exemplet nedan?

Ja, det borde det vara.

Hur skriver jag ut det sedan < % session bla bla "anvandarnamn" %> ???

Response.write Session("anvandarnamn")

- - - - - -

Det vore supermysigt om du använde [kod]-taggar istället för

/

-taggar.

mvh

Medlem sedan aug. 200646 inlägg
#12

Dra på trissor, det fungerade, tack :)
[kod]-taggar skall användas i fortsättningen.
(återkommer snart med ett par frågor till)

Medlem sedan juni 200032 967 inlägg
#13

(y)

Medlem sedan aug. 200646 inlägg
#14

Nu kommer en fråga till! Kul va! :D

Om jag vill plocka fram projekt som enbart tillhör Tex "MadMange" som ligger i "skribent" kolumnen från "nyhetartikel" tabellen hur gör jag då? (hmm vet inte riktigt om ens jag fattade vad jag just skrev =/ )

Saken är den att man loggar ju in med användarnamn o lösenord och användarnamnet sparas ju i en session och då vill jag kuna plocka ut bara dom projekten som det användarnamnet tillhör, jag vill ju inte att tex "Kalles" projekt ska visas... hoppas ni förstår, annars får jag försöka förklara bättre.

Mycket kod/sorry :r

<%Response.Buffer=True
Session.Lcid = 1053

Set Conn = Server.CreateObject("ADODB.Connection") 
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("../../db/db_ver1.0.mdb")%>

<%If Request.QueryString("do") = "" Then%>
            <%If Request.Querystring("action")= "" Then%>
            <%Set RecSet = Server.CreateObject("ADODB.Recordset")

Const perSida1 = 50
Sidan = Request.QueryString("sida")
If Sidan = "" then 
    sida = 1 
Else 
    sida = Sidan 
End If 

With RecSet
    .CursorLocation = 3
    .CacheSize = perSida1 
End With

SQL = "SELECT * FROM nyhetartikel WHERE typ = 'projekt' ORDER BY DATUM DESC"
RecSet.Open SQL, Conn
If RecSet.EOF Then%>
            Här var det tomt.. 
            <%Else%>
            <%With RecSet
    .MoveFirst 
    .PageSize = perSida1 
    .AbsolutePage = sida
End With

Sidor = RecSet.PageCount
Count = 0 
Do While Not RecSet.EOF And Count < RecSet.PageSize%>
            <table width="100%" border="0" cellspacing="0" cellpadding="0">
              <tr> 
                <td width="14%"><%=FormatDateTime(RecSet("Datum"),2)%></td>
                <td width="9%"><%=RecSet("typ")%></td>
                <td width="71%"> 
                  <%If Len(RecSet("rubrik")) > 50 Then%>
                  <%=Left(RecSet("rubrik"),50)%>... 
                  <%Else%>
                  <%=RecSet("rubrik")%> 
                  <%End If%>
                </td>
                <td width="6%"><div align="right"><a href="admin_ny_art_akt_projekt.asp?action=change&id=<%=RecSet("id")%>" title="Ändra">Ä</a>&nbsp;<a href="admin_ny_art_akt_projekt.asp?action=delete&id=<%=RecSet("id")%>" title="Ta bort" onClick="return confirm('Radera <%=RecSet("rubrik")%> ur databasen?');">R</a></div></td>
              </tr>
            </table>
            <%Count = Count + 1
RecSet.MoveNext
Loop

If Sidor > 1 Then%>
            <br>
            Sida: 
            <%If Sidor <> 1 Then
    For Sid = 1 To Sidor
    If (Int(Sid)) = (Int(sida)) Then%>
            <font color="#ff0000"><%=Sid%></font> 
            <%Else%>
            <a href="admin_ny_art_akt_projekt.asp?sida=<%=Sid%>"><%=Sid%></a> 
            <%End If%>
            <%Next%>
            <%End If
End If%>
            <%If Session("mess") <> "" Then%>
            <%
       Response.Write Session("mess")
       Session("mess") = ""
    %>
            <%End If%>
            <br> <br> <a href="admin_ny_art_akt_projekt.asp?action=add"><font color="#000000"><font color="#996633">&raquo;</font></font> 
            Lägg till ett projekt</a> 
            <%RecSet.Close
Set RecSet = Nothing
End If
End If
If Request.Querystring("action") = "add" Then%>
            <p></p>
            <table width="100%" cellpadding="0" cellspacing="0">
              <form method="post" action="admin_ny_art_akt_projekt.asp?action=spara" name="texten">
                <tr> 
                  <td><b>Projektets namn:</b><br> <input type="text" name="rubrik" style = "width: 100%; margin-top: 2px; margin-bottom: 2px;" size="50"></td>
                </tr>
                <tr> 
                  <td> <b>Typ:</b><br> <select name="typ" size="1">
                      <option value="projekt">projekt</option>
                    </select> </td>
                </tr>
                <tr> 
                  <td><b>Text:</b> <font color="#FF0000">(Bilder som infogas i 
                    texten får vara MAX 590 pixlar bred)</font><br> <textarea cols="85" rows="20" name="texten" style = "width: 100%; margin-top: 2px; margin-bottom: 2px;"></textarea></td>
                </tr>
                <tr> 
                  <td><input type="Submit" name="andra" value="Lägg till"></td>
                </tr>
              </form>
            </table>
            <%End If
If Request.Querystring("action")= "change" Then

Set RecSet = Conn.Execute("SELECT * FROM nyhetartikel WHERE id="& Request.Querystring("id"))%>
            <table width="100%" cellpadding="0" cellspacing="0">
              <form method="post" action="admin_ny_art_akt_projekt.asp?action=andrat&id=<%=Request.Querystring("id")%>" name="texten">
                <tr> 
                  <td><b>Projektets namn:</b><br> <input name="rubrik" type="text" id="rubrik" style = "width: 100%; margin-top: 2px; margin-bottom: 2px;" value="<%=RecSet("rubrik")%>" size="50"></td>
                </tr>
                <tr> 
                  <td> 
                    <%
	
	Function IsSelected(strUno, strDos)
	
		strUno = LCase(trim(strUno))
		strDos = LCase(trim(strDos))
		If strUno = strDos Then IsSelected = " selected=""selected"""

	End Function
	
	%>
                    <b>Typ:</b><br> <select name="typ" size="1">
                      <option value="projekt"<%= isSelected(RecSet("typ"), "projekt") %>>projekt</option>
                    </select> </td>
                </tr>
                <tr> 
                  <td><b>Datum:</b> <font color="#FF0000">(Datumet måste skrivas 
                    enligt följande format: "2003-12-08 16:58:00")</font><br> 
                    <input type="text" name="datum" size="50" style = "width: 100%; margin-top: 2px; margin-bottom: 2px;" value="<%=RecSet("datum")%>"></td>
                </tr>
                <tr> 
                  <td><b>Text:</b> <font color="#FF0000">(Bilder som infogas i 
                    texten får vara MAX 590 pixlar bred)</font><br> <textarea name="texten" cols="85" rows="20" id="texten" style = "width: 100%; margin-top: 2px; margin-bottom: 2px;"><%=RecSet("texten")%></textarea></td>
                </tr>
                <tr> 
                  <td><input type="Submit" name="andra" value="Utför ändringar"></td>
                </tr>
              </form>
            </table>
            <%RecSet.Close
Set RecSet = Nothing

End If
If Request.Querystring("action")= "spara" Then
   Rubrik      = Replace(Request.Form("rubrik"), "'", "''")
   Typ         = Replace(Request.Form("typ"), "'", "''")
   Texten      = Replace(Request.Form("texten"), "'", "''")

   Conn.Execute("INSERT INTO nyhetartikel(rubrik,typ,texten) VALUES('" & rubrik & "', '" & typ & "','" & texten & "')")
   Response.Redirect "admin_ny_art_akt_projekt.asp"
End If
If Request.Querystring("action") = "andrat" Then
   Rubrik      = Replace(Request.Form("rubrik"), "'", "''")
   Typ         = Replace(Request.Form("typ"), "'", "''")
   Texten      = Replace(Request.Form("texten"), "'", "''")
   Datum      = Replace(Request.Form("datum"), "'", "''")

   Conn.execute("Update nyhetartikel Set Rubrik='" & rubrik & "', Typ='" & typ & "', Texten='" & texten & "', Datum='" & datum & "' Where id = "& Request.Querystring("id"))
   Response.Redirect "admin_ny_art_akt_projekt.asp"
End If
If Request.Querystring("action") = "delete" Then
   Conn.Execute("Delete From nyhetartikel Where id="& Request.Querystring("id"))
   Response.Redirect "admin_ny_art_akt_projekt.asp"
End If

End If
Conn.Close
Set Conn = Nothing%>
Medlem sedan dec. 19996 721 inlägg
#15
SQL = "SELECT * FROM nyhetartikel WHERE skribent = '" & Session("anvandarnamn") & "' ORDER BY DATUM DESC"
Medlem sedan aug. 200646 inlägg
#16

Det är ju strålande! Nu är det bara en sak som återstår och det är att när man "lägger till ett projekt" så vill jag att när man för in informationen i databasen så ska "användarnamnet" automatiskt läggas till i "skribent" kolumnen, hur gör jag då? en dold option value eller nått? .. Man ska alltså inte kunna skriva in användarnamnet själv, för då kan jag ju tex skriva fel och då hamnar kan jag ju inte se den. är ni mer? ;)

Medlem sedan dec. 19996 721 inlägg
#17

Stoppa in det i SQL-satsen, precis som i exemplet ovan!

Medlem sedan aug. 200646 inlägg
#18

mjo jag försöker men det är inte så lätt med alla konstiga tecken, det är som rena kinesiskan för mig ;)
Men jag ska fortsätta prova så får vi se.. hehe
Tack så hemskt mycket i alla fall för det hjälpen jag har fått!! :birp

Medlem sedan aug. 200646 inlägg
#19

yes!! Jag fixat! :)

<select name="Skribent" size="1">
                      <option value="<%=Session("anvandarnamn")%>"><%=Session("anvandarnamn")%></option>
                    </select>

If Request.Querystring("action")= "spara" Then
   Skribent		= Replace(Request.Form("skribent"), "'", "''")
   Rubrik		= Replace(Request.Form("rubrik"), "'", "''")
   Typ			= Replace(Request.Form("typ"), "'", "''")
   Texten		= Replace(Request.Form("texten"), "'", "''")

   Conn.Execute("INSERT INTO nyhetartikel(skribent,rubrik,typ,texten) VALUES('" & skribent & "','" & rubrik & "','" & typ & "','" & texten & "')")
   Response.Redirect "admin_ny_art_akt_projekt.asp"
End If
Medlem sedan aug. 200646 inlägg
#20

Frågan är bara vem jag ska "Acceptera som slutgiltigt svar" så ingen blir tjurig? =)
Ni är ju grymt duktiga båda två, tack emission & @nders ! :bire

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