DokuWiki

It's better when it's simple

Outils pour utilisateurs

Outils du site


fr:devel:security

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
fr:devel:security [2016-03-03 13:38] – créée juliengfr:devel:security [2020-08-16 09:39] (Version actuelle) – [Fuites d'informations] corrections Digitalin
Ligne 1: Ligne 1:
-<note warning> 
-Cette page n'est pas encore complète traduite.  
-</note> 
  
-====== Guide de sécurité à destination des auteurs de plugin ======+====== Guide de sécurité à destination des auteurs d'extensions ======
  
-Créer un [[fr:plugins]] pour DokuWiki est très simple pour les [[devel:plugins|programmeurs novices]] en PHP. Cependant et pour ne pas compromettre la sécurité de l'ensemble du wiki et du système sur lequel il est installé, vous devriez suivre ce guide minimal indiqué sur cette page. +Créer une [[fr:plugins|extension]] pour DokuWiki est très simple pour les [[fr:devel:plugins|programmeurs novices]] en PHP. Cependant et pour ne pas compromettre la sécurité de l'ensemble du wiki et du système sur lequel il est installé, vous devriez suivre ce guide minimal indiqué sur cette page. 
  
 :!: Ceux qui souhaitent aider à la construction de cette page sont les bienvenus. Celle-ci reste peu complète (au sens //d'accessible//) et nécessite davantage d'informations, de liens ou d'exemples :!: Ceux qui souhaitent aider à la construction de cette page sont les bienvenus. Celle-ci reste peu complète (au sens //d'accessible//) et nécessite davantage d'informations, de liens ou d'exemples
Ligne 11: Ligne 8:
 === Sommaire === === Sommaire ===
  
-Voici quelques exemples d'une liste bien plus longue de //common securité issues// (failles de sécurité, que vous pouvez trouver sur cette page : +Voici quelques exemples d'une liste bien plus longue de failles communes de sécurité, que vous pouvez trouver sur cette page : 
  
   * Cross Site Scripting (XSS) -- insertion de codes « malicieux » par le biais de la page pour corrompre la page affichée sur le navigateur de l'utilisateur.    * Cross Site Scripting (XSS) -- insertion de codes « malicieux » par le biais de la page pour corrompre la page affichée sur le navigateur de l'utilisateur. 
-  * Cross Site Request Forgery (CSRF) -- tricks to let you self do unknowingly harmful actions on your site  +  * Cross Site Request Forgery (CSRF) -- des astuces pour vous permettre de faire vous-même, sans le savoir, des actions nuisibles sur votre site  
-  * Remote Code Inclusion – le code inclus sur le code source de la page sera exécuté  +  * Remote Code Inclusion –- comprend un code sur le serveur qui y est exécuté 
-  * Information leaks -- diffusion d'informations non autorisé à l'origine par l'administrateur (non respect des règles ACL en somme) +  * Information leaks -- diffusion d'informations non autorisé à l'origine par l'administrateur 
-* SQL injection – injection SQL, c'est-à-dire l'injection de code arbitraire ou de données dans une base de données (peut éventuellement récupérer les mots de passes ou données personnelles de l'utilisateur) +  * SQL injection – on peut faire des demandes non souhaitées sur vos données
- +
-Vous trouvez  ici ([[#reporting Security Issues]]) quelques informations supplémentaires sur ces points. +
  
 +Vous trouvez  sur [[#Signaler des problèmes de sécurité]] quelques informations supplémentaires sur ces points. 
  
 ===== Cross Site Scripting (XSS) ===== ===== Cross Site Scripting (XSS) =====
  
-C'est la vulnérabilité la plus commune que vous pouvez trouver dans les plugins de DokuWiki.+C'est probablement la vulnérabilité la plus courante que l'on trouve dans les extensions DokuWiki.
  
-//Cross Site Scripting// est la méthode permettant l'attaque de l'utilisateur ou du visiteur sur le site, par le biais d'un code JavaScript destiné à corrompre le code source utilisé par le navigateur : cela permet une redirection des pages vers un autre site d'une maniètre transparente ou à voler les //cookies// d'authentification. +Le Cross Site Scripting désigne une attaque par laquelle un code JavaScript malveillant est introduit dans un site web. Il peut être utilisé pour rediriger des utilisateurs innocents vers des sites web malveillants ou pour voler des cookies d'authentification.
  
-DokuWiki's plugin mechanism gives plugin developers a great deal of flexibilityIn the case of syntax plugins in particularthe framework gives plugins the ability to work with raw unprocessed outputThis means the wiki page data which reaches your plugin has not been processed at allAnd there will be no further processing on the output after it leaves your plugin.+Le mécanisme de gestion des extensions de DokuWiki permet aux développeurs de greffon un compromis intéressant de flexibilitéDans le cas des greffons de syntaxe en particulierle cadre donne aux extensions la possibilité de travailler avec des sorties brutes non traitéesCela signifie que les données de la page wiki qui atteignent votre greffon n'ont pas été traitées du toutEt il n'y aura pas de traitement supplémentaire sur la sortie après qu'elle ait quitté votre greffon.
  
-===Escaping output=== +=== « Échapper » le contenu ===
-At an absolute minimum the plugin should ensure any raw data output has all HTML special characters converted to HTML entities using the [[phpfn>htmlspecialchars]] function. DokuWiki provides a convenient shortcut called [[xref>hsc()]] for the function. URLs values should be escaped using [[phpfn>rawurlencode]].+
  
-Also any wiki data extracted and used internally (eguser namesshould be treated with suspicion.+La base minimale de sécurité de votre greffon devrait être de s'assurer que toute sortie de données brutes soit convertie en [[https://fr.wikipedia.org/wiki/Entit%C3%A9_de_caract%C3%A8re|entités HTML]] par la fonction PHP [[phpfn>htmlspecialchars]]DokuWiki fournit pour cela un raccourci pratique appelé [[xref> hsc ()]] pour la fonction. Les valeurs URL doivent être échappés en utilisant [[php> rawurlencode]]
  
-===Input checking=== +En outre toutes les données wiki extraites et utilisées en interne (//par exemple les noms d'utilisateur//)doivent être traitées avec méfiance
-Check always all your input. Use whitelistsfilters, conversions to the exact data type you mean e.g. from a number inputted as mixed php value to integer and more to ensure you have __only__ data you allowed.+
  
-==See also:==+=== Vérifier les données entrantes === 
 + 
 +Vérifier **toujours** toutes les données entrantes. Pour cela utiliser les filtres, listes blanches ou la conversions exactes vers le type de données de la variable. Par exemple préférer un variable de type entier à une variable de type texte qui contient les caractères d'un type entier (plutôt 42 que '42'). Assurez-vous que vous avez **seulement** les données que vous autorisez.  
 + 
 +== Voir également ==
  
   * [[wp>Cross-site scripting]]   * [[wp>Cross-site scripting]]
   * [[http://ha.ckers.org/xss.html|XSS Cheat Sheet]]   * [[http://ha.ckers.org/xss.html|XSS Cheat Sheet]]
  
-==== Typical Vulnerability Examples ====+==== Exemples typiques de vulnérabilités ==== 
 + 
 +Vous trouverez ci-dessous quelques problèmes très courants. Les exemples sont très simples pour rendre le problème général clair. Votre greffon est probablement plus compliqué, mais vous devez garder en mémoire la logique de ces types de vulnérabilités.
  
-Below are some very common problems shown. The examples are very simple to make the general problem clear. Your plugin is probably more complicated, but you need to keep track of the same vulnerabilities.+=== Corps syntaxiques ===
  
-=== Syntax Bodies === 
  
-Many simple syntax plugins will take some user input and format it in custom HTML.+De nombreux greffons syntaxiques simples prennent en charge les entrées de l'utilisateur et les formatent en HTML personnalisé.
  
-ExampleHere is a abridged syntax plugin to wrap a given input in a bold tag.+Exemple Voici un greffon syntaxique abrégé pour mettre en forme une entrée donnée dans une balise en gras.
  
 <code php> <code php>
Ligne 67: Ligne 66:
     function render($mode, &$R, $data) {     function render($mode, &$R, $data) {
         if($mode != 'xhtml') return false;         if($mode != 'xhtml') return false;
-        $R->doc .= '<b>'.$data[0].'</b>';  //no escaping+        $R->doc .= '<b>'.$data[0].'</b>';  //pas d'échappement
     }     }
 } }
 </code> </code>
  
-As you can seethe raw input data captured in the lexer pattern is just passed on to the render methodwhere no escaping at all is doneMalicious users could introduce what ever JavaScript and HTML code they want.+Comme vous pouvez le voirles données d'entrée brutes saisies dans le modèle de lexer sont simplement transmises à la méthode de renduoù aucun échappement n'est effectuéeLes utilisateurs malveillants peuvent introduire le code JavaScript et HTML qu'ils veulent.
  
-The fix is simple: proper escaping.+La solution est simple : échapper correctement.
  
 <code php> <code php>
Ligne 90: Ligne 89:
     function render($mode, &$R, $data) {     function render($mode, &$R, $data) {
         if($mode != 'xhtml') return false;         if($mode != 'xhtml') return false;
-        $R->doc .= '<b>'.htmlspecialchars($data[0]).'</b>'; //escaping+        $R->doc .= '<b>'.htmlspecialchars($data[0]).'</b>'; //échappement
     }     }
 } }
 </code> </code>
  
-=== Forms ===+=== Formulaires ===
  
-When your plugin provides a form it is very common to validate the input and redisplay the form with the received user input when a validation error occurs.+Lorsque votre greffon fournit un formulaire, il est très courant de valider la saisie et de ré-afficher le formulaire avec la saisie reçue de l'utilisateur lorsqu'une erreur de validation se produit.
  
-ExampleThe following shows a form vulenerable to an XSS attack because it does not escape the user provided input correctly:+Exemple Ce qui suit montre un formulaire vulnérable à une attaque XSS parce qu'il n'échappe pas correctement l'entrée fournie par l'utilisateur :
  
 <code php> <code php>
 <form action="" method="post"> <form action="" method="post">
     <input type="text" name="q" value="<?php echo $_REQUEST['q']?>" />      <input type="text" name="q" value="<?php echo $_REQUEST['q']?>" /> 
-    <input type="submit" />                     //no escaping+    <input type="submit" />                     //pas d'échappement
 </form> </form>
 </code> </code>
  
-Providing ''%%"><script>alert('bang')</script>%%'' as user input would exploit the vulnerability. 
  
-To fix the form use the [[phpfn>htmlspecialchars|htmlspecialchars()]] or DokuWiki shortcut [[xref>hsc|hsc()]] function:+Fournir ''%%"><script>alert('bang')</script>%%'' comme entrée utilisateur exploiterait la vulnérabilité. 
 + 
 +Pour corriger le formulaire, utilisez la fonction [[phpfn>htmlspecialchars|htmlspecialchars()]] ou le raccourci DokuWiki [[xref>hsc|hsc()]] :
  
 <code php> <code php>
 <form action="" method="post"> <form action="" method="post">
     <input type="text" name="q" value="<?php echo hsc($_REQUEST['q'])?>" />     <input type="text" name="q" value="<?php echo hsc($_REQUEST['q'])?>" />
-    <input type="submit" />                                      //escaping+    <input type="submit" />                                      //échappement
 </form> </form>
 </code> </code>
  
-=== Classes and other Attributes ===+=== Classes et autres Attributs ===
  
-Often plugins will accept multiple parameters and options that are used to modify the output of the plugin.+Souvent, les greffons acceptent plusieurs paramètres et options qui sont utilisés pour modifier la sortie du greffon.
  
-Imagine a plugin accepting the following input to display a message box:+Imaginez un greffon acceptant l'entrée suivante pour afficher une boîte de message :
  
 <code> <code>
Ligne 129: Ligne 129:
 </code> </code>
  
-In the render method of this syntax there might be code like this:+Dans la méthode de rendu de cette syntaxe, il pourrait y avoir un code comme celui-ci :
  
 <code php> <code php>
-$renderer->doc .= '<div class="msg_'.$class.'">'  //$class can be everything+$renderer->doc .= '<div class="msg_'.$class.'">'  //$class peut être n'importe quoi
                        .htmlspecialchars($message)                        .htmlspecialchars($message)
                  .'</div>';                  .'</div>';
Ligne 138: Ligne 138:
 </code> </code>
  
-As you can see the message itself is properly escapedbut the class is notInstead of escaping it might be more sensible to use a whitelist of allowed classes instead with a default fallback:+Comme vous pouvez le constater, le message lui-même est bien échappémais pas la classeAu lieu de s'échapper, il pourrait être plus judicieux d'utiliser une liste blanche de classes autorisées avec une option de repli par défaut :
  
 <code php> <code php>
-$allowed = array('notice','info','warning','error');   //whitelist+$allowed = array('notice','info','warning','error');   //liste blanche
 if(!in_array($class,$allowed){                          if(!in_array($class,$allowed){                         
     $class = 'notice'; //unknown input, fall back to a sane default     $class = 'notice'; //unknown input, fall back to a sane default
Ligne 150: Ligne 150:
 </code> </code>
  
-===input URLs ===+=== URLs comme données en entrée ===
  
-When a plugin accepts URLs as input you need to make sureusers can not pass the ''%%javascript://%%'' pseudo protocol.+Lorsqu'un greffon accepte des URLs en entréevous devez vous assurer que les utilisateurs ne peuvent pas passer le pseudo protocole ''%%javascript://%%''.
  
-Here is an example how a very simple check could look like, to make sure only http and https URLs are used.+Voici un exemple de vérification très simple pour s'assurer que seules les URL http et https sont utilisées.
  
 <code php> <code php>
-// empty URL on protocol mismatch+// URL vide sur la non-concordance des protocoles
 if(!preg_match('/^https?:\/\//i',$url)) $url = '';  if(!preg_match('/^https?:\/\//i',$url)) $url = ''; 
 </code> </code>
Ligne 163: Ligne 163:
 ===== Cross Site Request Forgery (CSRF) ===== ===== Cross Site Request Forgery (CSRF) =====
  
-This vulnerability often appears into plugins due to the lack of understanding of this issueoften confused with the XSS.+Cette vulnérabilité apparaît souvent dans les greffons en raison du manque de compréhension de cette questionsouvent confondue avec le XSS.
  
-Cross Site Request Forgery refers to an attack where the victim's browser is tricked by a malicious site to ask for a page on a vulnerable site to do an unwanted action. The attack assumes the victim's browser have credentials to change something on the vulnerable site.+Cross Site Request Forgery est une attaque où le navigateur de la victime est piégé par un site malveillant pour demander une page sur un site vulnérable afin d'effectuer une action non désiréeL'attaque suppose que le navigateur de la victime possède les autorisations nécessaires pour modifier quelque chose sur le site vulnérable.
  
-===Adding security token=== 
-DokuWiki offers functions to help you deal against CSRF attacks: [[xref>getSecurityToken()]] and [[xref>checkSecurityToken()]]. Note that in the last versions of DokuWiki, you can use [[xref>formSecurityToken()]] instead of [[xref>getSecurityToken()]]. The latter will only give you the token value, but the other one will print or return a <div> with an hidden input of name "sectok" and value the security token. 
  
 +=== Ajouter un jeton de sécurité ===
  
-==See also==+DokuWiki offre des fonctions pour vous aider à lutter contre les attaques de la CSRF : [[xref>getSecurityToken()]] et [[xref>checkSecurityToken()]]. Notez que dans les dernières versions de DokuWiki, vous pouvez utiliser [[xref>formSecurityToken()]] au lieu de [[xref>getSecurityToken()]]. Cette dernière ne vous donnera que la valeur du jeton, mais l'autre affichera ou retournera un <div> avec une entrée cachée du nom "sectok" et donnera la valeur du jeton de sécurité. 
 + 
 +==Voir aussi ==
  
   * [[wp>Cross Site Request Forgery]]   * [[wp>Cross Site Request Forgery]]
   * [[https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29|OWASP explanation]]   * [[https://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29|OWASP explanation]]
  
-==== Typical Vulnerability Example ====+==== Exemple typique de vulnérabilité ====
  
-Below is the simplest example to startYou may have a more complicated plugin of your own to securehere is just a simple example based on form.+Voici l'exemple le plus simple pour commencerVous avez peut-être un greffon plus compliqué à sécuriservoici un exemple simple basé sur le formulaire.
  
-Imagine you want to know something which can be answered to Yes or Noyou would have a form of this type:+Imaginez que vous vouliez savoir quelque chose qui puisse être répondu par Oui ou Nonvous auriez un formulaire de ce type :
  
 <code html> <code html>
Ligne 190: Ligne 191:
 </code> </code>
  
-Then you process this form has follow:+Ensuite, vous traitez ce formulaire de cette façon :
  
 <code php> <code php>
Ligne 198: Ligne 199:
 </code> </code>
  
-So a user is connected to answer this question, but he doesn't know the response yetLet's take time to think and browse the web... +Un utilisateur est donc connecté pour répondre à cette question, mais il ne connaît pas encore la réponseLaissons lui le temps de réfléchir et de naviguer sur le web... 
-Now the user is visiting a malicious websiteone which know, or notthat the user may be connected to your DokuWiki. In this websitethe developer included this HTML image tag:+Maintenantl'utilisateur visite un site web malveillantqui sait ou non qu'il est connecté à votre DokuWiki. Dans ce site weble développeur a inclus cette balise d'image HTML :
  
 <code html> <code html>
Ligne 205: Ligne 206:
 </code> </code>
  
-What the user's browser will do then?+Que fera alors le navigateur de l'utilisateur ?
  
-The browser will process this image as any other and will send a request to this URL. Your plugin will then see that $_GET['yn'is set and will call the do_something_with_yn() function.+Le navigateur traitera cette image comme toute autre et enverra une demande à cette URL. Votre greffon verra alors que $_GET['yn'est défini et appellera la fonction do_something_with_yn().
  
-That's one of the examples of CSRF. Nowhow to fix this security hole?+C'est l'un des exemples de CSRF. Maintenantcomment remédier à cette faille de sécurité ?
  
-==== Prevent CSRF ====+==== Prévenir CSRF ====
  
-Remember your form aboveLet's add an input in it:+Vous vous souvenez de votre formulaire ci-dessus Ajoutons une entrée dans celui-ci :
  
 <code html> <code html>
Ligne 224: Ligne 225:
 </code> </code>
  
-Do you see the first inputYesGoodNow you have to check the security token when you recieve the formbefore processing it:+Voyez-vous la première entrée Oui BienVous devez maintenant vérifier le jeton de sécurité lorsque vous recevez le formulaireavant de le traiter :
  
 <code php> <code php>
Ligne 232: Ligne 233:
 </code> </code>
  
-As the malicious website will never find the value of the "sectok" hidden inputyour form is no longer vulnerable to CSRF.+Comme le site web malveillant ne trouvera jamais la valeur de l'entrée cachée "sectok", votre formulaire n'est plus vulnérable à la CSRF.
  
-**Note:** If the security token is not validthe checkSecurityToken() function displays a message which inform the user.+**Note:** Si le jeton de sécurité n'est pas validela fonction checkSecurityToken() affiche un message qui en informe l'utilisateur.
  
  
 +===== Inclusion de codes à distance =====
  
-===== Remote Code Inclusion =====+Cette attaque permet à un attaquant d'injecter du code (PHP) dans votre application. Cela peut se produire en incluant des fichiers, ou en utilisant des fonctions d'opérations non sécurisées comme [[phpfn>eval]] ou [[phpfn>system]].
  
-This attack allows an attacker to inject (PHP) code into your application. This may occur on including files, or using unsafe operations functions like [[phpfn>eval]] or [[phpfn>system]].+**Filtrez toujours toute entrée** qui sera utilisée pour charger des fichiers ou qui est passée en argument à des commandes externes.
  
-**Always filter any input** that will be used to load files or that is passed as an argument to external commands.+===== Fuites d'informations =====
  
-===== Information leaks =====+Cette attaque peut conduire à exposer des fichiers qui devraient normalement être protégés par les ACL de DokuWiki comme elle pourrait exposer des fichiers sur le serveur (comme ''/etc/passwd'').
  
-This attack may lead to the exposure of files that should usually be protected by DokuWiki's ACL or it might expose files on the server (like ''/etc/passwd'').+**Filtrez toujours toute entrée** qui sera utilisée pour charger des fichiers ou qui est passée en argument à des commandes externes.
  
-**Always filter any input** that will be used to load files or that is passed as an argument to external commands.+**Utilisez toujours les fonctions de vérification des ACL de DokuWiki lorsque vous accédez aux données de la page**.
  
-**Always use DokuWiki's ACL check functions when accessing page data**.+===== Injection SQL =====
  
-===== SQL injection =====+Cette attaque est rarement pertinente dans DokuWiki car aucune base de données n'est utilisée. Cependant, si votre extension accède à une base de données, il échappe toujours à toutes les valeurs avant de les utiliser dans les instructions SQL.
  
-This attack is rarely relevant in DokuWiki because no database is used. However if your plugin accesses a database always escape all values before using them in SQL statements. +Plus d'infos :
- +
-More info:+
  
   * [[wp>SQL injection]]   * [[wp>SQL injection]]
  
  
-===== Reporting Security Issues =====+===== Signaler des problèmes de sécurité ===== 
 + 
 +Si vous rencontrez un problème avec un greffon, veuillez en informer l'auteur par courrier électronique, en mettant éventuellement [[andi@splitbrain.org|Andi]] ou la [[fr:mailinglist|liste de diffusion]] en CC.
  
-If you encounter an issue with a plugin please inform the author of the plugin via emailoptionally putting [[andi@splitbrain.org|Andi]] or the [[:mailinglist]] on CC.+En outreun champ "securityissue" avec une courte description du problème doit être ajouté à la page [[plugin:repository|donnés]] du greffon. Cela créera une boîte d'avertissement rouge et retirera le greffon de la liste principale des extensions.
  
-Additionally a ''securityissue'' field with a short description of the problem should be added to the [[plugin:repository|data]] on the page of the plugin. This will create a red warning box and will delist the plugin from the main plugin list.+Une fois le problème corrigé et une nouvelle version réalisée, ce champ doit être supprimé à nouveau.
  
-Once the issue was fixed and a new release was made, this field should be removed again.+===== Crédits ===== 
 +  * traduction :  --- [[user>digitalin|digitalin]] //2020-08-15 18:12// à la suite de 
 +  * [[https://www.dokuwiki.org/fr:devel:security?rev=1457010250&do=diff|julieng]] 
fr/devel/security.1457008717.txt.gz · Dernière modification : 2016-03-03 13:38 de julieng

Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC Attribution-Share Alike 4.0 International
CC Attribution-Share Alike 4.0 International Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki