<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'security.errors.php',
    1 => 'Rapport d\'erreurs',
    2 => 'Rapport d\'erreurs',
  ),
  'up' => 
  array (
    0 => 'security.php',
    1 => 'S&eacute;curit&eacute;',
  ),
  'prev' => 
  array (
    0 => 'security.database.sql-injection.php',
    1 => 'Injection SQL',
  ),
  'next' => 
  array (
    0 => 'security.variables.php',
    1 => 'Donn&eacute;es transmises par les internautes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'security/errors.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="security.errors" class="chapter">
 <h1 class="title">Rapport d&#039;erreurs</h1>

 <p class="para">
  En termes de sécurité, il y a deux conséquences au rapport d&#039;erreur.
  D&#039;un côté, cela améliore la sécurité, mais d&#039;un autre, cela la réduit aussi.
 </p>
 <p class="para">
  Une tactique d&#039;attaque standard consiste à faire faire des erreurs
  au système, et à analyser les types des erreurs qui sont retournées,
  ainsi que leur contexte. Cela permet à l&#039;attaquant d&#039;obtenir des
  informations à propos du serveur, en vue de détecter de possibles faiblesses.
  Par exemple, si un intrus a glané des informations sur une page dépendant
  de la soumission préalable d&#039;un formulaire, il peut essayer d&#039;écraser les
  variables par ses propres valeurs :
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Attaque de variables avec une page HTML personnalisée</strong></p>
   <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form method=&quot;post&quot; action=&quot;attacktarget?username=badfoo&amp;amp;password=badfoo&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;username&quot; value=&quot;badfoo&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;badfoo&quot; /&gt;
&lt;/form&gt;</pre>
</div>
   </div>

  </div>
 </p>
 <p class="para">
  Les erreurs PHP qui sont normalement retournées peuvent être
  très pratiques pour un développeur qui essaie de déboguer un
  script, car elles donnent de précieux renseignements tels que
  la fonction qui a échoué, depuis quel fichier PHP, et même le numéro
  de la ligne à laquelle l&#039;erreur s&#039;est produite. Toutes ces informations sont exploitables.
  Il n&#039;est pas rare que les développeurs PHP utilisent
  les fonctions <span class="function"><a href="function.show-source.php" class="function">show_source()</a></span>,
  <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span>, ou
  <span class="function"><a href="function.highlight-file.php" class="function">highlight_file()</a></span> comme outils de débogage, mais sur un
  site en production, cela peut exposer des variables cachées, des syntaxes non
  vérifiées, ou d&#039;autres informations critiques. Il est particulièrement
  dangereux d&#039;exécuter du code de sources connues avec des gestionnaires de
  débogage inclus, ou de travailler avec des techniques de débogage répandues.
  Si l&#039;attaquant peut déterminer quelle technique générale est utilisée, il peut
  tenter une attaque frontale sur une page, en envoyant des chaînes de débogage connues :
  <div class="example" id="example-2">
   <p><strong>Exemple #2 Exploiter des variables classiques de débogage</strong></p>
   <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form method=&quot;post&quot; action=&quot;attacktarget?errors=Y&amp;amp;showerrors=1&amp;amp;debug=1&quot;&gt;
&lt;input type=&quot;hidden&quot; name=&quot;errors&quot; value=&quot;Y&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;showerrors&quot; value=&quot;1&quot; /&gt;
&lt;input type=&quot;hidden&quot; name=&quot;debug&quot; value=&quot;1&quot; /&gt;
&lt;/form&gt;</pre>
</div>
   </div>

  </div>
 </p>
 <p class="para">
  Indépendamment de la méthode de gestion des erreurs, la possibilité de tester
  un système pour identifier des erreurs revient à fournir à un attaquant
  plus d&#039;informations sur le système.
 </p>
 <p class="para">
  Par exemple, le style même d&#039;une erreur PHP standard indique qu&#039;un système fait
  tourner PHP.
  Si un attaquant affiche une page <code class="literal">.html</code>, et essaye de la tester (pour rechercher des
  faiblesses connues du système), en lui envoyant des données invalides, il peut déterminer
  qu&#039;elle a été construite via un script PHP.
 </p>
 <p class="para">
  Une erreur de fonction peut indiquer si un système supporte une base de
  données spécifique, ou bien donner des indices quant à la façon dont une page a
  été conçue ou développée. Cela peut orienter l&#039;intrus
  vers les ports de cette base de données ou bien vers une attaque
  liée à cette application. En envoyant des données
  erronées, par exemple, un pirate peut déterminer l&#039;ordre
  d&#039;identification dans un script (à partir des numéros de lignes d&#039;erreurs),
  ou sonder à la recherche de failles qui pourraient être exploitées à
  différents endroits du script.
 </p>
 <p class="para">
  Une erreur de fichier, ou une erreur générale de PHP, peut indiquer
  quelles sont les permissions du serveur web, ainsi que la structure
  et l&#039;organisation des fichiers. Le code de gestion d&#039;erreurs écrit par le
  développeur peut aussi aggraver ce problème, en permettant l&#039;exploitation facile
  d&#039;informations préalablement &quot;cachées&quot;.
 </p>
 <p class="para">
  Il y a trois solutions majeures à ces problèmes : la première
  est de scruter toutes les fonctions, et d&#039;essayer de traiter toutes les
  erreurs. La seconde est de totalement désactiver le rapport d&#039;erreur, dès
  que le script est en production. La troisième est d&#039;utiliser les
  fonctions de gestion des erreurs de PHP pour créer des gestionnaires d&#039;erreurs personnalisés.
  En fonction de la politique de sécurité en place, il se peut que
  ces solutions soient toutes les trois applicables.
 </p>
 <p class="para">
  Une méthode pour gagner du temps est d&#039;utiliser la fonction
  <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span>, pour aider à
  sécuriser le code et détecter certaines utilisations dangereuses de variables.
  En testant le code avant le déploiement avec <strong><code><a href="errorfunc.constants.php#constant.e-all">E_ALL</a></code></strong>,
  il est possible de rapidement repérer les variables qui ne sont pas protégées.
  Une fois que le code est prêt à être déployé, il est recommandé soit de désactiver complètement
  le rapport d&#039;erreur en passant 0 à la fonction <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span>,
  soit de désactiver l&#039;affichage des erreurs en utilisant l&#039;option de configuration
  <code class="literal">display_errors</code> de <var class="filename">php.ini</var>. En choisissant la
  seconde solution, il est également recommandé de définir le chemin vers le fichier
  de log en utilisant la directive de configuration <code class="literal">error_log</code>,
  et d&#039;activer la directive <code class="literal">log_errors</code>.
  <div class="example" id="example-3">
   <p><strong>Exemple #3 Détecter des variables non protégées avec E_ALL</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$username</span><span style="color: #007700">) {<br />  </span><span style="color: #FF8000">// Non initialisée ou vérifiée avant utilisation<br />  </span><span style="color: #0000BB">$good_login </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br />if (</span><span style="color: #0000BB">$good_login </span><span style="color: #007700">== </span><span style="color: #0000BB">1</span><span style="color: #007700">) {<br />  </span><span style="color: #FF8000">// Si le test ci-dessus échoue, les valeurs n'ont pas été testées<br />  </span><span style="color: #0000BB">readfile </span><span style="color: #007700">(</span><span style="color: #DD0000">"/données/très/très/sensibles/index.html"</span><span style="color: #007700">);<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
</div>
<?php manual_footer($setup); ?>