AccessControl
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.
- AccessControl umožňuje aby v rámci jedné instance MediaWiki mohl existovat veřejně dostupný obsah, i privátní stránky. V tomto manuálu najdete návod, jak udržovat veřejný i neveřejný obsah v rámci jedné stránky.
- AccessControl umožňuje, aby sami autoři obsahu rozhodovali o tom, kdo bude mít možnost zasahovat do obsahu stránky na které pracují. A tuhle ochranu stránky mohou kdykoliv jednoduchým způsobem zapnout, nebo naopak vypnout.
- I když je AccessControl založen na kontrole obsahu stránky, nepřináší z hlediska výkonu zvýšenou zátěž webového serveru. Spíš naopak. Obsah stránky kontroluje ještě před zpracováním do HTML kódu a jeho odesláním na stranu webového prohlížeče klienta. Pokud nemá uživatel na chráněnou stránku přístup, je ihned přesměrován.
- AccessControl je naprogramován tak, aby nešlo žádným doposud známým způsobem získat obsah chráněné stránky, takže wiki může obsahovat i důvěrný obsah. Umí ošetřit i situace, pro které standardní MediaWiki žádné jiné bezpečnostní mechanismy nemá.
- Chráněné stránky lze v kombinaci s dalšími možnostmi, které nabízí MediaWiki a její rozšíření, využívat jako skvělý prostředek k privátní komunikaci, kdy si uživatel sám rozhoduje, co bude sledovat a jakým způsobem má být o novinkách informován.
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.
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čí.
- Anonymní uživatel žádnou skupinu práv, na kterou by bylo možné aplikovat nějaká pravidla nemá, takže veškerý obsah wiki (nebo vyhrazeného jmenného prostoru) by musel být vyhrazen jen pro přihlášené uživatelé s přiřazenou skupinou. Ale jinak by se na něj nikdo jiný nedostal. Ovšem existují metody, jakými se dá u wiki co nepoužívá AccessControl k neveřejnému obsahu dostat.
- 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;
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í
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á:
- Naklonujte z git repozitáře, nebo vybalte ze staženého tarballu, zdrojové kódy do adresáře
extensions/AccessControl/
vaší instance MediaWiki. - 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ý:
<accesscontrol>
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 }}
Rozdíl mezi parametrem a atributem
Tohle není atribut identifikovaný parametrem!
{{template | editAllowedUsers TestUser }}
Tohle je parametr. Za parametrem následuje znak =
a po něm seznam jmen uživatelů, resp. skupin uživatelů.
{{template | editAllowedUsers = 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
- readOnlyAllowedUsers – seznam uživatelů co mohou obsah stránek pouze číst
- editAllowedGroups – skupiny uživatelů s právem k editaci
- readOnlyAllowedGroups – skupiny uživatelů pouze s read-only přístupem
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.
… | editAllowedUsers = 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 …
<accescontrol>
, 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 <accescontrol>
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 | readOnlyAllowedGroups = groupB | editAllowedGroups = 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 accesscontrol | Tahle stránka žádný externí seznam nepoužívá, protože se chrání sama | editAllowedUsers = TestUser | Tohle je seznam uživatelů podle verze 3.0 }}
TestUser
. Nikdo jiný by se na ni nedostal.
Ochrana stránky pomocí tagu
<accesscontrol>
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 <accesscontrol>
.
Pokud použijete na stránce místo šablony párový tag <accesscontrol>
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.
<accesscontrol>Username</accesscontrol>
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.
<accesscontrol>Vaše uživatelské jméno, TestUser, Další uživatel</accesscontrol>
Nebo si můžete použít seznam uživatelů. Pokud si vytvoříte takový seznam na stránce test-page, bude to vypadat takto:
<accesscontrol>test-page</accesscontrol>
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
Ochrana stránek pomocí tagu <accesscontrol>
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:
- 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.
- 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č).
- Povšimněte si, odkazu Odkazuje sem (Whats link here) v menu nalevo. Ten vede na speciální stránku Special:Whatlinkshere.
- 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 <accesscontrol>
, 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 accesscontrol
. Pokud jí předáte jako první parametr původní obsah tagu <accesscontrol>
(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 <accesscontrol>
.
{{Template accesscontrol|Username}}
Pokud neexistuje šablona Template accesscontrol
, 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.
Jak probíhá kontrola?
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:
- Zkontroluje, zdali
test-page
není náhodou uživatelské jméno. - 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ů.
- 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énemtest-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.
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í).
$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;
$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ů.
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ů
<accesscontrol>
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 <accesscontrol>test-page</accesscontrol> [[Category:AccessLists]]
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.
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í.
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.
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.
- přihlášený uživatel by se měl ke zobrazení rozdílů bez problému dostat
- anonymní uživatel by měl být přesměrován pryč
[[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.
- 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. - 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=104563
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.
- pomocí parametrizované šablony
- s využitím staré syntaxe a tagu
<accesscontrol>
- 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.
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.
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:
<accesscontrol>{{{nobody}}}</accesscontrol>
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 ‌
). 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).
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.
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.
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.
- Nastavte si stránku test-page tak, aby byla chráněná přes AccessControl.
- A pod šablonu, či tag, kterým bude chráněna přidejte novou sekci, pojmenovanou
PUBLIC
. - 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
- Tahle verze již pracovala pouze s uživatelskými seznamy určenými ke zpracování přes Accesscontrol
- Na stránkách zpracovávala pouze první výskyt tagu accesscontrol
- A pokud jméno uživatele bylo na více než jednom seznamu, pak se použil automaticky ten co mu poskytoval vyšší práva (edit)
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
- ↑ 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.
- ↑ To je případ DCEWiki, která je zaregistrovaná na WikiApiary, ale na stránce, kterou vrací API má několik neplatných odkazů. Proto ji v přehledu webů co používají rozšíření AccessControl nenajdete i přes to, že ho používá.
- ↑ 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)
- ↑ Pokud bude mít vaše instance wiki nainstalovaná doporučená rozšíření, bude možné, abyste pomocí šablon realizovali co vás napadne.
- ↑ 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.
- ↑ 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 <accesscontrol>
|
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 <accesscontrol> )
|
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 <accesscontrol>
|
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 accesscontrol v názvu (totéž platí i ohledně zpracování obsahu tagu <accesscontrol>
|