Zabezpečení před neoprávněným přístupem k souboru nebo obrázku

JellyPot umí zabezpečit soubory (a tedy i obrázky) nahrávané přes administrační rozhraní před neoprávněným přístupem. Jinými slovy, aby uživatel měl k danému souboru přístup, musí patřit do správné skupiny uživatelů. Zabezpečení souborů se obvykle využívá ve spojení se Zabezpečení před neoprávněným přístupem ke stránce nebo její části.

Soubory nahrané přes administrační rozhraní jsou ve výchozím nastavení ukládany do složky upItems, která je umístěná ve virtuálním adresáři webu, viz Složky pro upload souborů z administračního rozhraní. Jsou tak veřejně přístupné, stačí znát jejich URL. To je obvykle žádoucí.

Pro zabezpečení souborů před neoprávněným přístupem je třeba:

  1. Zavést zabezpečené cesty prostřednictvím sekce SecurePaths konfiguračního souboru Runtime.config.
  2. Site.config nastavit atribut securePath všem polím typů <Img>, <SimpleImg>, <ImgCollection>, <File><FileCollection>, která mají být zabezpečena.
  3. Vyrobit servírovací skript, který bude ověřovat oprávnění uživatele a servírovat požadované soubory. K tomu slouží trojice controlů <je:secureImgDownload>, <je:secureFileDownload><je:secureRule>.

Na co dát pozor

Při použití zabezpečených cest je potřeba dát pozor na dvě zákeřnosti:

  • Nelze libovolně měnit definici již zavedených zabezpečených cest – cesty k souborům jsou v databázi uloženy právě pod jménem zabezpečené cesty. Pokud by došlo k jeho změně či by byla nasměrována jinam a soubory by přitom nebyly fyzicky přesunuty, přestaly by tyto soubory být dostupné.
  • Je třeba změnit výchozí nastavení složky trash – buď ji přesunout z výchozího umístění ve virtuálním adresáři webu někam mimo něj nebo v UploadsRuntime.config nastavit způsob mazání na trashMethod="delete". Více viz SecurePaths.

Příklad

Rozšiřme příklad z Zabezpečení před neoprávněným přístupem ke stránce nebo její části. Každý článek bude obsahovat ještě obrázkovou galerii. U článků s předplatným by obrázky v ní obsažené měly být přístupné také jen předplatitelům. Nechceme se přitom spolehnout na řešení z kategorie security by obscurity – chceme, aby obrázky nebyly nepředplatitelům přístupné, ani když na ně získají odkaz.

Nejprve připravíme zabezpečenou cestu, kam se budou obrázky ukládat. V konfiguračním souboru Runtime.config zavedeme sekci SecurePaths:

...
<SecurePaths>
    <SecurePath name="secureImages"
                path="../uploads/images"
                downloadPage="/en/file.aspx" />
</SecurePaths>
...

Do Site.config přidáme kolekci obrázků:

...
<UserGroupSets>
    <SysUserGroup name="anybody" title="Anybody" />
    <UserGroup name="subscriber" title="Subscriber" />
    <UserGroup name="subscriberVip" title="VIP Subscriber" />
    <Set name="Visitors" members="anybody, subscriber, subscriberVip" />
</UserGroupSets>
...
<Vars>
    <Collection name="article" type="ArticleItem" />
</Vars>
...
<Types>
    <Type name="ArticleItem">
        <SimpleText name="title" />
        <Text name="text" />
        <ImgCollection name="imgCol" securePath="secureImages">
            <Size name="fullHD" width="1920" height="1080" />
        </Img>
        <UserGroups name="allowAccessFor" set="Visitors" />
    </Type>
</Types>
...

Do deklarace typu článku ArticleItem jsme tedy přidali pole typu <ImgCollection>. U něj jsme použili atribut securePath a odkázali se jím na zabezpečenou cestu secureImages zavedenou v předchozím kroku.

Nyní vyrobíme servírovací skript. Cestu k němu jsme určili v atributu downloadPage elementu <SecurePath>Runtime.config. Založíme tedy soubor /en/file.aspx a do něj napíšeme následující kód:

<%@ Page %>
<je:secureImgDownload runat="server" type="ArticleItem.imgCol">
    <je:secureRule runat="server" visibleFor=".allowAccessFor" />
</je:secureImgDownload>

Tím říkáme, že pole imgCol typu ArticleItem má být přístupné uživatelům s oprávněními danými polem allowAccessFor. Pokud bychom zabezpečovali polí s obrázky nebo soubory více, použili bychom v servírovacím skriptu další controly <je:secureImgDownload> (resp. <je:secureFileDownload>). Jeden servírovací skript může bez problémů obsluhovat všechny zabezpečené obrázky i soubory na webu; ty mohou být uložený na různých zabezpečených cestách.

Zbývá nám již jen doplnit výpis galerie do šablony článku:

<%@ Page %>
<je:container runat="server" expect="article">
    <je:securePage runat="server"
                   visibleFor=".allowAccessFor" />
    <html>
        <head>
            <je:item runat="server" field=".title" tag="title" />
        </head>
        <body>
            <je:item runat="server" field=".title" tag="h1" />
            <je:item runat="server" field=".text" />
            <je:repeater runat="server" source=".imgCol">
                <item>
                    <je:img runat="server" field=".img" size="fullHD" />
                </item>
            </je:repeater>
        </body>
    </html>
</je:container>

Použili jsme úplně obyčejný control <je:img> v úplně obyčejném <je:repeater>. Výpis v šabloně je tedy v případě zabezpečených obrázků zcela stejný jako těch nezabezpečených – lišit se ale bude jeho URL vygenerované controlem <je:img>.

Připomínky a postřehy

Máte-li nějakou připomínku, dobrý nápad nebo jste našli v dokumentaci chybu, rádi od vás uslyšíme.