Har en sida där jag visar undersidor m.h.a Server.Execute("").
Nu tänkte jag ta reda på ett bra sätt att spärra, så att man inte kan skriva vad som helst i frågesträngen, för sidorna visas utifrån vad variabeln mP har för värde och det är sidans_namn.
Så skriver jag ?mP=home så hamnar man på förstasidan osv.
Det här ska jag nu försöka "låsa" på ett bra sätt, så att man inte kan köra "förbjudna" filer på det här sättet.
Skiver man ex. vis ?mP=default så kommer ju oändlig loop initieras så att webläsaren hänger sig.
Tänkte om man kan ha med alla "godkända" filnamn i tex. en array och sedan kolla av med tex. en loop (en ifsats går ju det med, men inte lika 'snyggt'.) Det ska naturligtvis vara plättlätt att lägga till filnamn i samma ögonblick som man skapar en ny undersida.
Även undermappar ska vara spärrade, man ska alltså inte kunna skriva en hel sökväg uppe i adressfältet.
Koden jag använder just nu är:
Dim strCat, obj
strCat = Request.QueryString("mP")
If (strCat) <> "" Then
Set Obj = CreateObject("Scripting.FileSystemObject")
If Obj.FileExists(Server.MapPath(strCat & ".asp")) Then
Server.Execute(strCat & ".asp")
Else
Server.Execute("includes/404.inc")
End if
Else
Response.reDirect("default.asp?mP=home")
End if
Set Obj = Nothing
Set strCat = Nothing
Lagra dem någonstans. Alternativen som jag ser det.
* En array. Skicka med en siffra i QueryStringen som pekar på en plats i arrayen.
* Ett dictionary. Kan använda textsträngar istället.
* Databas. Bäst, men kanske lite krångligare.
Går det att lösa med en Array() med filnamnet istället för en siffra?
Alla mina filnamn innehåller bara a-z, så inga "fula" tecken alls.
Skulle vilja ha ett exempel på hur en sån här array kan se ut samt hur jag loopar igenom den för att kolla mot querytringen.
<%
sidor = array("sid1","sid2","sid3","sid4")
For i = 0 to UBound(sidor)
If(sidor(i) = Request.QueryString("mP")) Then
Server.Execute(Request.Querystring("mP") & ".asp")
Else
Response.Write "Den här sidan kan inte visas."
End If
Next
%>
Har jag tänkt helt galet är kan jag gå vidare med det här?
Lite galet är det med tanke på att du måste loopa igenom arrayen. Bättre då att använda ett collection-objekt typ Scripting.Dictionary. Ett exempel:
<%
Dim mP
mP = Request.QueryString("mP")
Dim dic
Set dic = Server.CreateObject("Scripting.Dictionary")
dic.CompareMode = 1
dic("sid1") = 1 : dic("sid2") = 1 : dic("sid3") = 1 : dic("sid4") = 1
If dic.Exists(mP) Then
Server.Execute(mP & ".asp")
Else
Response.Write "Den här sidan kan inte visas."
End If
Set dic = Nothing
%>
Använder hash-teknik för att snabbt hitta rätt.
137 ms totalt · 2 externa anrop · v20260731065814-full.2ae45ccc