lumo:configurer_dokuwiki_nginx_pour_executer_un_script_bash_ayant_des_arguments
Configurer dokuwiki + nginx pour exécuter un script bash ayant des arguments
J'ai pensé à çaConfigurer DokuWiki avec Nginx pour exécuter un script bash avec des arguments est une demande technique intéressante, mais qui nécessite quelques précautions importantes. Je vais vous expliquer les différentes approches et leurs implications de sécurité.Approche recommandée : Plugin DokuWikiLa méthode la plus propre consiste à créer ou utiliser un plugin DokuWiki qui appelle le script :Structure du plugin /lib/plugins/myscript/ ├── action.php ├── syntax.php └── script.sh Exemple de code PHP (action.php)
<?php class action_plugin_myscript extends DokuWiki_Action_Plugin { public function register(Doku_Event_Handler $controller) { $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_script'); } public function handle_script(Doku_Event $event, $param) { if ($event->data == 'script') { $arg = $_GET['arg'] ?? ''; // Validation stricte des arguments if (!preg_match('/^[a-zA-Z0-9_-]+$/', $arg)) { http_response_code(400); exit('Argument invalide'); } $script = __DIR__ . '/script.sh'; exec($script . ' ' . escapeshellarg($arg), $output, $return); echo json_encode(['output' => $output, 'return' => $return]); } } }
Configuration Nginx
server { listen 80; server_name wiki.votre-domaine.com; root /var/www/dokuwiki; # DokuWiki principal location / { try_files $uri $uri/ @dokuwiki; } location @dokuwiki { fastcgi_pass unix:/var/run/php/php-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root/index.php; } # Protection des scripts bash location ~* \.sh$ { deny all; return 403; } }
⚠️ Considérations de sécurité CRITIQUES RisqueSolutionInjection de commandesValider strictement tous les arguments avec regexExécution arbitraireNe jamais passer directement $_GET ou $_POST à exec()Élévation de privilègesExécuter le script avec un utilisateur dédié (non-root)Fuite d'informationsDésactiver l'affichage des erreurs en productionAttaques CSRFImplémenter des tokens CSRF dans les formulaires Alternative plus sécurisée : API REST Plutôt que d'exécuter directement depuis DokuWiki, créez une API séparée :
#!/bin/bash # /usr/local/bin/script-api.sh # Utiliser systemd socket ou une API Node.js/Python dédiée
Cette approche permet : Une authentification indépendante Un logging séparé Des contrôles d'accès plus granulaires Une mise à jour sans toucher au wiki Permissions recommandées
# Propriétaire du script chown www-data:www-data /path/to/script.sh # Permissions restrictives chmod 750 /path/to/script.sh # DokuWiki doit être dans le même groupe usermod -aG www-data dokuwiki-user
Points importants Évitez exec() si possible : Privilégiez les hooks PHP natifs de DokuWiki Journalisation : Ajoutez un logging complet de chaque exécution Timeout : Limitez le temps d'exécution pour éviter les blocages Rate limiting : Implémentez des limites sur Nginx pour éviter les abus Souhaitez-vous que je développe un aspect particulier de cette configuration, comme la création complète du plugin ou la configuration détaillée de Nginx ?
lumo/configurer_dokuwiki_nginx_pour_executer_un_script_bash_ayant_des_arguments.txt · Dernière modification : de estro
