Terug naar hoofdinhoud

Admin component in Joomla

13 juni 2026

Elke Joomla-site heeft een component genaamd com_admin. De meeste beheerders hebben nooit één van de bestanden geopend, en toch speelt deze kleine component een centrale rol. Het verzamelt de systeeminformatie die je in een forumbericht plakt wanneer je hulp nodig hebt.

Het rendert het Helpscherm. En, minder zichtbaar, het voert de daadwerkelijke databasemigraties uit telkens wanneer je op "Nu updaten" klikt bij een Joomla core-update.

De naam com_admin is misleidend. Het klinkt alsof het de volledige backend afhandelt, maar de backend (/administrator/) is in werkelijkheid een wijk vol kleine componenten. com_admin is er slechts één van, met een zeer specifieke taak: het is de component over de administrator zelf.

De kleine core-component die Joomla-upgrades uitvoert, systeeminformatie toont en het helpscherm aandrijft.

Dit artikel laat zien wat com_admin bevat, hoe het binnen de Joomla 6-architectuur past, waarom script.php één van de belangrijkste bestanden in Joomla core is, en waarom deze component een nuttig referentievoorbeeld is voor ontwikkelaars die moderne Joomla-componenten willen bouwen.

1. De basis

1.1 Wat is com_admin?

Een Joomla component is een kleine MVC-applicatie die binnen Joomla draait. De meeste componenten gaan ergens over:

Het is verantwoordelijk voor drie concrete zaken: het tonen van Systeeminformatie, het tonen van Help, en het leveren van de upgrade-engine die draait wanneer Joomla zichzelf naar een nieuwe versie update.

1.2 Waarom com_admin belangrijk is

De component lijkt klein aan de oppervlakte, maar draagt een zware verantwoordelijkheid:

  • Het is het scherm dat je bezoekt wanneer er iets misgaat en je systeemdetails moet delen.
  • Het bevat de canonieke geschiedenis van Joomla’s databaseschema in de vorm van SQL-migratiebestanden.
  • Het voert elke Joomla core-update uit, inclusief bestandsopschoningen en reparaties van de asset-tabel.
  • Het is het schoonste voorbeeld binnen de core van een moderne Joomla 6-component, compleet met Service Provider, aangepaste Dispatcher en PSR-4-namespacing.

1.3 De naam is misleidend

Mensen denken vaak:

"com_admin moet de volledige administrator-backend zijn."

Dat is niet zo. De administrator-backend is simpelweg de map /administrator/. Daarin bevinden zich tientallen kleine componenten die elk één specifieke taak afhandelen. com_admin is er daar één van, naast com_content, com_users, com_installer, com_joomlaupdate en vele andere.

1.4 Naburige componenten

Om com_admin te begrijpen, moet je weten welke taken bij welke buurcomponent horen:

ComponentWat het daadwerkelijk doetLocatie in de UI
com_admin Systeeminformatie, Help en de CMS-upgrade-engine Systeem → Systeeminformatie / Help
com_joomlaupdate De interface om Joomla core-updates te controleren en te starten Systeem → Joomla! Update
com_installer Installeren, updaten en beheren van extensies, plus Databaseherstel Systeem → Extensies / Database
com_config Het formulier voor Algemene configuratie Systeem → Algemene configuratie
com_cpanel De dashboardtegels waarop je terechtkomt Homepage na inloggen

Een veelgemaakte fout is om aan te nemen dat "Joomla Update in com_admin zit". Dat klopt niet. De interface voor de update zit in com_joomlaupdate. De engine die de upgrade daadwerkelijk uitvoert zit in com_admin. Het zijn twee helften van één workflow.

Naar boven

2. Waar com_admin zich bevindt

2.1 De mapstructuur

Je vindt de component hier in je Joomla-installatie:

public_html/administrator/components/com_admin/
├── postinstall/       (post-installatie handlers)
├── services/          (DI container-configuratie)
├── sql/               (versiebeheer DB-migraties)
├── src/               (PHP-klassen, PSR-4)
├── tmpl/              (view templates)
├── admin.xml          (manifest)
└── script.php         (de upgrade-engine)

Let op wat ontbreekt: er is geen media/-map en geen front-end map. com_admin is een pure backend-component.

2.2 Hoe je het opent in de browser

Er zijn slechts twee URL’s die naar com_admin leiden:

/administrator/index.php?option=com_admin&view=sysinfo
/administrator/index.php?option=com_admin&view=help

Er is geen lijstweergave, geen bewerkformulier en geen toolbar met publiceer- of prullenbakknoppen. Twee schermen, meer niet.

2.3 Het manifestbestand

Elke Joomla-component heeft een manifest. Voor com_admin is dat admin.xml:

<extension type="component" method="upgrade">
    <name>com_admin</name>
    <version>4.0.0</version>
    <namespace path="src">Joomla\Component\Admin</namespace>
    <administration>
        <files folder="admin">
            <filename>admin.xml</filename>
            <filename>script.php</filename>
            <folder>postinstall</folder>
            <folder>services</folder>
            <folder>src</folder>
            <folder>tmpl</folder>
        </files>
    </administration>
</extension>

Het attribuut method="upgrade" is belangrijk: het vertelt Joomla om de component altijd te upgraden in plaats van deze opnieuw vanaf nul te installeren. com_admin wordt op een draaiende site nooit schoon opnieuw geïnstalleerd.

Naar boven

3. De twee views

3.1 View 1: Systeeminformatie

De eerste view (view=sysinfo) toont wat je ziet onder Systeem → Systeeminformatie: PHP-versie, MySQL-versie, Joomla-versie, serverinstellingen, ruwe phpinfo(), maprechten en configuratiewaarden.

De templates bevinden zich in tmpl/sysinfo/:

default.php              (de wrapper met tabbladen)
default_system.php       (systeemtabel)
default_phpsettings.php
default_config.php
default_directory.php
default_phpinfo.php      (ruwe phpinfo)

Dit is het scherm dat je kopieert naar een supportthread wanneer je hulp nodig hebt bij een Joomla-probleem. Het bevat alles wat nodig is om een probleem te diagnosticeren, maar met één belangrijke beveiliging die later in dit artikel wordt besproken.

3.2 View 2: Help

De tweede view (view=help) is een kleine ingebouwde helpbrowser. Deze leest een bestand genaamd help/<lang>/toc.json en rendert een inhoudsopgave die verwijst naar help.joomla.org.

De betrokken bestanden zijn:

tmpl/help/                  (templates)
src/Model/HelpModel.php     (datalayer)

Als toc.json niet aanwezig is, valt HelpModel terug op het scannen van XML- en HTML-bestanden in dezelfde map en leest het de <title>-tag uit. Dit soort elegante fallback-mechanismen is een terugkerende Joomla-ontwerpwaarde: oude hulppakketten blijven gewoon werken, zelfs als ze ouder zijn dan het JSON-formaat.

Naar boven

4. De moderne componentarchitectuur

Hoewel com_admin slechts twee schermen heeft, gebruikt het de volledige moderne Joomla 4+/5/6-componentarchitectuur. Dat maakt het een uitstekend referentie voor ontwikkelaars.

4.1 Namespaces en PSR-4

De component gebruikt een nette namespace:

Namespace:  Joomla\Component\Admin
Pad:        administrator/components/com_admin/src/

Joomla 6 gebruikt PSR-4 autoloading. Het bestand:

src/Model/SysinfoModel.php

wordt automatisch gekoppeld aan de klasse:

Joomla\Component\Admin\Administrator\Model\SysinfoModel

Je hebt geen JLoader::register()-plakcode meer nodig. De autoloader vindt de klasse omdat de mapstructuur overeenkomt met de namespace.

4.2 Het MVC-skelet

De map src/ bevat een kleine set klassen die samen een volledige component vormen:

src/
├── Controller/DisplayController.php    (entry point)
├── Dispatcher/Dispatcher.php           (routing + toegang)
├── Extension/AdminComponent.php        (boot hooks)
├── Model/HelpModel.php
├── Model/SysinfoModel.php
└── Service/HTML/                       (HTML-helpers)

Dit is klassieke Model-View-Controller, maar met twee Joomla 4+-toevoegingen: een Dispatcher en een Extension-klasse.

4.3 De Service Provider

Het bestand services/provider.php koppelt de component aan Joomla’s Dependency Injection-container:

return new class () implements ServiceProviderInterface {
    public function register(Container $container)
    {
        $container->registerServiceProvider(
            new MVCFactory('\\Joomla\\Component\\Admin')
        );
        $container->registerServiceProvider(
            new ComponentDispatcherFactory('\\Joomla\\Component\\Admin')
        );
        // ...
    }
};

Elke moderne Joomla-component heeft een services/provider.php-bestand zoals dit. Het is het officiële entry point voor de DI-container.

4.4 De aangepaste Dispatcher

De Dispatcher van com_admin bevat een kleine maar zeer bewuste truc:

class Dispatcher extends ComponentDispatcher
{
    /**
     * com_admin vereist geen permissiecontrole,
     * daarom overschrijven we de methode checkAccess
     * en laten we die leeg
     */
    protected function checkAccess() {}
}

De methode die normaal ACL afdwingt, is bewust leeg gelaten. De reden is dat Systeeminformatie en Help moeten blijven werken, zelfs wanneer ACL verkeerd is geconfigureerd. Het zijn diagnostische hulpmiddelen, en een kapotte ACL is precies het moment waarop je ze het hardst nodig hebt. Zeer weinig Joomla-ontwikkelaars kennen dit patroon.

4.5 De Extension-klasse

De Extension-klasse AdminComponent draait tijdens het bootproces en registreert HTML-helperdiensten:

public function boot(ContainerInterface $container)
{
    $this->getRegistry()->register('system',        new System());
    $this->getRegistry()->register('phpsetting',    new PhpSetting());
    $this->getRegistry()->register('directory',     new Directory());
    $this->getRegistry()->register('configuration', new Configuration());
}

Hierdoor kunnen templates helpers op een consistente manier aanroepen:

echo HTMLHelper::_('phpsetting.setting', $key, $value);

4.6 De controller doet (bijna) niets

De controller is bewust minimaal gehouden:

class DisplayController extends BaseController
{
    public function display($cachable = false, $urlparams = [])
    {
        $viewName = $this->input->get('view', $this->default_view);
        $format   = $this->input->get('format', 'html');

        // Controleer CSRF-token voor sysinfo export-views
        if ($viewName === 'sysinfo'
            && ($format === 'text' || $format === 'json')) {
            $this->checkToken('GET');
        }

        return parent::display($cachable, $urlparams);
    }
}

Het heeft één taak: wanneer Systeeminformatie wordt geëxporteerd als tekst of JSON, vereist het een CSRF-token. Dat voorkomt dat een aanvaller een ingelogde administrator via een kwaadaardige link systeeminformatie laat lekken. Klein detail, maar belangrijk.

Naar boven

5. script.php: De echte superkracht

5.1 Wat script.php is

Het bestand administrator/components/com_admin/script.php bevat de klasse JoomlaInstallerScript. Deze klasse is het daadwerkelijke Joomla CMS-upgradescript.

Wanneer je in com_joomlaupdate op "Nu updaten" klikt, downloadt Joomla de nieuwe versie en voert daarna dit script uit. Het script doet onder andere:

  • Bestandsverwijderingen voor bestanden die de core niet meer nodig heeft.
  • Mapverwijderingen voor verouderde mappen.
  • Schema-patches en databaseherstel.
  • Herstel van asset-tabellen voor items die hun ACL-regel verloren zijn.
  • Opschoning van extensies.
  • Foutverzameling voor het eindrapport.

Eén bestand, honderden upgrade-stappen. Het is in feite de geschiedenis van Joomla geschreven in PHP-vorm.

5.2 De volledige updatecyclus

De scheiding tussen com_joomlaupdate en com_admin wordt veel duidelijker wanneer je de volledige updatecyclus bekijkt:

+----------------------------------------------------------+
|  com_joomlaupdate  (de interface)                        |
|  1. Haal update-XML op van update.joomla.org             |
|  2. Parse manifest, schrijf regels naar #__updates       |
|  3. Gebruiker klikt op "De update installeren"           |
|  4. Download het pakket                                  |
|  5. Pak bestanden uit, kopieer core-bestanden            |
+----------------------------------------------------------+
                         |
                         v  geeft door aan
+----------------------------------------------------------+
|  com_admin  (de engine)                                  |
|  6. Voer JoomlaInstallerScript::preflight() uit          |
|  7. Voer elk sql/updates/<driver>/X.Y.Z-YYYY-MM-DD.sql uit |
|     nieuwer dan de versie in #__schemas                  |
|  8. Voer JoomlaInstallerScript::update() uit             |
|     - bestandsverwijderingen, mapverwijderingen,         |
|       asset-herstel                                      |
|  9. Werk #__schemas bij met de nieuwe versiepointer      |
|  10. Wis cache                                           |
+----------------------------------------------------------+

Kort samengevat: com_joomlaupdate is het gezicht van de update, com_admin zijn de handen.

Naar boven

6. SQL-migraties met versiebeheer

6.1 De bestanden

Binnen sql/updates/ bevinden zich mappen voor elke ondersteunde databasedriver:

sql/updates/mysql/
├── 6.0.0-2024-08-11.sql
├── 6.0.0-2025-09-23.sql
├── 6.0.0-2025-10-11.sql
├── 6.0.1-2025-10-29.sql
├── 6.1.0-2025-10-30.sql
├── 6.1.0-2026-02-06.sql
└── 6.1.0-2026-03-13.sql

sql/updates/postgresql/
└── (dezelfde bestanden, PostgreSQL-dialect)

Het patroon is consistent:

  • Elke bestandsnaam begint met de doelversie van Joomla.
  • Na de versie volgt de datum.
  • Bestanden worden per databasedriver apart opgeslagen.

6.2 De versiepointer in #__schemas

Joomla houdt bij welke SQL-bestanden al zijn uitgevoerd. Daarvoor gebruikt het een tabel genaamd #__schemas:

SELECT e.element AS extension, s.version_id
  FROM jos_schemas s
  JOIN jos_extensions e ON e.extension_id = s.extension_id;

Een typisch resultaat ziet er zo uit:

+------------------+---------------------+
| extension        | version_id          |
+------------------+---------------------+
| joomla           | 6.1.0-2026-03-13    |  (dit wordt bijgewerkt door com_admin)
| com_content      | 6.0.0-2024-08-11    |
| com_users        | 6.0.0-2025-05-20    |
+------------------+---------------------+

Bij elke update kijkt Joomla naar de bestanden in sql/updates/<driver>/, vergelijkt die met de laatst uitgevoerde version_id, voert elk nieuwer bestand uit in bestandsvolgorde, en slaat daarna de hoogste bestandsnaam opnieuw op in #__schemas.

Als je ooit een migratie opnieuw moet uitvoeren, dan is dit de regel die je moet aanpassen. Voorzichtig.

6.3 Een echt migratiebestand

Een voorbeeld uit sql/updates/mysql/6.1.0-2026-03-13.sql:

-- schakel autostart uit voor de vorige tour
UPDATE `#__guidedtours` SET `autostart` = 0
 WHERE `uid` = 'joomla-whatsnew-6-0';

INSERT INTO `#__guidedtours` (...)
SELECT 'COM_GUIDEDTOURS_TOUR_WHATSNEW_6_1_TITLE', ...
 WHERE NOT EXISTS (
   SELECT * FROM `#__guidedtours` g
    WHERE g.`uid` = 'joomla-whatsnew-6-1'
 );

Let op de WHERE NOT EXISTS-beveiliging. Daardoor wordt de migratie idempotent: het twee keer uitvoeren veroorzaakt geen fouten of dubbele records. Idempotente migraties zijn een terugkerend patroon binnen Joomla core-updates.

Naar boven

7. Post-installatiemeldingen

7.1 Wat ze zijn

De map postinstall/ bevat een kleine verzameling PHP-bestanden. Elk bestand definieert één melding die na een update kan verschijnen onder Systeem → Post-installatiemeldingen:

postinstall/
├── addnosniff.php          (adviseert X-Content-Type-Options header)
├── behindproxy.php         (adviseert behind_loadbalancer instelling)
├── htaccessbrotli.php      (adviseert Brotli compressieregels)
├── htaccesssetce.php       (adviseert CE header-aanpassingen)
├── htaccesssvg.php         (adviseert SVG MIME-afhandeling)
├── languageaccess340.php   (helper voor taal-ACL migratie)
├── statscollection.php     (anonieme statistieken opt-in)
└── textfilter3919.php      (beveiligingsupgrade voor tekstfilters)

Elk bestand definieert een kleine *_condition()-functie. Joomla roept deze functies aan en toont de bijbehorende melding alleen wanneer de conditie true retourneert.

7.2 De opbouw van een handler

De API is eenvoudig. Een post-installatie-handler kan zo kort zijn als:

function admin_postinstall_statscollection_condition()
{
    return true;   // altijd tonen
}

Om een nieuwe melding te registreren voeg je een regel toe aan #__postinstall_messages die naar deze functie verwijst. Joomla toont daarna je melding op het scherm Post-installatiemeldingen wanneer aan de conditie wordt voldaan.

7.3 Waar dit patroon voor bedoeld is

Post-installatiemeldingen zijn upgrade-aanwijzingen op extensieniveau. Ze voeren nooit automatisch wijzigingen door. In plaats daarvan beschrijven ze een wijziging die je mogelijk wilt doorvoeren, bijvoorbeeld Brotli-compressie inschakelen in .htaccess, waarna de administrator zelf beslist. Dit is een bewuste ontwerpkeuze: Joomla wil informeren, niet overschrijven.

Naar boven

8. Hoe een Sysinfo-paginaverzoek verloopt

8.1 Het pad van een verzoek

Het helpt om het volledige pad van een request te zien wanneer je Systeeminformatie opent:

URL: /administrator/index.php?option=com_admin&view=sysinfo
                |
                v
   services/provider.php
   (DI: registreert MVCFactory + Dispatcher)
                |
                v
   Dispatcher::checkAccess()
   (lege override, dus geen ACL-blokkade)
                |
                v
   DisplayController::display()
   (CSRF-controle als format=text of json)
                |
                v
   SysinfoModel
   (verzamel en anonimiseer data)
                |
                v
   tmpl/sysinfo/default.php
   (render HTML)

Elke moderne Joomla-component volgt dezelfde flow. Zodra je dit voor com_admin begrijpt, begrijp je het voor allemaal.

8.2 Privacy by Design in SysinfoModel

SysinfoModel verzamelt veel gevoelige informatie: PHP-omgeving, paden, cookies, database-instellingen. Om het scherm veilig deelbaar te maken filtert het model een hardcoded lijst van privéwaarden weg:

protected $privateSettings = [
    'phpInfoArray' => [
        'CONTEXT_DOCUMENT_ROOT', 'Cookie', 'DOCUMENT_ROOT',
        'extension_dir', 'error_log', 'Host', 'HTTP_COOKIE',
        'HTTP_HOST', 'HTTP_ORIGIN', 'HTTP_REFERER',
        'mysql.default_socket', 'MYSQL_SOCKET', ...
    ],
];

Wanneer je Systeeminformatie kopieert naar een forumbericht, is dit de code die je geheimen anonimiseert. Omzeil dit niet.

8.3 Beveiligingskeuzes samengevat

OnderdeelBeveiliging
Toegang tot de view Geen, diagnostiek moet altijd werken
Export als tekst of JSON CSRF-token via checkToken('GET')
Privéwaarden in phpinfo() Hardcoded allowlist-filter in SysinfoModel
Schema-updates Idempotente SQL, bijgehouden in #__schemas
Post-installatiemeldingen Conditionele functies, voeren nooit automatisch wijzigingen uit

Het ontwerp is bewust gekozen: genoeg tonen om te debuggen, genoeg verbergen om veilig te blijven.

Naar boven

9. Waarom com_admin belangrijk is voor ontwikkelaars

9.1 Een referentiesjabloon

Voor iedereen die wil leren hoe je een Joomla 6-component bouwt, is com_admin het schoonste kleine voorbeeld binnen de core. Het demonstreert elk onderdeel van de moderne architectuur:

  • Een Service Provider in services/provider.php.
  • Een PSR-4 namespaced bronstructuur in src/.
  • Gebruik van de DI-container.
  • Een aangepaste Dispatcher.
  • Een Extension-klasse die HTML-helpers registreert.
  • SQL-migraties met versiebeheer per databasedriver.
  • Post-installatie-handlers.

Als je de twaalf bestanden in com_admin van boven naar beneden leest, begrijp je de volledige Joomla 6-componentarchitectuur.

9.2 Patronen die je kunt hergebruiken

Verschillende patronen uit com_admin zijn direct toepasbaar in je eigen componenten:

  • Idempotente migraties: schrijf SQL-updates die twee keer uitgevoerd kunnen worden zonder problemen.
  • Versiebeheer in bestandsnamen: gebruik het patroon X.Y.Z-YYYY-MM-DD.sql zodat Joomla ze correct kan sorteren.
  • Houd uitgevoerde versies bij in #__schemas met één regel per extensie.
  • Elegante fallback: als het nieuwe formaat ontbreekt, val dan terug op het oude formaat in plaats van te falen.
  • Privacy via allowlist: filter gevoelige waarden uit output die gedeeld kan worden.
  • CSRF-tokens voor exports: elke URL die gevoelige data retourneert moet een token vereisen.
Naar boven

10. Veelvoorkomende misverstanden opgehelderd

Er bestaan verschillende ideeën over com_admin die wijdverspreid zijn, maar onjuist.

AannameWerkelijkheid
"com_admin is de volledige backend" Nee, het is slechts één component binnen /administrator/.
"script.php draait alleen tijdens installatie" Het draait bij elke Joomla core-update.
"Sysinfo is alleen-lezen" Grotendeels. De tekst- en JSON-export vereisen een CSRF-token.
"Post-installatiemeldingen zijn irritante meldingen" Het zijn upgrade-aanwijzingen, nooit automatische wijzigingen.
"Help wordt geladen vanaf joomla.org" De inhoudsopgave is lokaal. De pagina’s worden online opgehaald.
"Joomla Update zit in com_admin" De interface zit in com_joomlaupdate. De engine zit in com_admin.
Naar boven

11. Best practices

11.1 Voor administrators

  • Gebruik Systeem → Systeeminformatie als eerste wanneer je details over een probleem moet delen.
  • Exporteer altijd via het officiële scherm, zodat het privacyfilter en het CSRF-token actief zijn.
  • Controleer Systeem → Post-installatiemeldingen na elke grote update. De aanwijzingen daar zijn geschreven door core-ontwikkelaars.
  • Bewerk #__schemas niet handmatig tenzij je exact weet waarom.

11.2 Voor ontwikkelaars

  • Lees script.php één keer per jaar volledig door. Het is de beste samenvatting van wat er in Joomla core veranderd is.
  • Lees de bestanden in sql/updates/mysql/ om veilige migratiepatronen te leren.
  • Gebruik com_admin als referentie bij het bouwen van je eigen componentstructuur.
  • Omzeil nooit het privacyfilter in SysinfoModel met je eigen dump van phpinfo().
Naar boven

12. In het kort

OPEN SYSINFO    /administrator/index.php?option=com_admin&view=sysinfo
OPEN HELP       /administrator/index.php?option=com_admin&view=help
SCRIPT          administrator/components/com_admin/script.php
SQL UPDATES     administrator/components/com_admin/sql/updates/<driver>/
VERSION TABLE   #__schemas       (één regel per extensie)
POST-INSTALL    administrator/components/com_admin/postinstall/
DISPATCHER      src/Dispatcher/Dispatcher.php   (lege checkAccess)
EXTENSION       src/Extension/AdminComponent.php (HTML-helpers)
SERVICES        services/provider.php   (DI-configuratie)
Naar boven

13. Samenvatting

De component com_admin lijkt klein, maar staat centraal binnen elke Joomla-site:

  • Het toont Systeeminformatie wanneer iets gedebugd moet worden.
  • Het rendert het Helpscherm en valt elegant terug wanneer nodig.
  • Het voert de upgrade-engine uit voor elke Joomla core-update.
  • Het bevat de schemahistorie van Joomla in SQL-bestanden met versiebeheer.
  • Het demonstreert de volledige moderne componentarchitectuur in een handvol nette bestanden.

Als je wilt weten hoe Joomla zichzelf update, dan ligt het antwoord in com_admin. Als je wilt leren hoe je een Joomla 6-component bouwt, dan staat het voorbeeld dat je zoekt eveneens in com_admin. En de volgende keer dat je je Systeeminformatie in een forumbericht plakt, weet je dat een kleine maar zorgvuldig gebouwde component voorkomt dat je geheimen mee op het klembord belanden.

Klein maar centraal is een eerlijke beschrijving. Het is makkelijk over het hoofd te zien, maar het is één van de componenten die een Joomla-professional goed zou moeten kennen.

Naar boven
Admin component in Joomla
Peter Martin
Peter Martin

Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.