Maison >développement back-end >tutoriel php >Sécurité PHP - Usurpation de requête HTTP
Une attaque plus avancée et sophistiquée que l’usurpation de formulaire est l’usurpation de requête HTTP. Cela donne à l’attaquant un contrôle et une flexibilité complets, et prouve en outre que les données soumises par l’utilisateur ne peuvent pas être aveuglément fiables.
Pour démontrer comment cela fonctionne, jetez un œil au formulaire ci-dessous sur http://www.php.cn/ :
CODE :
<form action="process.php" method="POST"> <p>Please select a color: <select name="color"> <option value="red">Red</option> <option value="green">Green</option> <option value="blue">Blue</option> </select><br /> <input type="submit" value="Select" /></p> </form>
Si l'utilisateur sélectionne Rouge et clique sur le bouton Sélectionner, le navigateur émettra la requête HTTP suivante :
CODE :
POST /process.php HTTP/1.1 Host: example.org User-Agent: Mozilla/5.0 (X11; U; Linux i686) Referer: http://www.php.cn/ Content-Type: application/x-www-form-urlencoded Content-Length: 9 color=red
.
Étant donné que la plupart des navigateurs incluent une valeur d'URL d'origine, vous pourriez être tenté d'utiliser la variable $_SERVER['HTTP_REFERER'] pour empêcher l'usurpation d'identité. Bien sûr, cela peut être utilisé contre les attaques utilisant des navigateurs standards, mais les attaquants ne seront pas arrêtés par ce petit désagrément. En modifiant les informations brutes d'une requête HTTP, un attaquant peut contrôler complètement les valeurs des en-têtes HTTP, les données GET et POST et tout le contenu de la requête HTTP.
Comment un attaquant modifie-t-il la requête HTTP d'origine ? Le processus est très simple. Grâce à l'utilitaire Telnet fourni sur la plupart des plates-formes système, vous pouvez communiquer directement avec le serveur Web en vous connectant au port d'écoute du serveur Web (généralement le port 80). Voici un exemple d'utilisation de cette technique pour demander la page http://www.php.cn/ :
CODE :
$ telnet example.org 80 Trying 192.0.34.166... Connected to example.org (192.0.34.166). Escape character is '^]'. GET / HTTP/1.1 Host: example.org HTTP/1.1 200 OK Date: Sat, 21 May 2005 12:34:56 GMT Server: Apache/1.3.31 (Unix) Accept-Ranges: bytes Content-Length: 410 Connection: close Content-Type: text/html <html> <head> <title>Example Web Page</title> </head> <body> <p>You have reached this web page by typing "example.com", "example.net", or "example.org" into your web browser.</p> <p>These domain names are reserved for use in documentation and are not available for registration. See <a href="http://www.rfc-editor.org/rfc/rfc2606.txt">RFC 2606</a>, Section 3.</p> </body> </html> Connection closed by foreign host. $
La requête présentée dans l'exemple ci-dessus est la requête la plus simple conforme à la spécification HTTP/1.1. En effet, les informations sur l'hôte sont requises dans les informations d'en-tête. Une fois que vous avez entré deux nouvelles lignes consécutives indiquant la fin de la requête, l'intégralité de la réponse HTML s'affiche à l'écran.
L'utilitaire Telnet n'est pas le seul moyen de communiquer directement avec un serveur Web, mais c'est souvent le plus pratique. Mais si vous encodez la même requête en PHP, vous pouvez l'automatiser. La requête précédente peut être implémentée avec le code PHP suivant :
CODE :
<?php $http_response = ''; $fp = fsockopen('example.org', 80); fputs($fp, "GET / HTTP/1.1\r\n"); fputs($fp, "Host: example.org\r\n\r\n"); while (!feof($fp)) { $http_response .= fgets($fp, 128); } fclose($fp); echo nl2br(htmlentities($http_response, ENT_QUOTES, 'UTF-8')); ?>
Bien sûr, il existe de nombreuses façons d'atteindre l'objectif ci-dessus, mais le point principal est que HTTP est un protocole standard bien connu, et même un protocole légèrement un attaquant expérimenté l'attaquera. Très familier avec les méthodes d'attaque pour les vulnérabilités de sécurité courantes.
Par rapport aux formulaires d'usurpation d'identité, il n'existe pas beaucoup de façons d'usurper les requêtes HTTP, vous ne devriez donc pas y prêter attention. La raison pour laquelle je décris ces techniques est de mieux démontrer à quel point il est facile pour un attaquant de saisir des informations malveillantes dans votre application. Cela souligne encore une fois l'importance du filtrage des entrées et le fait que les informations fournies par une requête HTTP ne sont pas fiables.
Ce qui précède est le contenu de l'usurpation de requête HTTP de sécurité PHP. Pour plus de contenu connexe, veuillez prêter attention au site Web PHP chinois (www. php.cn) !