AccessControl

Z thewoodcraft.org

Software MediaWiki, na kterém běží projekty Wikimedia Foundation, nebyl navržen jako sofistikovaný CMS systém[1].

AccessControl tento nedostatek řeší. Vyvíjí se od září 2009 a tohle je manuál k připravované verzi 3.0.

Kdo všechno používá AccessControl?

Pokud vás zajímá, jaké verze rozšíření AcccessControl se používají a kde, podívejte se na WikiApiary.
Pokud budete mít pocit, že je tam těch webů málo, uvědomte si že AccessControl používají především wiki, které nejsou tak otevřené jako projekty Wikimedia Foundation. Většinou ani nemají veřejně dostupné API a obvykle omezují i přístup na speciální stránky, přes které lze získat data o jejich konfiguraci.
Pokud wiki registrovaná na WikiApiary používá AccessControl a má na některé stránce, přes kterou robot doluje data, neplatný odkaz[2], nezjistí se o její konfiguraci také nic, protože robot skončí na stránce s oznámením, že anonymní uživatelé mají přístup omezen.
O spolehlivosti rozšíření AccessControl svědčí fakt, že za celou dobu reálného nasazení na wiki DCE FEL ČVUT nebyl zaznamenán jediný případ vandalizace stránek či zneužití (nebo úniku) chráněného obsahu.
Prostudujte důkladně tento manuál. Je důležité znát jak AccessControl funguje, abyste byli připraveni řešit situaci, pokud by někdo udělal chybu, nebo se pokusil zneužít některou šablonu.
Budete-li spokojeni s tím, jak funguje rozšíření AccessControl na vaší wiki, můžete na oplátku podpořit TheWoodcraft.Org. Je to wiki, na které se verze 3.0 vyvíjela a kterou financuje jeho autor.

Základní konfigurace MediaWiki před instalací rozšíření AccessControl

MediaWiki, software na kterém běží Wikipedia, vznikla proto, aby pomohla přivést na svět do nedávné doby utopickou myšlenku, že kvalitní obsah internetových stránek může vznikat vzájemnou spoluprací všech uživatelů, tedy včetně těch anonymních. Díky benevolentnímu přístupu se brzy stala oblíbeným terčem psychopatů a frustrátů, jejichž největší radostí je – škodit. Proto se zavedly uživatelské skupiny, vybavené různými pravomocemi, a byrokratické mechanismy pro jejich udílení.

Standardní MediaWiki pracuje hlavně s následujícími skupinami:

anonymní uživatel
Je každý nepřihlášený uživatel, který je v rámci MediaWiki identifikován svou IP adresou.
přihlášený uživatel ('user')
Tuhle skupinu má každý registrovaný a řádně přihlášený uživatel. V rámci MediaWiki je identifikován svým uživatelským jménem.
administrátor ('sysop')
Uživatel, který je v této skupině může vykonávat činnosti nutné při údržbě wiki (například mazat stránky, vracet změny, atp.). Zařazen může být do této skupiny trvale, ale i dočasně.
byrokrat ('bureaucrat')
Pouze uživatel z této skupiny může udílet práva ostatním uživatelům.
'bot'
Je to skupina vyhrazená pro uživatele, kteří často editují obsah wiki, případně vykonávají hromadné operace pomocí nejrůznějších skriptů. Některé operace uživatelů z této skupiny se nezaznamenávají, aby se tím zbytečně nezatěžoval systém MediaWiki a jejich akce probíhaly co nejrychleji. Kdyby tomu tak nebylo, mohly by na stránce Special:Recentchanges uniknout pozornosti jiné, nežádoucí změny.

Existují i další skupiny, které si pro svou potřebu zavádějí některá rozšíření. Ovšem vždy platí, že v rámci skupiny mají všichni členové stejná práva. Pokud chcete mít v MediaWiki kromě veřejně dostupného obsahu také obsah určený vyhrazený jen pro vybranou množinu uživatelů, zjistíte, že systém uživatelských práv založený na členství ve skupinách nestačí.

Pokud nemá MediaWiki nainstalované rozšíření AccessControl, lze zabránit zobrazení obsahu stránky jedině tak, že se přístup do vybraného jmenného prostoru povolí pouze pro vybranou skupinu uživatelů a všem ostatním se do něj přístup preventivně zakáže. Je to nešťastné řešení:
  • Z dlouhodobého hlediska je to na nic, protože dříve či později do wiki, nebo jejího vyhrazeného jmenného prostoru, ke kterému bude mít přístup jen omezený okruh uživatelů, nebude nikdo psát.
  • Většina uživatelů nemá zájem věnovat svůj čas tvorbě obsahu, který nelze veřejně prezentovat. A obsah, na který se nedá dostat má pro ostatní nulovou informační hodnotu – stejně jako kdyby neexistoval.
  • Postupně přestanou takové stránky navštěvovat i ti co volali po jejich uzavření, protože nebudou mít obsah, který by je zajímal a kvůli němuž by se na ně vraceli. A wiki bez obsahu ztrácí smysl.

Wiki je živý organismus, jemuž dává smysl všeobecné sdílení informací, které obsahuje. Každý (tedy i anonymní) uživatel by měl mít možnost číst její obsah, pokud tomu nebrání licence, nebo smluvní podmínky provozovatele wiki. A pokud uživatel splní podmínky vyžadované při registraci uživatelského účtu, tak by měl mít možnost – již jako přihlášený uživatel – participovat i na tvorbě obsahu.

Proto je prvním řádkem v konfiguračním souboru LocalSettings.php povolena akce 'view' pro všechny uživatele – včetně těch anonymních. A těmi ostatními preventivně zakázány akce, přes které by mohli uživatelé anonymně zapisovat do vaší wiki:

$wgGroupPermissions['*']['read']            = true;
$wgGroupPermissions['*']['createaccount']   = false;
$wgGroupPermissions['*']['edit']            = false;
$wgGroupPermissions['*']['writeapi']        = false;
$wgGroupPermissions['*']['createpage'] = false;
$wgGroupPermissions['*']['createtalk'] = false;
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createpage'] = false;
S takovým nastavením bude mít k editaci stránek vaší instance MediaWiki přístup pouze registrovaný a řádně přihlášený uživatel – to je výchozí předpoklad k tomu, aby rozšíření AccessControl fungovalo jak má.

Pokud máte pocit, že je to vůči anonymním návštěvníkům příliš restriktivní, uvědomte si, že vaše wiki nejspíš nikdy nebude mít dostatek bdělých administrátorů, co by včas odstranili nežádoucí změny ze strany vandalů! A jenom vy jste zodpovědní za důvěryhodnost vaší instance MediaWiki a za kvalitu jejího obsahu ručíte svým jménem. Pro malé wiki tedy vždy platí následující premisa:

To, že se uživatel může podílet se na tvorbě obsahu není právo, ale privilegium!

Další doporučené nastavení pro LocalSettings.php

Rozšíření AccessControl, je primárně určeno k ochraně obsahu a přístup na speciální stránky MediaWiki neřeší. Nicméně není důvod k tomu, aby na většinu z nich měl anonymní uživatel přístup.

Doporučuji tedy omezit přístup na speciální stránky. Existuje na to rozšíření MediaWiki DisableSpecialPages, ale je dlouhodobě neudržované, takže pokud chcete, můžete použít v konfiguraci vašeho souboru LocalSettings.php stejný kód, jako se používá na wiki TheWoodcraft.org:

 …
 function disableSomeSpecialPages(&$list) {
     global $wgUser;
     if ( is_array( $wgUser->mRights ) && in_array( 'createpage', $wgUser->mRights ) ) {
         return true;
     } else {
         if ($wgUser->mId > 0 ) {
             return true;
         }
         unset($list['Mypage']);
         foreach( array(
             'Activeusers',
             'Allmessages',
             'Allpages',
             'Ancientpages',
             'ApiSandbox',
             'Blankpage',
             'BlockList',
             'Boilerplates',
             'Booksources',
             'BrokenRedirects',
             'CategoryTree',
             'ComparePages',
             'Contributions',
             'CreateCategory',
             'CreateClass',
             'CreateForm',
             'CreateTemplate',
             'Deadendpages',
             'DoubleRedirects',
             'ExpandTemplates',
             'Export',
             'ExportTranslations',
             'Fewestrevisions',
             'FileDuplicateSearch',
             'Forms',
             'FormEdit',
             'FormStart',
             'LanguageStats',
             'LinkSearch',
             'ListDuplicatedFiles',
             'Listfiles',
             'Listgrouprights',
             'Listredirects',
             'Listusers',
             'Log',
             'Lonelypages',
             'Longpages',
             'ManageMessageGroups',
             'MediaStatistics',
             'MessageGroupStats',
             'MIMEsearch',
             'Mostcategories',
             'Mostimages',
             'Mostinterwikis',
             'Mostlinked',
             'Mostlinkedcategories',
             'Mostlinkedtemplates',
             'Mostrevisions',
             'Movepage',
             'MultiPageEdit',
             'Newimages',
             'Newpages',
             'PagesWithProp',
             'PagesWithoutScans',
             'PageTranslation',
             'Preferences',
             'Prefixindex',
             'Protectedpages',
             'Protectedtitles',
             'RandomInCategory',
             'Randompage',
             'Randomredirect',
             'Redirect',
             'ResetTokens',
             'RunQuery',
             'SearchTranslations',
             'Shortpages',
             'Statistics',
             'SupportedLanguages',
             'TrackingCategories',
             'Translate',
             'Translations',
             'TranslationStats',
             'TranslationStash',
             'Uncategorizedcategories',
             'Uncategorizedimages',
             'Uncategorizedpages',
             'Uncategorizedtemplates',
             'Unusedimages',
             'Unusedtemplates',
             'Wantedfiles',
             'Wantedpages',
             'Wantedtemplates',
             'Watchlist',
             'Withoutinterwiki'
             ) as $i ) {
             unset( $list[$i] );
         }
     }
     return true;
 }
 $wgHooks['SpecialPage_initList'][]='disableSomeSpecialPages';
 …

Rozšířená práva specifická pro vybraná rozšíření

Také práva která do vaší MediaWiki přidávají některá rozšíření,mohou ve výsledku – díky svému výchozímu nastavení – představovat bezpečnostní "díru", přes kterou by mohl neoprávněný uživatel získat chráněný obsah – například rozšíření Translate. Používáte-li takové rozšíření, zkontrolujte zda umožňuje anonymně výtáhnout z vaší wiki nějaký obsah. A pokud ano, omezte preventivně jeho práva pro anonymní uživatele.

U wiki TheWoodcraft.org bylo nutné nastavit tyto proměnné:

 // Extension:LookupUser
 $wgGroupPermissions['*']['lookupuser'] = false;

 // Extension:Translate
 $wgGroupPermissions['*']['pagetranslation'] = false;

Instalace

Instalace rozšíření AccessControl je velice jednoduchá:

  1. Naklonujte z git repozitáře, nebo vybalte ze staženého tarballu, zdrojové kódy do adresáře extensions/AccessControl/ vaší instance MediaWiki.
  2. Pak do konfiguračního souboru LocalSettings.php přidejte následující řádku:
wfLoadExtension( 'AccessControl' )

Jakmile soubor LocalSettings.php uložíte, začne vaše wiki AccessControl používat.

Jak pracuje AccessControl se stránkou MediaWiki

Veškerý obsah AccessControl kontroluje na straně serveru – dřív, než z něj parser MediaWiki vygeneruje HTML kód, který bude doručen webovému prohlížeči na straně klienta. Pokud během kontroly AccessControl narazí na kód, který mu sdělí že je obsah stránky chráněný, zkontroluje jestli uživatel, který požadavek odeslal, může přistupovat k obsahu.

editors
mají plná práva na všechny operace
visitors
mají právo pouze na čtení obsahu

Pokud nemá právo ani na čtení (visitors), přeruší AccessControl další zpracování stránky a místo ní vrátí HTML kód stránky s upozorněním, že se pokusil dostat na stránku ke které nemá přístup.

Jak se AccessControl dozví, že jde o chráněnou stránku?

Existují tři možné způsoby, jimiž lze AccessControl informovat o tom, že je obsah stránky chráněný:

  1. Parametrem šablony
  2. Názvem použité šablony
  3. Použitím tagu accesscontrol
Na jedné stránce můžete použít různé způsoby jak přes rozšíření AccessControl předat informaci, koho může pustit na stránku, ale rozhodne to, které bude mít poslední slovo!. Můžete toho s výhodou využít pokud chcete mít v rámci jedné stránky obsah pro různé skupiny uživatelů i veřejný obsah. Je doporučeno, místo tagu <a‌ccesscontrol> používat šablonu.

Šablony a jejich parametry

Klíčovou roli u MediaWiki hraje transkluze[3]. Jde o mechanismus, který umožňuje vložit do stránky obsah z jiné stránky. Nejčastěji se takto vkládají stránky ze jmenného prostoru Šablona (Template), kterým lze předávat další argumenty, jimiž lze modifikovat wiki kód vygenerovaný na základě jejich obsahu[4].


Oddělovačem argumentů předávaných šabloně je svislítko |. Prvním argumentem je vždy jméno stránky (šablony), jejíž obsah se má zpracovat a za ním mohou (ale nemusí) následovat další.

{{template | A | B | C }‌}

Argumenty se zpracovávají postupně.

{‌{template | 1 = A | 2 = B | 3 = C }‌}

A mohou být také očíslované, nebo pojmenované.

{‌{template | first = A | second = B | etc = C }‌}

Pokud jsou očíslované, nebo pojmenované, mohou být předány v libovolném pořadí.

{‌{template | 2 = B | 3 = C | 1 = A }‌}
Pokud šablona s pojmenovaným či očíslovaným argumentem nepracuje, tak předanou hodnotu ignoruje. To znamená, že se ani nezobrazí ve výsledném HTML kódu stránky a právě toho využívá AccessControl.

Rozdíl mezi parametrem a atributem

Tohle není atribut identifikovaný parametrem!

{‌{template | e‌‌ditAllowedUsers TestUser }‌}

Tohle je parametr. Za parametrem následuje znak = a po něm seznam jmen uživatelů, resp. skupin uživatelů.

{‌{template | e‌ditAllowedUsers = TestUser }‌}

Ochrana stránky parametrem šablony

 
  • Hlídejte si, aby někdo nezneužil některý z parametrů s nimiž pracuje AccessControl u některé často používané šablony!
Pokud nějaký vtipálek umístí do některé hojně používané šablony parametr, který AccessControl vyhodnotí jako ochranu stránky a všechny stránky, na kterých bude použitá, se už nikdo mimo něj nedostane! – ani administrátoři, pokud bude mít globální proměnná $wgAdminCanReadAll hodnotu false.
Proto byste měli preventivně veškeré šablony po dokončení zamykat, aby je pak mohli editovat jen prověření uživatelé.
Pokud se stane, že některý z uživatelů záměrně, něco takového udělá, měli byste ho nekompromisně zablokovat, aby nemohl dál škodit.
  • Dávejte pozor také při psaní jmen – parametrů, stránek i uživatelů.
Stačí překlep, vynechané písmeno, nebo zaměnit malé písmeno za velké či naopak a ochrana přes AccessControl nebude fungovat!
Tomu se můžete vy a uživatelé vaší wiki vyhnout, pokud budete využívat rozšíření Page Form a uživatelské seznamy spravovat přes formuláře.

AccessControl pracuje s kódem stránky dřív, než dojde na zpracování šablony. Takže, pokud u libovolné šablony najde v atributech některý z následujících parametrů, ví, že bude obsahovat informace, přes které získá seznam uživatelů, se kterým bude dál pracovat.

isProtectedBy – seznam skupin uživatelů
readOnlyAllowedGroups – skupiny uživatelů pouze s read-only přístupem
editAllowedGroups – skupiny uživatelů s právem k editaci
readOnlyAllowedUsers – seznam uživatelů co mohou obsah stránek pouze číst
editAllowedUsers – seznam uživatelů s právem k editaci

V rámci jedné šablony lze použít všechny uvedené parametry najednou, proto bylo pomocí odsazení naznačeno, jakou mají z hlediska práv vůči sobě hierarchické postavení. Více se dozvíte v popisu jednotlivých parametrů, kde budou uvedeny i příklady.

editAllowedUsers

Použitím tohoto parametru se z obyčejné šablony stane seznam uživatelů. Každý uživatel, jehož jméno bude uvedeno v tomto parametru bude mít právo k editaci stránky do níž bude šablona s tímto parametrem vložena. A také všech stránek, které ji použijí v parametru isProtectedBy. Je-li uvedeno uživatelů víc, oddělují se jejich uživatelská jména čárkou.

…
| e‌ditAllowedUsers = Kili, Quido
…

isProtectedBy

Přes tento parametrem získá AccessControl seznam wiki stránek, ze kterých se pokusí vytáhnout informace o tom, kdo a jaký typ přístupu má na stránku povolen. Pokud se v tomto seznamu objeví uživatelské jméno, prohledá AccessControl výchozí jmenné prostory a s největší pravděpodobností narazí na uživatelskou stránku ze které se pokusí získat seznam uživatelů. I když je to pochopitelně možné, nedoporučuji využívat pro seznamy uživatelů uživatelské stránky!

Takový seznam je totiž u nové verze automaticky chráněn přes AccessControl a tudíž by se na ni už nikdo jiný nedostal. Pokud chcete, použijte pro seznam uživatelů, kterým budete chránit jiné stránky raději stránku z hlavního jmenného prostoru, nebo podstránku. Takto by vypadalo využití podstránky accesslist uživatele TestUser, se skupinou uživatelů při ochraně stránky jiné.

…
| isProtectBy = TestUser/accesslist
…

U původního řešení ochrany stránek, pomocí tagu <a‌ccescontrol>, se pracovalo s tím, že obsahem tagu je řetězec, ve které se mohou vyskytovat jako konkrétní uživatelská jména, tak jména stránek, jejichž obsah se lze interpretovat jako seznam uživatelů. Stejným způsobem se přistupuje i k obsahu prvního atributu šablony, která má v názvu řetězec accesscontrol, protože jde pouze o alternativu vůči tagu <a‌ccescontrol> na bázi šablony.

readOnlyAllowedGroups

Tento parametr má větší váhu než isProtectedBy. I on akceptuje pouze seznam skupin uživatelů. Ovšem všichni uživatelé z těchto skupin budou mít právo stránku, do které je šablona s tímto parametrem vložena, pouze číst. A to bez ohledu na to, jestli mají v uživatelských seznamech předaných přes parametr isProtectedBy právo k editaci, nebo jen ke čtení.

Proto by měl být u šablony s tímto parametrem použitý i parametr editAllowedUsers přinejmenším se jménem editora stránky. Jinak se k ní nedostane nikdo jiný než administrátor.

editAllowedGroups

Rovněž tento parametr akceptuje pouze seznamy skupin uživatelů. Na rozdíl od uživatelů ze seznamu v parametru readOnlyAllowedGroups uživatelé z těchto skupin mají právo stránku editovat. A to bez ohledu na to jaká mají výchozí práva v rámci skupin, předaných parametrem isProtectedBy, i to že jsou uvedeni ve skupině, která má právo pouze ke čtení obsahu.

…
| isProtectBy = test-user
| r‌eadOnlyAllowedGroups = groupB
| e‌ditAllowedGroups = groupA
…

Pokud by v případě, který demonstruje výše uvedený kód byl uživatel jak ve skupině groupB, která má právo jen na čtení, i ve skupině groupA, bude mít jeho právo na editaci přednost!

readOnlyAllowedUsers

Na druhou stranu se hodí, když máme možnost zabanovat uživatele, ze skupiny, která má právo na editaci stránky. A právě k tomu je určen tento parametr. Pokud v něm AccessControl najde jméno aktuálního uživatele, nastaví mu pouze read-only přístup. Bez ohledu na to, jestli má v rámci některé skupiny předané parametrem isProtectedBy nebo editAllowedGroups nastavené právo k editaci.

Další zpracování šablony

Pokud AccessControl na základě obsahu uvedených parametrů vyhodnotí, že jako uživatel máte na stránku přístup povolen, klidně se mohou tyhle parametry v použité šabloně dál zpracovat.

{‌{Template a‌ccesscontrol
| Tahle stránka žádný externí seznam nepoužívá, protože se chrání sama
| e‌ditAllowedUsers = TestUser
| Tohle je seznam uživatelů podle verze 3.0
}‌}
I když šablona obsahuje v názvu řetězec 'accesscontrol', je místo prvního atributu zpracován obsah parametru editAllowedUsers, protože parametry šablon mají vyšší prioritu. Ke stránce na níž by se vyskytla šablona v této formě by tedy mohl, přistupovat pouze jediný uživatel TestUser. Nikdo jiný by se na ni nedostal.

Ochrana stránky pomocí tagu

Podpora tagu <a‌ccesscontrol> byla do verze 3.0 byla zahrnuta pouze proto, aby bylo možné nahrazovat původní ochranu stránek postupně a nebylo nutné měnit obsah již existujících stránek. Nepoužívejte ho u nových stránek! A pokud na něj u některé stránky narazíte, nahraďte ho šablonou.

Starší verze rozšíření AccessControl používaly k ochraně stránky pouze párový tag <a‌ccesscontrol>.

Pokud použijete na stránce místo šablony párový tag <a‌ccesscontrol> s vaším uživatelským jménem – budete mít přístup na takovou stránku jen vy. Vložený kód bude vypadat podobně, jako u následující ukázky. Jen místo Username musíte napsat svoje uživatelské jméno.

<a‌‌ccesscontrol>Username</a‌ccesscontrol>

Pokud chcete, aby smělo na tuhle stránku víc uživatelů, máte dvě možnosti. Buď můžete přidat jejich uživatelská jména, jako v následujícím příkladu.

<a‌ccesscontrol>Vaše uživatelské jméno, TestUser, Další uživatel</a‌ccesscontrol>

Nebo si můžete použít seznam uživatelů. Pokud si vytvoříte takový seznam na stránce test-page, bude to vypadat takto:

<a‌ccesscontrol>test-page</a‌ccesscontrol>

Použití seznamu je výhodné, pokud stejná skupina uživatelů pracuje s větším množstvím chráněných stránek.

Ochrana obsahem prvního parametru šablony

Stránku chráněnou šablonou s řetězcem accesscontrol v názvu nelze použít jako seznam uživatelů k ochraně jiných stránek!

Ochrana stránek pomocí tagu <a‌ccesscontrol> má jednu velkou nevýhodu – chráněné stránky je obtížné vyhledat. Naopak stránku, která používá šablonu lze dohledat velice snadno, pokud použijete následující postup:

  1. Vyhledejte si na stránce Special:Templates (pokud šablona existuje) nebo Special:Wantedtemplates (pokud šablona ještě neexistuje) jméno šablony a klikněte na něj.
  2. Pokud jste přihlášený uživatel, dostanete se i na editační stránku neexistující šablony (anonymní uživatel je v takovém případě automaticky přesměrován pryč).
  3. Povšimněte si, odkazu Odkazuje sem (Whats link here) v menu nalevo. Ten vede na speciální stránku Special:Whatlinkshere.
  4. Kliknete-li na něj, tak vám okamžitě vygeneruje seznam stránek, které tuto šablonu používají. Pokud k nim máte přístup, bez problémů se na ně přes tyto odkazy dostanete. Pokud ne, přesměruje vás to pryč.

Proto byla do nové verze rozšíření AccessControl 3.0, zahrnuta alternativa, která umožňuje postupně nahrazovat tag <a‌ccesscontrol>, který byl nutný u předchozích verzí, šablonou.

Tuto šablonu si můžete pojmenovat jak chcete, důležité je pouze to aby měla v názvu řetězec a‌ccesscontrol. Pokud jí předáte jako první parametr původní obsah tagu <a‌ccesscontrol> (seznam uživatelů, resp. uživatelských skupin, oddělených čárkou), bude fungovat stejně, ale můžete přidat i další parametry, které ta šablona může zpracovat, pokud bude mít uživatel na stránku přístup.

Pro AccessControl není vůbec důležité, jestli tahle šablona bude existovat, nebo ne. Pokud na testovací stránce test-page tedy použijete místo tagu, nebo parametrizované šablony následující wiki kód, u kterého nahradíte řetězec Username svým uživatelským jménem, bude ochrana stránky fungovat úplně stejně, jako kdybyste použili tag <a‌ccesscontrol>.

{‌{Template accesscontrol|Username}‌}

Pokud neexistuje šablona Template a‌ccesscontrol, tak se místo ní zobrazuje pouze červeně zbarvený odkaz na neexistující stránku. Nic vám ale nebrání si tuto šablonu založit a využít její obsah. Když kliknete na tento odkaz, můžete napsat do obsahu šablony následující kód. V žádném případě ho nekopírujte!, protože obsahuje skryté znaky, takže by nefungoval:

Page {‌{PAGENAME}‌} is protected by AccessControl.
Access is allowed for: {‌{‌{1|}‌}‌}
‌{‌{2|}‌}‌}

Když se pak vrátíte k testovací stránce test-page, chráněné přes takto pojmenovanou šablonu a uděláte refresh, zobrazí se vám místo odkazu na neexistující šablonu text, za kterým bude následovat seznam uživatelů a skupin, co budou mít ke stránku přístup.

Pak se odhlašte a vyzkoušejte, jestli AccessControl stránku zobrazí i pokud se na ni pokusíte přistoupit anonymně. Pokud se na stránku dostanete jako anonymní uživatel, pak to znamená, že jste někde něco nastavili špatně.

Pokud se na ni ovšem nedostanete ani jako přihlášený uživatel, tak je možné, že jste zadali neplatné uživatelské jméno, nebo neplatné jméno uživatelské skupiny – v takovém případě vám nezbyde, než požádat o pomoc uživatele, který je členem skupiny 'sysop', aby vaši chybu opravil.

Také si můžete vyzkoušet, jak to bude vypadat, když šabloně použité na stránce test-page předáte další parametry:

{‌{Template accesscontrol
| Username, test-page, TestUser, Čtenáři (ro)
| Next content in the second attribute 
| Other atributes…
}‌}

Jak můžete sami vidět, použití šablony otevírá další možnosti.

Pokud ale použijete v některém z atributů pojmenovaný parametr, se kterým pracuje AccessControl, bude mít jeho zpracování přednost!

Jak probíhá kontrola?

Tento manuál je připraven tak, abyste si jej mohli naimportovat do svojí wiki a postupně vyzkoušet (a otestovat) přes tuto stránku všechny možné kombinace a způsoby ochrany stránky. Výchozím předpokladem je, že si pro tento účel založíte testovací stránku test-page s níž budete pracovat.

Pokud necháte konfigurační proměnnou $wgAccessControlNamespaces na pokoji, bude AccessControl při kontrole chráněné stránky, narazí-i na položku, kterou lze interpretovat jako prvek určený k ochraně stránky[5], která obsahuje řetězec test-page postupovat takto:

  1. Zkontroluje, zdali test-page není náhodou uživatelské jméno.
  2. Pak zkontroluje, jestli se tak náhodou nejmenuje nějaká stránka v hlavním jmenném prostoru. Pokud ano, tak se z ní pokusí vydolovat seznam uživatelů.
  3. Pak se podívá, jestli se taková stránka náhodou nevyskytuje také ve jmenném prostoru vyhrazeném pro uživatelské stránky test-page. Jistě vám v tuto chvíli došlo, že by v takovém případě musel existovat uživatel se jménem test-page. Pokud by takový uživatel existoval a měl na svojí uživatelské stránce kód, který by bylo možné interpretovat jako seznam uživatelů, tak ho AccessControl použije.

Výsledkem bude pole (array), ve kterém budou dva klíče: "editors" a "visitors". AccessControl tohle pole zkontroluje a pokud v něm najde vaše uživatelské jméno, bude pokračovat ve zpracování stránky.

U nové syntaxe, která je založená na parametrech šablony lze může ten, kdo nastavuje přístupová práva ke stránce, zajistit aby se AccessControl nezdržoval prohledáváním všechny jmenných prostorů nastavených v proměnné $wgAccessControlNamespaces.

Stačí uvést jméno do parametru isProtectedBy, nebo readOnlyAllowedGroups či editAllowedGroups uvést jméno stránky s uživatelským seznamem, včetně jmenného prostoru. Takže uživatel TestUser by místo svého uživatelského jména napsal do příslušného parametru User:TestUser. Pochopitelně se tím zkrátí proces zpracování chráněné stránky.

Pro anonymní uživatele používá MediaWiki jako jméno zpravidla IP adresu, ze které na její stránku lezou. Teoreticky by tedy bylo možné povolit přístup anonymnímu uživateli pro jeho IP adresu. V praxi jsem to ale zatím nezkusil.

Globální konfigurační proměnné

V konfiguračním souboru LocalSettings.php lze použít u rozšíření AccessControl verze 3.x následující globální proměnné:

$wgAccessControlRedirect

Ve výchozím stavu je hodnota této proměnné true. Uživatele, který nemá právo přistupovat k obsahu stránky AccessControl automaticky přesměruje na stránku MediaWiki:Deny_user, kde se mu zobrazí (lokalizované) oznámení, že se pokusil dostat na chráněnou stránku, ke které nemá přístup povolen. Tohle automatické přesměrování lze vypnout, nastavením proměnné $wgAccessControlRedirect na hodnotu false:

$wgAccessControlRedirect = false;

I když se dá přesměrování vypnout, vypínejte ho jen když je to nutné. Automatické přesměrování se nepoužívá proto, aby chránilo stránku.

  • Ani při vypnutém přesměrování se nepovolaný uživatel k chráněnému obsahu nedostane.
  • Přesměrování šetří čas a výkon webového serveru.
  • Je zbytečné aby server pokračoval ve zpracování obsahu stránky, je-li zřejmé, že uživatel na stránku nebude mít přístup. Anonymní uživatel "by default" má právo pouze na čtení obsahu veřejně přístupných stránek. Na stránkách chráněných přes AccessControl nemá co pohledávat.
  • Taky je zbytečné pokračovat v dalším zpracování obsahu stránky, pokud je zřejmé, že uživatel, přes to že je řádně přihlášený nemá k jejímu obsahu přístup (tedy ani právo ke čtení).

Pokud AccessControl zjistí, že uživatel nemá na stránku přístup, přeruší další zpracování původní stránky a okamžitě přesměruje na stránku MediaWiki:Deny_user, která by měla obsahovat pouze stručné sdělení, že se uživatel pokusil otevřít chráněnou stránku. To je z hlediska wiki nejrychlejší operace, protože se obsah téhle stránky nemění. Je to konečná stanice pro nejrůznější roboty, škodivce a dotěry. Proto vypínejte přesměrování, jen když je to nezbytně nutné.
Můžete si přesměrování dočasně vypnout třeba pokud vás zajímá jak rychle se zpracuje obsah stránky, nebo když potřebujete vidět kontrolní zprávy, které se generují jako komentáře do HTML kódu. Pokud byste přesměrování nevypnuli, tak byste viděli pouze to, co se týká zpracování cílové stránky MediaWiki:Deny_user.

$wgAdminCanReadAll

AccessControl je naprogramován tak, aby uživatelé s administrátorskými právy (skupina 'sysop') mohli v případě nouze pomáhat uživatelům, co se díky chybě v nastavení uživatelského seznamu odstřihli od vlastní stránky. Proto je výchozí hodnota této proměnné true.

Nicméně někomu takto benevolentní přístup nemusí vyhovovat. Obzvláště pokud má ve své wiki obsah, který má být přístupný jenom vybraným uživatelům. Proto zde existuje možnost tohle privilegované postavení administrátorů vypnout nastavením.

$wgAdminCanReadAll = false;

$wgAccessToHistory

Je na vás, jestli povolíte zobrazení historie stránky anonymním uživatelům, nebo ne. Osobně jsem toho názoru, že prohlížení historie stránky a změn wikikódu má být výsadou přihlášeného uživatele. Proto je výchozí nastavení false.

Přes historii se může uživatel dostat ke zobrazení rozdílových souborů. To je užitečné, pokud chceme umožnit aby si mohl uživatel udělat představu o změnách ke kterým došlo na stránce v průběhu času. Za určitých okolností by však mohlo při zobrazení rozdílových souborů dojít ke kompromitaci obsahu chráněné stránky.

Pokud tedy chcete zobrazování historie anonymním uživatelům povolit, udělejte na svojí MediaWiki důkladné testy, abyste měli jistotu, že nedojde touto cestou ke kompromitaci chráněného obsahu. Zobrazování historie a rozdílovách souborů povolíte nastavením:

$wgAccessToHistory = false;
Jestli má tahle wiki povoleno zobrazování historie nebo ne zjistíte klikem na tento odkaz. Pokud je zobrazování historie pro anonymní uživatele vypnuté, neuvidíte jako anonymní uživatel nic, pokud nebudete rovnou přesměrováni na stránku MediaWiki:Deny user.

$wgAccessControlNamespaces

Původně AccessControl hledal uživatelské seznamy pouze na stránkách v hlavním jmenném prostoru. Nová verze 3.x počítá s tím, že se stránky, které obsahují seznamy uživatelů mohou vyskytovat i jinde.

Tahle proměnná existuje především proto, aby nebylo nutné pokaždé psát jméno stránky s uživatelským seznamem včetně jmenného prostoru, ve kterém se nachází, v globální proměnné $wgAccessControlNamespaces, je pole (array), s číselnými identifikátory jmenných prostorů, ve kterých se AccessControl postupně pokusí vyhledat uživatelský seznam identifikovaný jménem stránky, pokud není uveden včetně jména uživatelského prostoru.

Při psaní jména uživatelského prostoru může snadno dojít k chybě. Obzvláště proto, že MediaWiki má tendenci nahrazovat kanonické názvy lokalizovanou verzí. AccessControl akceptuje oboje, ale doporučuji místo lokalizované verze jmenného prostoru preferovat kanonické jméno. Takže místo Uživatel: použijte radši User:.

Ve výchozím stavu se používají níže uvedené jmenné prostory. Ale můžete si přes LocalSetting.php nastavit jiné. Postupně se projdou všechny:

0 - NS_MAIN hlavní jmenný prostor, ze kterého se načítají stránky u kterých není jmenný prostor implicitně uveden
12 - NS_USER jmenný prostor pro uživatelské stránky; AccessControl předpokládá, že si každý bude chtít udržovat seznam uživatelů, kterým bude chránit přístup na svoje stránky udržovat v rámci vlastní uživatelské stránky.

Seznamy uživatelů

U nové verze může jako seznam uživatelů posloužit libovolná stránka, na které je použitý minimálně jeden parametr, na jehož základě lze získat seznam uživatelů.

Chráněná stránka je automaticky nedostupná anonymním uživatelům. Pokud chcete publikovat část jejího obsahu veřejně, přečtěte si, jak mít veřejný i privátní obsah na jedné stránce.
Pokud se s rozšířením AccessControl teprve seznamujete, nedělejte první pokusy s nastavením jako uživatel, který má administrátorská práva (skupina 'sysop') a také nevypínejte přesměrování! Ochráníte se tak před vlastní nepozorností a blbostí, jelikož vám AccessControl nedovolí uložit stránku, na kterou byste se znovu nemuseli dostat. Pokud se vám něco takového stane, přečtěte si co dělat, když se nemůžete dostat na stránku.

Správa uživatelů a skupin přes formulář

Od MediaWiki verze 1.23+ lze parametrizované šablony editovat díky rozšíření Page Forms, přes formuláře.

Původní syntaxe seznamu uživatelů

Nekategorizované uživatelské seznamy u wiki, která používala starou syntaxi se daly vyhledat pouze přes některé uživatelské jméno ze seznamu. Ovšem pokud se hledaný řetězec vyskytoval i na stránce, ke které neměl uživatel přístup, tak se k výsledkům vyhledávání nedostal. To sice pro AccessControl verze 3.0 neplatí, ale i tak je lepší místo tagu <a‌ccesscontrol> k ochraně obsahu stránky používat šablonu.

AccessControl verze 3.0 je od základu přepracovaný, nicméně kvůli zpětné kompatibility podporuje i původní syntaxi pro seznamy uživatelů, jaká se používala do verze ≤ 2.6.

Tato syntaxe používá jako seznam uživatelů stránku, na které se jméno každého uživatele, co má být členem skupiny, umístí na řádku, která začíná znakem pro odrážku (znak '*'). Za ním následuje mezera a teprve pak uživatelské jméno.

Pro testovacího uživatele se jménem TestUser tedy vypadá příslušný řádek takto:

* TestUser

Pokud má mít uživatel právo pouze na čtení obsahu, přidejte za jeho jméno řetězec (ro):

* TestUser (ro)

Takto vytvořený seznam uživatelů je obyčejná wiki stránka, která sama o sobě žádným způsobem chráněna není.

AccessControl však umožňuje, aby se stránka ochránila sama. Takže pokud chcete udělat a vyzkoušet takový seznam ze stránky test-page, měl by vypadat její obsah takto. Pouze s tím rozdílem, že místo jména testovacího uživatele TestUser použijete své uživatelské jméno.

* TestUser
<a‌ccesscontrol>test-page</a‌ccesscontrol>
[‌[Category:AccessLists]‌]
Kategorizace uživatelských seznamů tohoto typu je nutná proto, že se z hlediska obsahu neliší od běžné wiki stránky a tím pádem je není snadné dodatečně vyhledat.

Uzamčení stránky pomocí standardního mechanismu MediaWiki

Kupodivu některé uživatele rozšíření AccessControl nikdy nenapadlo, že by mohla být stránka chráněna sama sebou. Většinou se pokoušeli vyřešit ochranu seznamů uživatelů jinými, někdy zcela nesmyslnými způsoby.

Jsou však situace, kdy je lepší zvolit jinou ochranu stránky než přes AccessControl.

Jedním z nástrojů, jakým MediaWiki čelí vandalismu, je zamykání stránek. Ovšem tuhle výsadu mají pouze administrátoři, uživatelé ze skupiny 'sysop', která disponuje právo k zablokování editace stránky (block). Pokud uživatel mezi ně nepatří, tak tímto způsobem stránku chránit nemůže.

Jsou ovšem situace, kdy je lepší preventivně možnost editace stránky omezit. Typicky v případě šablony. Prostřednictvím hojně používané šablony, lze totiž zneužitím rozšíření AccessControl zakázat přístup všem uživatelům. Proto je vhodné její obsah preventivně uzamknout ('protect'). Její obsah bude dál veřejně přístupný, ovšem měnit její kód bude moci jen ten, kdo bude mít rovněž adminstrátorská práva ('sysop').

Ostatně, změny obsahu šablony by se měly testovat na jiné, testovací šabloně a teprve po jejich důkladném otestování kopírovat do šablony, která se již používá.

Umístěním stránky do vyhrazeného jmenného prostoru

Kromě standardních jmenných prostorů, si můžete nadefinovat v rámci konfiguračního souboru LocalSettings.php i své vlastní jmenné prostory. Dají se využít mnoha způsoby. A mimo jiné se dá u nich nastavením proměnné $wgNamespaceProtection upravit přístupová práva tak, aby kupř. na editaci stránek v tomto jmenném prostoru měly právo jen vybrané skupiny uživatelů MediaWiki.

Následující ukázkový kód demonstruje, jak si můžete vytvořit vlastní jmenný prostor NS_PRIVATE s ID 1234, ve kterému by mohli dělat změny pouze uživatelé s přiděleným právem userrights (což jsou ve výchozím stavu pouze byrokraté):

define("NS_PRIVATE", 1234);
$wgExtraNamespaces = 
    array(NS_PRIVATE => "private"
    );
$wgNamespaceProtection[NS_PRIVATE] = array( 'userrights' );

Pokud chcete takovým způsobem omezit práva u jiných, již existujících jmenných prostorů, stačí pouze změnit výchozí nastavení jmenného prostoru.

Vytvořte skupinu

Testy

Každý, kdo chce svoje stránky chránit přes rozšíření AccessControl, by měl znát způsoby, jimiž se lze dostat ke chráněnému obsahu MediaWiki, pokud je někde chyba.

Pokud máte tuhle stránku naimportovanou vlastní instance MediaWiki, můžete využít níže uvedené odkazy k testování.

Založte si stránku test-page a na ní si vyzkoušejte jak si nastavit ochranu stránky, jak se udělá uživatelský seznam, jak se s ním pracuje, a jak s jeho pomocí chránit jiné stránky. Je důležité abyste pochopili, jak to všechno funguje.

Dejte si pozor na to, abyste pro sebe na stránce test-page nastavili svoje jméno, protože jinak se vám stane, že se odstřihnete i od této stránky. Po skončení testů doporučuji její obsah vymazat, aby ji mohl k testování využít i někdo jiný.

Při testování vašich stránek doporučuji používat dva různé webové prohlížeče. Přes jeden přistupujte na stránku jako přihlášený uživatel, a přes ten druhý testujte paralelně anonymní přístup.

Pokud budete chtít zjistit co v průběhu zpracování stránky rozšíření AccessControl dělá, můžete využít debugovací zprávy připravené v kódu. Poznáte je podle toho, že za nimi na řádku následuje komentář s klíčovým slovem DEBUG.

Tyto zprávy svůj obsah vypisují do stránky přes funkci printDebug(). Na stránce nejsou vidět. Dostanete se k nim, jen když se podíváte do HTML kódu stránky.

Připravte se na to, že některé zprávy mohou vyvolat chybu PHP. Nemusíte si toho všímat. Po zakomentování kontrolního výpisu zase zmizí.

Pokud přijdete na nějaký další postup, který zde není uveden a by mohl vést k potenciální kompromitaci stránky, neváhejte a napište!

Vyhledávání

Za normálních okolností, vyhledání najde hledaný řetězec i na stránkách chráněných přes AccessControl. Pokud však uživatel nemá právo přistupovat k obsahu stránky, bude místo kontextu zobrazen náhradní text. A pokud se pokusí přejít na tuto stránku, bude automaticky přesměrován pryč.

Přístup k wiki kódu a historii stránky

Pokud nezměníte výchozí hodnotu konfigurační proměnné $wgAccessToHistory na true, tak se anonymní uživatel k historii stránky, byť není chráněna rozšířením AccessControl, nedostane. A nedostane se ani k jejímu wikikódu.

Jediná historie změn, u které je žádoucí zachovat přístup i pro anonymní uživatele, je na stránce Special:Recentchanges (historie posledních změn). Odkazy, přes které lze zobrazit rozdílové změny (diff) jsou pak buď neaktivní, nebo jsou při pokusu o zobrazení rozdílových změn, není-li vypnuto přesměrování přes proměnnou $wgAccessControlRedirect, přesměrováni na stránku MediaWiki:Deny user.

Je pouze na vás, jestli výchozí restriktivní přístup zmírníte, nebo ne. Na historii a obsah chráněných stránek se touto cestou nikdo nedostane. Nicméně opakované procházení historie a generování rozdílových stránek může zbytečně zatěžovat váš webový server – to je důvod, proč není zobrazování historie stránek, wiki kódu stránek a rozdílových souborů ve výchozím stavu povoleno. Pokud používáte AccessControl, můžete bez obav přístup k historii povolit. Jakmile dotěrný robot narazí na některou z chráněných stránek, bude okamžitě odklizen na informační stránku, která ukončí další procházení obsahu.

Dostane se anonymní uživatel ke zobrazení rozdílových změn?

To, můžete snadno a rychle zjistit. Tenhle odkaz vede na rozdílový soubor, který byl vytvořen při poslední úpravě hlavní stránky této wiki.

  1. přihlášený uživatel by se měl ke zobrazení rozdílů bez problému dostat
  2. anonymní uživatel by měl být přesměrován pryč
Pokud vám vrtá hlavou, jakým způsobem se dostalo do této stránky ID revize vaší hlavní stránky, tak jste právě narazili na tajemství kouzelných slůvek – Magic Words. Kód, který vygeneroval předchozí odkaz vypadá takto:
[[Special:Diff/{{REVISIONID:Main Page}}/next|tenhle odkaz, který zobrazí rozdílový soubor k poslední úpravě hlavní stránky této wiki]]

Je zde povolen přístup ke speciální stránce, která zobrazuje rozdíly v obsahu stránek?

Od MediaWiki 1.23+ je k dispozici speciální stránka, přes kterou si lze zobrazit obarvený výstup, podobný jako vrací utilita diff, pro libovolnou revizi obsahu.

Je-li tahle stránka dostupná zde, zjistíte přes tento link: Special:Diff.

  1. Pokud není zakázán přístup na stránku Special:Diff (viz výše, doporučené nastavení konfiguračního souboru LocalSettings.php), zobrazí se formulář, do kterého lze zadat ID libovolné revize.
  2. Pokud je zakázán přístup na stránku Special:Diff, bude anonymní uživatel přesměrován pryč, resp. mu MediaWiki sdělí, že žádná taková stránka neexistuje.

Zobrazení wikikódu stránky

Zobrazení zdrojového kódu stránky je pro anonymní uživatele povoleno pouze, je-li proměnná $wgAccessToHistory nastavena na hodnotu true. Pak můžete na stránkách použít následující formát odkazu, kterým se anonymnímu uživateli zobrazí editační okno stránky s jejím wikikódem, ovšem bez možnosti editace obsahu.

Pokud bude editace obsahu možná, máte nejspíš chybu v konfiguraci souboru LocalSettings.php.

Zobrazení wiki kódu nechráněné Hlavní stránky (Main Page)

Chcete-li umožnit anonymním uživatelům aby si mohli kopírovat obsah stránek vaší wiki do vlastní instance MediaWiki, můžete jim pomoci tak, že přidáte na své stránce odkaz na příslušnou stránku v následující formě:

https://www.thewoodcraft.org/wiki/index.php?title=Main_Page&action=edit

Pokud je povoleno zobrazování historie a kódu nechráněných stránek. tak se jim po kliku na tento odkaz, otevře editační okno s wiki kódem stránky (v read-only módu), ze kterého si jej mohou zkopírovat.

Zobrazení konkrétní verze obsahu nechráněné stránky

I odkazování na konkrétní starší verzi stránky je závislé na nastavení proměnné $wgAccessToHistory. Pokud chcete odkazovat na konkrétní revize obsahu, musí být její hodnota true. Při volání stránky musíte uvést také číslo konkrétní revize:

https://www.thewoodcraft.org/wiki/index.php?title=Main_Page&oldid=6799

Při volání konkrétní revize přes parametr "oldid" vůbec nezáleží na názvu stránky, předávaném v parametru "title" – rozhodující je číslo revize.

Jak otestuji, že moje stránky chrání AccessControl?

Následující série testů předpokládá, že již máte v této wiki vytvořenou testovací stránku test-page, na kterém jste se učili, jakým způsobem nastavit ochranu stránky. Pro následující test by měla být stránka test-page nastavená jako self-protect.

Přímý přístup

https://www.thewoodcraft.org/wiki/index.php/test-page
Oprávněnému uživateli se stránka zobrazí. Každý jiný bude přesměrován pryč.

Přístup přes akci "view"

https://www.thewoodcraft.org/wiki/index.php?title=test-page&action=view
Oprávněnému uživateli se stránka zobrazí. Každý jiný bude přesměrován pryč.

Přístup přes akci "edit"

https://www.thewoodcraft.org/wiki/index.php?title=test-page&action=edit
Oprávněnému uživateli se zobrazí editační okno stránky s jejím wiki kódem. Každý jiný bude přesměrován pryč.

Přístup přes akci "history"

https://www.thewoodcraft.org/wiki/index.php?title=test-page&action=history
Oprávněnému uživateli se zobrazí historie chráněné stránky. Každý jiný bude přesměrován pryč.

Přístup na prohlížení revizí přes "action" (view)

https://www.thewoodcraft.org/wiki/index.php?title=test-page&action=view&oldid=95418
Oprávněný uživatel může procházet historií revizí. Každý jiný bude přesměrován pryč

Přístup k prohlížení revizí stránky přes "direction"

https://www.thewoodcraft.org/wiki/index.php?title=test-page&direction=prev&oldid=95418
Oprávněný uživatel může procházet historií revizí. Každý jiný bude přesměrován pryč.

Přístup ke zobrazení rozdílové stránky pro poslední revizi stránky přes "diff"

https://www.thewoodcraft.org/wiki/index.php?title=test-page&diff=prev&oldid=95418
Oprávněný uživatel uvidí aktuální rozdíl v obsahu stránky test-page při poslední revizí. Každý jiný bude přesměrován pryč.

Pak tuhle sadu testů zopakujte přihlášeni jako uživatel s právem na editaci stránky test-page.

A potom znovu tuhle sadu testů, ovšem přihlášeni jako uživatel, který sice nemá právo zasahovat do obsahu stránky test-page, ale může si ho číst.

Doporučuji vyzkoušet tuhle sérii testů pro situaci, že je self-protect stránky test-page nastaven:
  • pomocí parametrizované šablony
  • s využitím staré syntaxe a tagu <a‌ccesscontrol>
  • s využitím šablony s řetězcem accesscontrol v názvu

Taky si vyzkoušejte, jaký bude výsledek těchto testů v situaci, kdy je stránka test-page chráněna přes stránku jinou. Zkuste:

  • použít seznam umístěný v hlavním jmenném prostoru (identifikovaný pouze názvem stránky)
  • použít seznam, který bude umístěn v jiném jmenném prostoru, nastaveném v proměnné $wgAccessControlNamespaces
  • použít seznam, který bude v parametru šablony uveden včetně názvu jmenného prostoru

Test přístupu ke chráněnému obsahu přes REDIRECT

Přesměrování je základní funkcionalita MediaWiki, která umožňuje přistupovat na stránku přes jiné, alternativní názvy. V podstatě jde o mechanismus podobný transkluzi[3], rozdíl je pouze v tom, že z obsahu na který cílová stránka přes odkazuje rovnou generuje obsah. U starších verzí rošíření AccessControl bylo možné tímto způsobem obejít ochranu stránky.

Vytvořte si tedy stránku s následujícím obsahem a pak vykoušejte, zda-li se přes ni dostanete jako neoprávěný uživatel na stránku test-page, nebo ne.

#REDIRECT [[test-page]]

Test přístupu ke chráněnému obsahu přes transkluzi

Vložení chráněné stránky

Pokud vložíte do jiné stránky stránku, která má obsah chráněný přes AccessControl, měly by pro ni automaticky platit stejná práva jako u vložené stránky. Pokud to takhle nefunguje, je to chyba!

Vložení stránky z hlavního jmenného prostoru vypadá takto:

{‌{:test-page}‌}

Pokud vkládáte stránku z jiného jmenného prostoru, musíte uvést jeho jméno. I když je možné používat i lokalizované názvy jmenných prostorů, používejte pokud možno kanonické jméno jmenného prostoru, odvozené z angličtiny.

{‌{:User:TestUser}‌}

Vložení chráněné šablony

Transkluze chráněné šablony probíhá (a vypadá) podobně, jako transkluze stránky z hlavního jmenného prostoru. Rozdíl je pouze v tom, že pokud nepoužijete před názvem stránky test-page dvojtečku, bude systém MediaWiki automaticky předpokládat, že jde o stránku ze jmenného prostoru Šablona (Template):

{‌{test-page}‌}

Pokud by šlo o šablonu, která by byla nějakým způsobem chráněná přes AccessControl, tak se může stránka, do níž je šablona vložena, chovat různě.

Vícenásobná transkluze

Vícenásobná transkluze může za určitých okolností vést k tomu, že se pak na stránku nedostane nikdo – ani administrátor ('sysop')! Bohužel nelze k tomu říct nic konkrétního, protože se mi to stalo pouze jednou, při testování během vývoje, takže je dost dobře možné, že příčina byla dávno odstraněna.

Nicméně vícenásobná transkluze funguje i u chráněných stránek, ale moc ji nedoporučuji. Při zřetězení většího počtu chráněných stránek, stačí k odstřižení uživatele (případně celé skupiny) drobná změna práv u některé mezilehlé stránky.

Protected - Include - Include
Protected - Changed x Not access

Pozor na rozšíření Labeled Section Transclusion

Labeled Section Transclusion je v kombinaci s rozšířením DynamicPageList3 či SubPageList skvělý nástroj na tvorbu šablon generujících dynamický obsah stránek. Ale pozor na jeho zneužití!

Zneužití nehrozí ze strany anonymních uživatelů, protože nemají právo na editaci stránky. Riziko hrozí pouze se strany přihlášeného uživatele.

Ovšem zas tak jednoduché to není. V podstatě jde o zneužití stejného mechanismu, jakým lze spravovat na jedné stránce soukromý i veřejný obsah.

Pro získání chráněného obsahu stránky by musel útočník znát nejenom jméno chráněné stránky, ale také jméno nechráněné sekce. Pravděpodobnost zneužití je tedy velmi malá, nicméně existuje.

Posuzujte pečlivě každého, kdo má zájem o úživatelský účet na vaší wiki. Ten kdo má skutečný zájem o spolupráci by měl mít pro vás pochopení. Ostatně, je mnohem lepší být ostražitý než dodatečně řešit rozsáhlé škody.

Test, zdali se dá obsah chráněné stránky získat exportem

Pro usnadnění sdílení obsahu má MediaWiki k dispozici speciální stránku Special:Export přes kterou lze vyexportovat obsah wiki stránky, včetně historie a vložených šablon do XML souboru. Obsah tohoto souboru pak lze naimportovat do jiné instance MediaWiki přes speciální stránku Special:Import.

Je to užitečný mechanismus, který umožňuje přenášet hotové šablony i manuálové stránky. Bohužel pro wiki s chráněným obsahem představuje určité riziko, pokud má právo k exportu každý přihlášený uživatel.

I ochranu u starší verze rozšíření AccessControl bylo možné tímto způsobem obejít. U verze 3.0 je tomu ale jinak.

  • Stránka se přeskočí pokud uživatel na stránku přístup nemá.
  • Pokud má read-only přístup, tak se vyexportuje pouze aktuální verze stránky.
  • Kompletní export, včetně historie změn je přístupný pouze uživatelům s právem k editaci.
Import stránky není nutné řešit, přesto, že je možné importem upraveného souboru možné změnit obsah stránky. Jenže to by musela být stránka před importem odstraněna. A pro uživatele který by tohle mohl udělat není problém data změnit jinou, méně komplikovanou cestou.

Tipy

Nepoužívejte v parametrech které zpracovává rozšíření AccessControl šablony!

Pokud vás napadlo, že byste místo jména uživatele, nebo uživatelské skupiny použili šablonu, tak si uvědomte, že AccessControl pracuje s neinterpretovaným wiki kódem stránky, takže se pokusí vyhodnotit jako jméno řetězec znaků a ne až výsledek transkluze, jak byste očekávali. Viz příklad:

<a‌ccesscontrol>{‌{‌{nobody}‌}‌}</a‌ccesscontrol>

V tomto konkrétním případě by se AccessControl pokusil vyhledat uživatele, jehož jméno by odpovídalo řetězci ‌{{‌{nobody}}}, což je nonsens. Takový uživatel určitě existovat nebude. A u parametrizované šablony by mohl být výsledek zcela nepředvídatelný, takže si ani netroufám domýšlet co by se vlastně AccessControl pokusil vyhledat. Jisté je pouze to, že to nejspíš existovat nebude, protože MediaWiki takové řetězce v názvu stránky neakceptuje.

Když je uvedena jako seznam uživatelů neexistující stránka ( skupina ) nebo neplatné uživatelské jméno

Pokud máte svoji instanci wiki nastavenou jako case-sensitive, tak se může velice snadno stát, že omylem napíšete uživatelské jméno, či jméno stránky se skupinou uživatelů špatně. Stačí zaměnit, přidat, nebo vynechat jedno písmeno a jste v háji.

Pokud se vám něco takového stalo, přečtěte si co dělat když se nemůžete dostat na stránku.

Nekopírujte slepě kód z těchto stránek!

  • Ukázkový wikikód z příkladů na této stránce samozřejmě můžete použít i na vlastní wiki – a v některých případech je to i výslovně doporučeno. ale v žádném případě nekopírujte kód z této stránky metodou copy & paste!. Čekalo by vás totiž nemilé překvapení.
  • Aby tahle stránka mohla být veřejně přístupná i na wiki co již používá AccessControl, byla do řetězců, které by za normálních okolností AccessControl vyhodnotil jako ochraný prvek stránky, doplněna neviditelná mezera s nulovou šířkou.(U+200C znak ZERO WIDTH NON-JOINER &‌#8204;). Jde o netisknutelný znak, který nevidíte ale z hlediska PHP jde o regulérní znak, který zabraňuje nežádoucí interpretaci řetězců ať již na straně serveru (parametry pro AccessControl), nebo na straně prohlížeče (HTML entity).
Pokud byste zkopírovali řetězec s neviditelnou mezerou, tak byste pak marně pátrali, proč vám rozšíření AccessControl nefunguje tak jak má!

Stránka chráněná šablonou s řetězcem accesscontrol v názvu není uživatelský seznam!

Je to použitelné řešení, pokud jednu stránku mezi sebou sdílí pár uživatelů, nebo pokud bychom chtěli mít k dispozici šablonu, pro dočasné omezení přístupu k obsahu stránky. Stačí do prvního parametru šablony nasázet uživatelská jména a hotovo. A pokud chcete, můžete mezi nimi použít i jméno seznamu uživatelů. Kupříkladu uživatelé ze seznamu na stránce Čtenáři by v tomto případě sice nemohli obsah stránky test-page měnit, nicméně by ho mohli stránku číst a sledovat její změny.

Pokud se ale pokusíte takovou stránku test-page použít jako uživatelský seznam, tak se odříznete! AccessControl se z ní sice pokusí vydolovat seznam oprávněných uživatelů – ovšem to se mu podaří jen za předpokladu, že alespoň část obsahu stránky bude odpovídat původní syntaxi uživatelských seznamů. Pokud se vrátí jen prázdný seznam, tak vám AccessControl přístup odepře a přesměruje pryč.

Když se nemůžete dostat na stránku

Nepanikařte!

Pokud jste omylem vyřadili ze sezamu uživatelů oprávěných k editaci stránky svoje jméno a znáte jiného uživatele, který má k editaci stránky povolen přístup, můžete ho zkusit požádat aby vaši chybu napravil a opět vás do seznamu přidal.

Pokud nikoho takového neznáte a žádný jiný uživatel na stránku přístup nemá, musíte požádat o pomoc některého uživatele, co má administrátorská práva ('sysop').

Ten vám ale nepomůže, pokud je privilegované postavení této skupiny uživatelů je přes $wgAdminCanReadAll zakázáno, nebo pokud se vám stane, že podařilo zablokovat přístup ke stránce takovým způsobem, že se na ni nedostane ani administrátor (uživatel ve skupině 'sysop'). Taková situace může nastat např. v případě vícenásobné transkluze.

Pak máte pouze jedinou možnost.

Pokud nemáte přístup ke konfiguračnímu souboru LocalSettings.php, musíte požádat toho kdo takový přístup má, aby dočasně rozšíření AccessControl deaktivoval, abyste mohli opravit vadný záznam, nebo aby ho opravil za vás – nejjednodušší a nejrychlejší je, obsah stránky kompletně smazat. Vy si ho pak můžete vydolovat z předchozí revize a jemu to zkrátí na minimum čas potřebný k vyřešení vašeho problému.

Uvědomte si, že po dobu kdy není rozšíření AccessControl aktivní může každý uživatel číst obsah stránek, které jím mají být chráněny! Proto je žádoucí problém vyřešit co nejrychleji a ihned poté rozšíření AccessControl opět zapnout.

Dělejte přes uložením stránky náhledy

Pokud uděláte před uložením obsahu stránky co se má chránit přes AccessControl náhled. Tak v případě, že jste nevypnuli přesměrování ($wgAccessControlRedirect) a nepatříte do skupiny 'sysop', dojde okamžitě k přesměrování, které vám zabrání v uložení změn.

To vás ochrání před tím, abyste se "odřízli" od stránky v případě, že byste zapoměli povolit přístup k editaci obsahu stránky sobě.

Využití MediaWiki k soukromé komunikaci

MediaWiki může nahradit e-mailovou konferenci.

Pokud chce skupina uživatelů mezi sebou diskutovat bez účasti veřejnosti, stačí aby si "uzamkla" pro sebe diskuzní stránku k nějaké stránce. Stránka může obsahovat veřejný obsah k tématu diskuze a na chráněné diskuzní stránce mohou paralelně debatovat.

Stačí, aby měl uživatel nastavené sledování této diskuzní stránky. Pokud se změní její obsah, uvidí v záhlaví upozornění.

Jen na něm záleží bude-li chtít dostávat také notifikace o změnách přes e-mail.

Veřejný i neveřejný obsah na jedné stránce

AccessControl vždy chrání celou stránku a to napříč stránkami do kterých je chráněná stránka vložená prostřednictvím transkluze[3], ale pokud máte nainstalované rozšíření Labeled Section Transclusion existuje způsob jak vystavit obsah chráněné stránky tak, aby byl veřejně dostupný.

Pokud máte tenhle manuál naimportovaný do své instance MediaWiki, která má k dispozici rozšíření Labeled Section Transclusion, můžete si to vyzkoušet u testovací stránky test-page.

  1. Nastavte si stránku test-page tak, aby byla chráněná přes AccessControl.
  2. A pod šablonu, či tag, kterým bude chráněna přidejte novou sekci, pojmenovanou PUBLIC.
  3. Do ní umístěte obsah, který budete chtít publikovat bez ochrany.

Veškerý obsah této sekce (včetně podsekcí) pak nabídnete přes jinou, nechráněnou stránku, do které vložíte následující kód:

{‌{#lsth:test-page|PUBLIC}‌}

Podobným způsobem můžete dokonce v rámci jedné stránky spravovat obsah sdílený mezi různé skupiny uživatelů. Pro AccessControl je totiž rozhodující oprávnění, které se vyskytne na stránce jako poslední. Každou sekci lze tedy chránit samostatně a pokud bude na samém konci stránky oprávnění, které vás nechá stránku editovat, můžete je spravovat všechny najednou.

Jejich obsah pak můžete publikovat podobným způsobem jako stránku pro anonymní uživatele.

Ochrání AccessControl stránky při použití DPL?

Rozšíření link|accesscontrol-lsth se využívá u šablon, které generují automaticky obsah stránky[6]. Kompromitace obsahu hrozí podobně jako u rozšíření Labeled Section Transclusion, ale jen v případě, že je citlivý obsah umístěn v sekci, kterou lze vytáhnout přes její název. Při natažení obsahu, který bude obsahovat kód, co si AccessControl vyloží jako ochranný prvek, bude automaticky chráněn veškerý vygenerovaný obsah.

To pochopitelně může být kontraproduktivní, pokud někdo umístí chráněnou stránku do kategorie, ze které se obsah generuje. Používejte proto důsledně při psaní perexů a anotací tagy <section>, které umožní ze stránky publikovat pouze to co chcete.

Historie verzí rozšíření AccessControl

Verze 1.0

První verze rozšíření AccessControl (1.x) vznikla jako vylepšená alternativa k rozšíření Group Based Access Control pro MediaWiki verze 1.12.x

Verze 1.1 až 1.3

Tyto verze fungovaly u MediaWiki ≤ 1.17. Od května 2012 se stal kód rozšíření součástí oficiálního git repozitáře MediaWiki.

  • Od pozdějších verzí se lišily tím, že akceptovaly také skupiny MediaWiki, ovšem pouze v kanonické formě. Tj. muselo se použít 'sysop', místo 'Správce'.
  • A tag <accesscontrol> se mohl na stránce objevit i vícekrát.
  • Také již bylo možné použít proměnnou $wgAdminCanReadAll

Verze 2.0 a 2.2

MediaWiki verze 1.18, sebou přinesla změny, kvůli nimž bylo nutné rozšíření přepsat. Byl odstraněn nevyužívaný kód a protože u tahle verze již neakceptovala standardní skupiny MediaWiki, bylo navýšeno hlavní číslo verze na 2.0.

Pro tuto verzi, byly uvolněny dvě subverze a byla použitelná až do MediaWiki verze 1.20

S těmito verzemi se ale táhnul i nepříjemný problém. Pokud se při vyhledávání na stránkách MediaWiki našel hledaný řetězec i na chráněné stránce, tak se na stránce objevila chyba a neoprávněný (anonymní) uživatel se tak nedostal k výsledkům vůbec. Uspokojivě vyřešila tenhle problém až verze 3.0.

Verze 2.2

Protože se od MediaWiki verze ≥ 1.21 začal používat nový framework ContentHandler, který umožňuje měnit typ wiki stránky podle obsahu, bylo nutné kód rozšíření upravit, aby mohl dál fungovat.

Výsledkem byl AccessControl verze 2.2, uvolněný v říjnu 2013 a tahle úprava kódu prodloužila použitelnost verze 2.x až k současným verzím MediaWiki.

Verze 2.5

V srpnu 2015 byla uvolněna verze 2.5, u které se nově objevila proměnná $wgAccessControlRedirect. Díky ní bylo možné neoprávněného uživatele přesměrovat na informační stránku, na které se dozvěděl, že se pokusil dostat ke chráněnému stránku.

Tahle úprava sebou ale přinesla jiný efekt, již zmíněný výše a to, že se tím významně ušetřila práce webovému serveru, protože mohl indexovacím robotům nabídnout náhradní obsah.

Tato verze byla poslední, kterou se podařilo dostat do oficiálního repozitáře MediaWiki a fungovala, dokud do ní Siebrand Mazeland neposlal změny, které sice měly umožnit registraci tohoto rozšíření přes funkci $wfLoadExtensions(), ale znemožnily jeho fungování pro starší verze MediaWiki < 1.25

Jako maintaner rozšíření AccessControl jsem tomu nemohl zabránit, protože mi v té době již nefungovalo přihlašování do Gerritu. Nemohl jsem tedy změny odmítnout a vynutit si kód, který by umožnil používat oba způsoby registrace, jako to umožňují jiná rozšíření.

Verze 2.5.1

Tahle verze implementovala novou proměnnou $wgAccessToHistory, která měla umožnit anonymním uživatelům přístup k historii a wikikódu nechráněných stránek. Byla uvolněna na konci února 2016, ale díky nekompatibilnímu kódu, který prošel do oficiálního repozitáře rozšíření, se do něj nikdy nedostala.

Verze 2.6

Jádro kódu je u verze 2.6 stejné jako verze 2.5, ale kvůli registraci přes $wfLoadExtensions() vyžaduje MediaWiki ≥ 2.5

Verze z Hackatonu 2019

Ve dnech 17.–20. května 2019 se konal v Praze (Česká republika) Wikimedia Hackaton 2019. Těsně před touto akcí mne kontaktoval Nicolas Nallet, jestli bychom se při této příležitosti nesetkali, abychom mohli společně rozšíření AccessControl vylepšit.

Sešli jsme se a Nicolas přišel s nápadem, jak by se dalo efektivně při práci s uživatelským seznamem využívat rozšíření Page Forms. Výsledkem byl rozšířený kód, na kterém mohl Nicolas provést první testy již během Hackatonu. Nicméně tou dobou jsem byl již rozhodnut, kód rozšíření radikálně předělat.

Verze 3.0

Beta verze rozšíření byla hotova asi týden. A přesně měsíc po konci Hackatonu 2019 byla uvolněna a nabídnuta k testování pre-release verze.

Vydání finální verze bylo spojeno s dokončením této uživatelské dokumentace, protože kód byl kompletně přepsaný a přináší řadu novinek.

Doporučená a osvědčená rozšíření

AccessControl je rozšíření, které nemá žádné závislosti. Nicméně vřele doporučuji, aby ve vaší wiki nechyběla následující sada rozšíření, která vám umožní v prostředí MediaWiki programovat sofistikované šablony s využitím wiki kódu.

Není důvod pro jednoduché šablony instalovat Scribunto a programovat v Lua!

DynamicPageList3
Sofistikované rozšíření, které umožňuje generovat pomocí šablony dynamický obsah stránek.
Labeled Section Transclusion
Umožňuje vytahovat z obsahu stránek vybrané sekce
Loops
Umožňuje používat v šablonách smyčky.
MyVariable
Přidává několik užitečných kouzelných slůvek, s nimiž lze dále pracovat v šablonách.
Page Forms
Umožňuje spravovat seznamy uživatelů s nimiž pracuje AccessControl prostřednictvím formulářů.
ParserFunctions
Nabízí širokou paletu funkcí, které umožňují sofistikované naprogramování šablony.
SubPageList
Umožňuje vylistovat podstránky jako seznam, který lze dále zpracovávat pomocí funkcí, které nabízí rozšíření ParserFunctions, smyček, aj.
Translate
Rozšíření pro překlady obsahu pro multijazyčné wiki
Variables
Umožňuje v šablonách definovat a používat proměnné.

Zmíněná rozšíření

DisableSpecialPages
Neudržované rozšíření, které umožňovalo vypnout speciální stránky. Zde je uvedeno alternativní řešení pomocí vlastní funkce.
Scribunto
Rozšíření, které umožňuje programovat moduly v jazyce Lua

Reference

  1. Charakteristickým rysem CMS (zkratka z angl. "Content Management System") systémů pro správu obsahu jsou mechanismy, které pracují s širokou škálou nastavení uživatelských práv.
  2. 3,0 3,1 3,2 Transkluzi lze v podstatě považovat za elektronickou verzi kompilace, kdy se obsah jednoho dokumentu sestavuje z dokumentů jiných. Pojem jako takový (transclusion) je novotvar, který údajně vymyslel americký sociolog, filozof a průkopník informačních technologií Ted Nelson viz internetový článek Web, který nebyl z r. 2018 (autor: Jan Vlnas)
  3. Pokud bude mít vaše instance wiki nainstalovaná doporučená rozšíření, bude možné, abyste pomocí šablon realizovali co vás napadne.
  4. Tohle je důležitý bod. Ani zkušeným programátorům MediaWiki na první dobrou nedocvakne, že AccessControl přináší jen minimální zvýšení nároků na výkon webového serveru. Pokud stránka ochranu nemá, nedělá AccessControl nic. A pokud ochranu má, pokračuje ve zpracování stránky jen pokud nalezne aktuálního uživatele v některé z položek parametrizované šablony, nebo v seznamu oprávněných uživatelů. To proběhne zpravidla dřív, než MediaWiki vrátí nějaký HTML kód. A pokud uživatel nemá právo přistupovat k obsahu chráněné stránky je ihned přesměrován na výchozí stránku s upozorněním, že se pokouší přistupovat na stránku která je chráněná přes AccessControl. To znamená, že pokud není zrovna vypnuto přesměrování ($wgAccessControlRedirect má hodnotu false) je další zpracování obsahu původní stránky přerušeno.
  5. Veškerý obsah hlavní stránky webu TheWoodcraft.Org se generuje přes parametrizovanou šablonu Template:content. Pokud chcete, můžete ji použít i vy.

Kotvy použité na stránce

Kotva Popis
accesscontrol-accesslist Seznamy oprávěných uživatelů a jejich použití
accesscontrol-deny Co dělat, když jste si zablokovali přístup na stránku
accesscontrol-dpl Bezpečnostní rizika při použití rozšíření DynamicPageList3
accesscontrol-export Pasáž věnovaná omezení při exportu dat z MediaWiki
accesscontrol-history Odkaz na historický přehled vývoje rozšíření AccessControl
accesscontrol-info Pasáž věnovaná stránce MediaWiki:Deny user
accesscontrol-install Kotva na kapitolu k instalaci rozšíření
accesscontrol-lsth Bezpečnostní rizika při použití rozšíření Labeled Section Transclusion
accesscontrol-old-syntax Kapitola věnovaná původní syntaxi seznamů uživatelů
accesscontrol-tag Původní systém ochrany stránek, s využitím tagu <a‌ccesscontrol>
accesscontrol-test Testování ochrany na testovací stránce test-page
accesscontrol-template-options Ochrana stránky parametrizovanou šablonou
accesscontrol-template-name Ochrana stránky šablonou s řetězcem accesscontrol v názvu (alternativa za tag <a‌ccesscontrol>)
config-basic Výchozí konfigurace wiki před instalací rozšíření AccessControl
config-extension-rights Preventivní omezení práv, která sebou tahají rozšíření
config-extra Omezení přístupu ke speciálním stránkám
how-accesscontrol-detect Odkaz na pasáž, kde se píše jak detekuje chráněný obsah
how-accesscontrol-work Odkaz na pasáž, kde se rozebírá jakým způsobem se kontroluje obsah stránky
mediawiki-groups Uživatelské skupiny mediawiki
mediawiki-preview Doporučený postup při uložení změn po editaci stránky s chráněným obsahem
namespace-private Kdy má smysl zakládání vlastních jmenných prostorů a jak k nim nastavit v souboru LocalSettings.php přístupová správa jen pro vybrané skupiny uživatelů.
mediawiki-private-channel Jak využívat ochrany stránek přes AccessControl k privátní komunikaci.
not-accesslist Upozornění, že chování pojmenované šablony je jiné, než u šablony, co používá options
only-example-code Varování před bezduchým kopírováním kódu
option-template Varování před použitím šablony místo jména uživatele, či seznamu uživatelů
page-lock Zamykání stránek. Kdy a kde ho použít.
public-and-private Postup jak míchat na jedné stránce soukromý a veřejný obsah.
template-atack Jak lze napadnout wiki zneužitím parametru rozšíření AccessControl.
template-is-better Proč je lepší používat šablonu, nežli tag <a‌ccesscontrol>
template-tag-difference Rozdíl ve zpracování řetězců předávaných přes parametry šablony a zpracováním obsahu prvního atributu u šablony s řetězcem a‌ccesscontrol v názvu (totéž platí i ohledně zpracování obsahu tagu <a‌ccesscontrol>