webForumDet fria alternativet

Ni får inte ladda ner filerna!

.NET

17 svar · 594 visningar · startad av cyprys

Medlem sedan dec. 20003 563 inlägg
Frågan#1

Jag tar upp ett problem jag ännu inte lyckats lösa.

Håller på och gör en webbplats där man ska kunna ladda ner filer som ligger i en och samma mapp.
Antalet filer kommer att ändras hela tiden då vissa användare får ladda upp filer.

Problem 1.
Då filerna ofta är i format som pdf och doc så har jag kommit fram till att visa direkta sökvägar till filerna är det bästa (Där användaren väljer "spara som"), för att de inte ska öppnas i webbläsaren.
Samtidigt vill jag uppdatera hur många nedladdningar varje fil fått. Detta genom att antagligen visa den direkta sökvägen till filerna genom ett annat litet fönster för enkelhetens skull.
Men finns det nått sätt att automatiskt påbörja en en spara som-ruta på en doc-fil?

Problem2.
I vilket fall som jag väljer för p1 så vill jag skydda mappen där filerna ligger i med form-authentcation.
Problemet är att jag inte lyckas att säkra mappen de ligger i.
Har lagt en web.config i själva mappen där jag stänger ute alla användare "what-so-ever" just nu, men man kommer ändå åt den.

<authorization>
        <deny users="*" />
</authorization>

Någon som har en kodsnutt eller inställning som vi vet fungerar så man kan jämföra?
Har gått efter både boken och MDSN på den här grejen tycker jag.

Medlem sedan feb. 20038 inlägg
#2

Jag har en mapp som är skyddad i min applikation och min web.config ser ut ungefär såhär:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

<system.web>

<authentication mode="Forms">
       <forms name="Blabla" loginUrl="login.aspx"></forms>
</authentication>
  
<authorization>
        <allow users="*" /> 
</authorization> 

</system.web>
    
<location path="vip_directory">
	<system.web>
		<authorization>
			<deny users="?" /> 
		</authorization>
	</system.web>
</location>

</configuration>

Det jag här kallar för vip_directory är alltså den skyddade mappen.

/Kalli

Medlem sedan maj 2001329 inlägg
#3

problem 2

asp.net skyddar enbart de filer som den anser är dess egna. dvs .aspx, ascx, html etc... till dessa hör alltså inte alla andra filer som doc osv. För att dess ska kollas av aså.net måste man lägga till dem i iis:en som nånging kommer inte ihåg exakt hur, men det är spelar ingen roll eftersom det inte är en bra lösning.

Det är inte en bra lösning därför att då tolkas det av asp.net som en sida som den ska ta hand om. Om du tex försöker skriva ut något i global.asax händelsen begin.request så kommer detta att balla ur documentet. Finns säkert fler saker som ballar det..men det räcker väl med ett exempel för att överbevisa alla :p

Nåja vad då göra..

Förslag ett lägg filerna i en databas och gör logik som skyddar dem.

Förslag två lägg filererna på en ej web-utdelad katalog och gör logik som streamar ut dem till användaren.

Förlag tre gör windows inloggning och låt NTFS styra alla rättigheter. (tyvärr har jag inte lyckats hitta nått sätt att sätta rättigheterna på filerna via koden)

Förslag fyra, skit i min åsikt att det är dåligt att mappa filerna till asp.net.

problem 1

Om du löser ett eller två över så har du löst detta problem osså.

Kanske inte några konkreta kod exempel, men en liten vägledning ivarje fall. :bire

Medlem sedan dec. 20003 563 inlägg
#4

asp.net skyddar enbart de filer som den anser är dess egna. dvs .aspx, ascx, html etc... till dessa hör alltså inte alla andra filer som doc osv. För att dess ska kollas av aså.net måste man lägga till dem i iis:en som nånging kommer inte ihåg exakt hur, men det är spelar ingen roll eftersom det inte är en bra lösning.

Okidoki! Jag testade att lägga in en aspx-fil i den mappen och mina tidigare koder funkade bra där. Dock så stämmer det du säger här ovan och den här lösningen kommer inte att göra det jag ville.
Det enda jag egentligen vill är att filerna inte skall kunna nås genom en vanlig URL samt att de skall laddas ner och inte öppnas i en webbläsare.

Om vi spanar vidare på ditt förslag nr 2 och sparar filerna i en mapp över wwwrooten.
Hur skulle en sådan logik se ut för att användaren ska kunna ta del av filerna?

Medlem sedan maj 2001329 inlägg
#5

Lite snabbt och oprövad kod hur streaming funkar.

Response.CharSet("");
Response.ContentType="Text/html";
Response.Write(myStream);
Response.End();

exempel på hur en bild kan skrivas ut

Response.ContentType="image/jpg";
image.Save(Response.OutputStream, ImageFormat.Jpeg);

Ungefär nått i den stilen. Alltså inte så speciellt konstigt.

ps :o
hmm, slog mig just nu att anledningen som jag hade för att inte sätta content typen i IIS påverkar även streamingen som jag har här..men det kanske är lättare att kring gå om man använder streaming. Det går ju att flusha responset innan man påbörjar streamingen etc. :p

Medlem sedan dec. 20003 563 inlägg
#6

Hmm. Och detta får användaren att få upp en ruta som man väljer "spara som" med?

Medlem sedan maj 2001329 inlägg
#7

Det beror ju på vad användaren har ställt in i sin browser om de får upp spara rutan eller direkt i browsen, men det visste du säkert.

Om jag inte är ute och cyklar ska föjande kod funka. Den tvingar filen att bli öppnas som attachment istället för i browsern.

Page.Response.AddHeader("content-disposition","attachment; filename="name.doc");

Medlem sedan dec. 20003 563 inlägg
#8

Det beror ju på vad användaren har ställt in i sin browser om de får upp spara rutan eller direkt i browsen, men det visste du säkert.

Det finns speciella koder som funkar i IE som går runt användarens inställningar där man kan få upp en "spara som"-ruta på vad som helst.
Det ska tydligen även gå genom ASP men jag vet inte hur bara.

Men jag testar ovanstående snutt och försöker fördjupa mig lite i ämnet.
Man tackar :)

r1: Jag redigerar lite jag me då ;)
Jag har testat koden du skrev ovan samt läst en del om det men lyckas inte riktigt ändå..

r2: Jag lyckas få den kodsnutten att få upp en spara som-ruta för filer som ligger i samma mapp. Kan inte gå utanför mappen tydligen?
Detta gör ju att problemet med att skydda filerna kvarstår.
Visserligen Skulle man kanske kunna lägga ascx-filen som detta körs från i mappen med filerna och sätta authorization på den, samt därefter skapa ett mappnamn som är långt och hemligt.
Inget jag tror jag vill satsa på iofs men hur men har ni några snilleblixtar? :)

Medlem sedan dec. 20003 563 inlägg
#9

Hur ser den där streamingkoden ut för att streama ut en fil som ligger utanför webrooten?

Medlem sedan mars 20002 836 inlägg
#10

Det du kan göra är att sätta endast ScriptSource Access på mappen i IIS Managern (högerklicka på mappen, välj egenskaper, säkerhet på vald mapp). På det viset kan man inte komma runt att ladda ned filerna med direkt url i browsern: http://www.mrwize.nu/bin/guestbook.mdb som exempel men du kommer fortfarande åt dem genom kod

cya,
PatrikB

Medlem sedan dec. 20003 563 inlägg
#11

Yupp. Patrik hade tricket jag behövde. Perfa.
Nu har jga kombinerat authorization-forms , inställningar i IIS och attachment.
Enda problemet nu är att det bara funkar i IE.

Page.Response.AddHeader("content-disposition","attachment; filename="name.doc");

Denna kod funkar varken i Opera eller Netscape.
Varför och hur kan man gå runt det?

Medlem sedan juni 20008 205 inlägg
#12

cyprys skrev:

Varför och hur kan man gå runt det?

Vad jag minns funkar det visst i Netscape (>4) men jag kan ha fel... http://www.webforum.nu/showthread.php?s=&postid=490189#post490189 :q

Medlem sedan dec. 20003 563 inlägg
#13

Nja. Både ja och nej.

Det funkar alldeles utmärkt allting i IE i vilket fall som helst men när jag kör i Netscape och Opera så vill det inte riktigt.
[kod]Response.ContentType = "application/unknown"
Response.AddHeader("content-disposition", "attachment; filename=" & Request.QueryString("file"))[kod]
Om jag hoppar över att sätta en contenttype så händer ingenting på sidan.
Om jag däremot skriver dit den så laddar man ner själva sidan.
Alltså filen.ändelse.aspx och allt som står på själv aspx-sidan.

Den verkar inte hitta attachtment-filen.
Det konstiga är dock att det hittar allt den behöver i IE utan problem med exakt samma kod.

Vart ligger skillnaden för att även NS ska ta emot koden?

Medlem sedan mars 20002 836 inlägg
#14

Mozilla som använder "samma" motor som NS tankar hem filen .... men, med fel filändelse. Det beror på att du har contenttype = application/unknown

om du sätter rätt contenttype så funkar det ... på min Mozilla i varje fall :e

cya,
PatrikB

Medlem sedan mars 20002 836 inlägg
#15

sorry, my misstake ... det var visst Phoenix som klarade av det ...... tyvärr inte Mozilla ....

/PatrikB

Medlem sedan juni 20008 205 inlägg
#16

Uhm, Phoenix är väl för tusan också Mozilladriven?

Medlem sedan mars 20002 836 inlägg
#17

det förståss .... den klarade det .... inte Mozillan .... slutsats? :e

/PatrikB

Medlem sedan dec. 20003 563 inlägg
#18

I vilket fall som helst så funkar det varken i Opera eller Netscape...

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