Avatar billede jes-eu Nybegynder
30. august 2006 - 10:32 Der er 24 kommentarer og
2 løsninger

Beskyt folder med session

Kan man lave en mappe på sit webhotel som man kun kan tilgå hvis man er logget ind og hvordan gør man? Det drejer sig om nogle følsomme dokumenter!

Jeg håber I kan hjælpe, der er mange point for et hurtigt svar!
Avatar billede hnteknik Novice
30. august 2006 - 10:36 #1
Du kan staerte med at at opsætte en mappe udenfor www delen. Typisk der hvor man har sin access database liggende. Lav derefter et system i asp, som henter de pågældende filer
Avatar billede jes-eu Nybegynder
30. august 2006 - 10:37 #2
kanb du give et eksempel, jeg har prøvet at linke men uden held
Avatar billede hnteknik Novice
30. august 2006 - 10:38 #3
Der er også denne på unix

http://azero.dk/support/unix/password/
Avatar billede jes-eu Nybegynder
30. august 2006 - 10:39 #4
det ligger på en windows server
Avatar billede hnteknik Novice
30. august 2006 - 10:47 #5
Har du via ftp adgang til både en /db og /www folder, hvor typisk webstedet ligger på /www og følsomme filer ligger på  /db siden som ikke direkte kan tilgås via webstedet.

Du henter så filen frem via FSO objektet - noget i retning af

<%
 
  Dim objFSO, objFile
 
  Const strFilename = testfile.txt
 
  Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objFile = objFSO.OpenTextFile(strFilename, 1, True)
   
      ' Giv filen et filnavn
      Response.AddHeader "Content-Disposition", "filename=" & strFilename
     
      ' Fortæl browseren hvad for en type filen er
      Response.ContentType = "text/html"
     
      ' Send indholdet af filen til browseren
      Response.BinaryWrite objFile.ReadAll
   
      objFile.Close
   
    Set objFile = Nothing

  Set objFSO = Nothing
 
%>

Jeg kan ikke lige grave det rigtige frem sidder et forkert sted :-( Kigger efter det
Avatar billede jes-eu Nybegynder
30. august 2006 - 10:51 #6
ok, du har helt ret i opbygningen og jeg har adgang til DB, der helt sikkert point hvis du kan sende mig script
Avatar billede hnteknik Novice
30. august 2006 - 10:53 #7
Du kan bruge FSO til også at flytte filerne fra det sikre sted til et temp sted, hvorfra de efterfølgende sletter filen.

Fandt også denne her:

http://www.webmasterworld.com/forum47/2275.htm
Avatar billede jes-eu Nybegynder
30. august 2006 - 11:00 #8
der er jeg ikke lige helt med!
Avatar billede hnteknik Novice
30. august 2006 - 11:11 #9
Jeg har ikke et working example, da jeg ikke har haft brug for at hente beskyttede filer.

Jeg forestilelr mig, at man har lavet f.eks. en Access db med en tbel, som holder styr forklaring på filindhold, filnavn, sti til fil navn og evt. password.

Opslaget i dben giver så de nødvendige oplysninger for FSO objectet til at hente filen fra det beskyttede område - noget i retning af dette her - for PDF filer:


<%
Response.ContentType = "application/pdf"
Response.AddHeader "Content-Disposition", "attachment; filename=""my.pdf""" 'Firefox fix
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 1
objStream.Open
objStream.LoadFromFile *filepath* 'udenfor webroot web root  (kan hentes en gang for alle med applicationpath ;-)
Response.BinaryWrite objStream.Read
objStream.Close
Set objStream = Nothing
%>
Avatar billede hnteknik Novice
30. august 2006 - 11:15 #10
Undskyld det sidste er selvfølgelig ikke FSO objectet med ADO streaming
Avatar billede hnteknik Novice
30. august 2006 - 11:26 #11
Det her er det nærmeste jeg kan komme et script - har ikke testet det:

<%

Response.Buffer=true

Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1

if session("totDownloads") > session("maxDownloads") -1 then
      response.redirect "user_status.asp"
      response.end
    end if

Function downloadFile( strFile, strDownloadFilename, strPath )

    Dim strFilename,objStream,objFilesystem,objFilestream
    Dim intFileLength
    ' get path of specified file
    strFilename = Server.MapPath( strPath & strFile)
    ' clear the buffer
    Response.Buffer = True
    Response.Clear

    ' create stream
    Set objStream = Server.CreateObject("ADODB.Stream")
    ' set as binary
    objStream.Type = 1

    objStream.Open

      ' check the file exists
    Set objFilesystem = Server.CreateObject("Scripting.FileSystemObject")
    if not objFilesystem.FileExists(strFilename) then
          Response.Write("<h1>Error</h1>: " & strFilename & " does not exist<p>")
          Response.End
    end if

    ' get length of file
    Set objFilestream = objFilesystem.GetFile( strFilename )
    intFilelength = objFilestream.size


    ' REMOVED PARENTHESES FROM  strFileName

    objStream.LoadFromFile strFilename

    ' CHANGED TO err.number then

    if err.number then
          Response.Write("<h1>Error: </h1>" & err.Description & "<p>")
          Response.End
    end if
   
    'format strFileName
    if Len( Trim(strDownloadFilename) ) > 0 then
          strDownloadFilename = Trim( strDownloadFilename )
    else
          strDownloadFilename = objFilestream.name
    end if

    ' send the headers to the users browser
    Response.AddHeader "Content-Disposition", "attachment; filename=" & strDownloadFilename
    Response.AddHeader "Content-Length", intFilelength
    Response.Charset = "UTF-8"
    Response.ContentType = "application/octet-stream"

    ' output the file to the browser
    Response.BinaryWrite objStream.Read
    Response.Flush

    ' tidy up
    objStream.close
    set  objStream = nothing

    ' COMMENTED OUT AS UNECESSARY
    'objFilestream.Close
    'Set objFilestream = Nothing

End Function


If trim(session("fname")) <> "" AND trim(session("lname")) <> "" THEN
    fileName = server.mappath(request("file"))
    tempFile=split(filename,"\")
    dbFileName = tempFile(ubound(tempFile))
   
    set conn=Server.CreateObject("ADODB.Connection")
    set rs=Server.CreateObject("ADODB.Recordset")
    conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("/_private/data/tracking.mdb")
    rs.open "SELECT * FROM tracking WHERE download='  ' ",conn,2,2
    rs.Addnew
    rs("download")=request("file")
    rs("username")=session("fname") & " " & session("lname")
    rs("uid") = session("uid")
    realdatetime= dateadd("h",-5,Now)
    rs("date")=realdatetime
    rs.update
   
    session("totDownloads") = session("totDownloads") + 1
   
    rs.Close()
    conn.Close()
    set rs=nothing
    set conn=nothing
   
    strParameter = request.querystring("file")
    strFile =  Right(strParameter,Len(strParameter)-instrrev(strParameter,"/"))
    strPath = Left(strParameter, Len(strParameter) - Len(strFile) )
    Call downloadFile( strFile,strFile,strPath)
Else
    Response.write("There has been an error please log in again!")
End If

%>
Avatar billede hnteknik Novice
06. september 2006 - 10:06 #12
Hm - hvad fik du ud af det ???
Avatar billede jes-eu Nybegynder
14. september 2006 - 11:44 #13
Jeg har ikke fået det til at virke, kan du evt. skrive nogle kommentarer til?
Avatar billede hnteknik Novice
14. september 2006 - 12:15 #14
Det ser ud til at have komments i rimelig omfang. Du har rettet det til dit behov. Du kan jo ikke bruge det direkte -

f.eks. conn.open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("/_private/data/tracking.mdb") skal laves og tilpasses.
Avatar billede jes-eu Nybegynder
21. september 2006 - 09:26 #15
Hvor skal stierne til filerne mv. sættes ind og hvad skal jeg bruge databasen til? Jeg er ikke lige helt med, beklager.
Avatar billede jes-eu Nybegynder
21. september 2006 - 09:32 #16
kan du ikke give et eksempel på hvordan det ville se ud hvis jeg har følgende:

Fil: test.pdf
Path: d:\\test.dk\database\files\

Jeg opretter gerne et andet nemt spørgsmål til 200 point som du også kan få
Avatar billede hnteknik Novice
21. september 2006 - 10:54 #17
Jeg kan prøve at lave et working ex. i aften. Jeg har ikke ftp adgang eller IIS herfra.
Avatar billede jes-eu Nybegynder
21. september 2006 - 12:42 #18
Perfekt.... du får 200 ekstra
Avatar billede hnteknik Novice
21. september 2006 - 21:53 #19
Så er jeg tættere på en løsning:

Jeg har oprettet en mappen 'filer' udenfor www området på mit web.
Jedg har også oprettet en tracking.mdb med to tabeller, som holder styr på filer og deres dwl - lagt i en mappe db udenfor www.

jeg har lavet en filelist.asp, som lister de dummy filer, jeg har lagt ude i det beskyttede område. asp filen skal selfølgelig beskyttes med et pw ;-)

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
<!--
.Menu {
    FONT-SIZE: 12px;
    FONT-FAMILY: Verdana, Arial, Helvetica;
    FONT-WEIGHT: bold;
    COLOR: #FFFFFF;
}

.Tekst {
    FONT-SIZE: 11px;
    FONT-FAMILY: Verdana, Arial, Helvetica;
    FONT-WEIGHT: normal;
    COLOR: #000000;
}

-->
</style>
</head>

<body>
<%
ConnStr ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Request.ServerVariables("APPL_PHYSICAL_PATH") & "../" & "db" & "/" &"tracking.mdb"
    set conn=Server.CreateObject("ADODB.Connection")
    set rs=Server.CreateObject("ADODB.Recordset")
    conn.open ConnStr
    rs.open "SELECT * FROM listing ",conn
    Response.write("<table CLASS='Tekst'>")
    Response.write("<TR BGCOLOR='#0000CC'><TD COLSPAN='2'>&nbsp;<SPAN CLASS='Menu'><B>Filoversigt</B></SPAN></TD></TR>")
    Response.write("<tr><td>Filnavn</td><td>Filtekst</td></tr>")
   
    Do While Not rs.Eof
        If Color = "#DDDDDD" Then
            Color = "#BBBBBB"
        Else
            Color = "#DDDDDD"
        End If
        Response.write("<tr BGCOLOR=""" & Color & """><td>"& "<A HREF='test.asp?file="& "../" & "../" &"filer" & "/" &rs("FilNavn")&"'>"&rs("FilNavn")&"</A></td><td>"&rs("Filtekst")&"</td></tr>")   
        rs.MoveNext
    Loop
    Response.write("</table>")
   
    rs.Close()
    conn.Close()
    set rs=nothing
    set conn=nothing
   
    session("fname")= "Henrik"
    session("lname")= "Nielsen"
    session("uid") = "hen"
%>
</body>
</html>
---------
test linket er her

http://web4it.dk/filhent/filelist.asp


--
Filen som streamer filerne ud til modtageren har jeg blot kaldt test.asp. Det kører fint localt med der er lidt brok for andre filer end txt ude på webstedet - prøv selv.

<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
ConnStr ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Request.ServerVariables("APPL_PHYSICAL_PATH") & "../" & "db" & "/" &"tracking.mdb"

Response.Buffer=true

Response.CacheControl = "no-cache"
Response.AddHeader "Pragma", "no-cache"
Response.Expires = -1


If trim(session("fname")) <> "" AND trim(session("lname")) <> "" THEN
    fileName = server.mappath(request("file"))
    tempFile=split(filename,"\")
    dbFileName = tempFile(ubound(tempFile))
   
    set conn=Server.CreateObject("ADODB.Connection")
    set rs=Server.CreateObject("ADODB.Recordset")
    conn.open ConnStr
    rs.open "SELECT * FROM tracking WHERE 1=0",conn,2,2
    rs.Addnew
    rs("download")=request("file")
    rs("username")=session("fname") & " " & session("lname")
    rs("uid") = session("uid")
    realdatetime= dateadd("h",-5,Now)
    rs("date")=realdatetime
    rs.update
   
    session("totDownloads") = session("totDownloads") + 1
   
    rs.Close()
    conn.Close()
    set rs=nothing
    set conn=nothing
   
    strParameter = request.querystring("file")
    strFile =  Right(strParameter,Len(strParameter)-instrrev(strParameter,"/"))
    strPath = Left(strParameter, Len(strParameter) - Len(strFile) )
    Call downloadFile( strFile,strFile,strPath)
Else
    Response.write("There has been an error please log in again!")
End If

Function downloadFile( strFile, strDownloadFilename, strPath )

    Dim strFilename,objStream,objFilesystem,objFilestream
    Dim intFileLength
    ' get path of specified file
    strFilename = Server.MapPath( strPath & strFile)
    ' clear the buffer
    Response.Buffer = True
    Response.Clear

    ' create stream
    Set objStream = Server.CreateObject("ADODB.Stream")
    ' set as binary
    objStream.Type = 1

    objStream.Open

      ' check the file exists
    Set objFilesystem = Server.CreateObject("Scripting.FileSystemObject")
    if not objFilesystem.FileExists(strFilename) then
          Response.Write("<h1>Fejl: </h1>" & strFilename & " Eksisterer Ikke!<p>")
          Response.End
    end if

    ' get length of file
    Set objFilestream = objFilesystem.GetFile( strFilename )
    intFilelength = objFilestream.size


    ' REMOVED PARENTHESES FROM  strFileName

    objStream.LoadFromFile strFilename

    ' CHANGED TO err.number then

    if err.number then
          Response.Write("<h1>Fejl: </h1>" & err.Description & "<p>")
          Response.End
    end if
   
    'format strFileName
    if Len( Trim(strDownloadFilename) ) > 0 then
          strDownloadFilename = Trim( strDownloadFilename )
    else
          strDownloadFilename = objFilestream.name
    end if
   
'<<<<<<<<<<<<<
        strFileType = lcase(Right(strDownloadFilename, 4))
   
    ' Tiføj selv dine  Content-Types Her
    Select Case strFileType
        Case ".asf"
            ContentType = "video/x-ms-asf"
        Case ".avi"
            ContentType = "video/avi"
        Case ".doc"
            ContentType = "application/msword"
        Case ".zip"
            ContentType = "application/zip"
        Case ".xls"
            ContentType = "application/vnd.ms-excel"
        Case ".gif"
            ContentType = "image/gif"
        Case ".jpg", "jpeg"
            ContentType = "image/jpeg"
        Case ".wav"
            ContentType = "audio/wav"
        Case ".mp3"
            ContentType = "audio/mpeg3"
        Case ".mpg", "mpeg"
            ContentType = "video/mpeg"
        Case ".rtf"
            ContentType = "application/rtf"
        Case ".htm", "html"
            ContentType = "text/html"
        Case ".asp"
            ContentType = "text/asp"
        Case ".pdf"
            ContentType = "application/pdf"
        Case ".txt"
            ContentType = "text/plain"
        Case Else
            'Håndterer alle andre filer
            ContentType = "application/octet-stream"
        End Select   
    '<<<<<<<<<<<<<<<
 
    ' send the headers to the users browser
    Response.AddHeader "Content-Disposition", "attachment; filename=" & strDownloadFilename
    Response.AddHeader "Content-Length", intFilelength
    Response.Charset = "UTF-8"
    Response.ContentType = ContentType

    ' output the file to the browser
    Response.BinaryWrite objStream.Read
    Response.Flush

    ' tidy up
    objStream.close
    set  objStream = nothing

    ' COMMENTED OUT AS UNECESSARY
    'objFilestream.Close
    'Set objFilestream = Nothing

End Function

%>
Avatar billede hnteknik Novice
21. september 2006 - 22:18 #20
Bemærk nu, at du skal beskytte disse funktioner bedre. Hvis du bruger min demo filelist.asp, så eksponerer du dit website for utidig download. DERFOR skal du straks fjerne muligheder for at dl f.eks. ContentType = "text/asp" og andre filer, som er kritiske for webbet. Du skal også sikre at man ike kan dl fra andre mapper end f.eks. filer

    if instr(strPath, "filer") then
                Call downloadFile( strFile,strFile,strPath)
    else
        response.write("Ha ha, den går ikke")
        response.end()
    end if

Pas nu på, at du spreder benene for eventuelle hackere.
Du kan udbygge scriptet foran databasen med en id, som går ned i databasen og henter den rigtige sti til filen, så ingen kan se, hvor det kommer fra. Dette er blot en demo. !!!

Henrik
Avatar billede hnteknik Novice
21. september 2006 - 22:33 #21
ps - du kan også lave headeren dispositionen om

    'Response.AddHeader "Content-Disposition", "attachment; filename=" & strDownloadFilename
    Response.AddHeader "Content-Disposition", "inline; filename=" & strDownloadFilename
Avatar billede hnteknik Novice
24. september 2006 - 13:48 #22
??
Avatar billede hnteknik Novice
26. september 2006 - 19:57 #23
??
Avatar billede jes-eu Nybegynder
29. september 2006 - 11:40 #24
Perfekt, jeg har været ud at rejse.... det virker, word filer kan dog ikke vises i browseren....
Avatar billede jes-eu Nybegynder
29. september 2006 - 11:43 #25
200 mere som aftalt: http://www.eksperten.dk/spm/735422
Avatar billede hnteknik Novice
29. september 2006 - 12:46 #26
Hej 
Ok - men pas nu på, at ingen hacker sig ind den vej, du nu åbner.
Alle links virker herfra bortset fra zip fil, men det er nok, fordi at zip er gemt i et nyere format end det gamle l... som er på denne maskine. Det virker lidt forskelligt i de to browsere jeg har testet. Det er sikkert noget med sikkerhedsopsætningen på den enkelte browser. Word kan f.eks. indeholde skadelig scriptkode. Min browser derhjemme sætter f.eks. [1] ind bag navnet på alle filer den gemmer i cashen. Det gør denne her ikke.

Bemærk nu, at mit testeks. med filelist.asp har et link med fuld sti
til filen som den sender til test.asp. Det skal du nok ikke gøre i virkeligheden, da det åbner op for hackere. Overfør kun det ID, der peger hen på filoplysninger, som du så henter i test.asp via et opslag i databasen. Mit forslag var blot et dovent spring over hegnet.
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