PHP et sécurité

molgow

Membre expert
Club iGen
4 Janvier 2002
5 496
613
41
Suisse
lien: Le ver PhpInclude.Worm attaque les pages php insécurisées

Un nouveau vers s'attaque à certaines pages PHP. Seulement les pages mal programmées (au niveau de la sécurité) peuvent être touchées.

C'est le bon moment de revérifier la sécurité de vos scripts ou tout simplement de regarder comment bien sécuriser un script si vous ne l'avez jamais fait. ;)
 
supermoquette a dit:
et hop un petit backup :siffle:
Il faut surtout bien programmer ;)

Histoire de montrer ce qu'il ne faut PAS faire, je vais essayer de rajouter quelques mauvais exemples. Si certains ont des exemples, qu'ils n'hésites pas. On a sûrement tous des trucs à apprendre.
 
Exemple :

Bloc de code:
<?php
    
    	include $_GET['page'];
    	
    ?>

Avec ce script, on essaie d'inclure une page qui nous est passée en paramètre. Le problème c'est que n'importe qui peut passer au script la chaîne de caractère qu'il veut ! Et il peut donc faire inclure n'importe quel fichier à votre script.
Par exemple, il peut lancer la requête mauvais-script.php?page=/etc/passwd. Ca va lui afficher le contenu du fichier passwd pour autant que la machine soit sur Unix. Ce fichier contient la liste des utilisateurs, et sur les vieux systèmes, il contient également la liste des mots de passes cryptés. Il est alors facile de faire une attaque de type recherche exhaustive pour tenter de trouver le mot de passe d'un utilisateur.

C'est pourquoi il faut absolument vérifier les paramètres qui nous sont passés dans l'URL pour éviter que quelqu'un puisse inclure et faire afficher autre chose que ce pourquoi le script a été conçu.
 
j'ai qql include() et requre() mais qui pointent jamais sur une variable mais des fichiers, exemple:

include("news/news.php3");

c'est dangereux ? :siffle:
 
Il faut faire attention lorsqu'on travaille avec une base de données relationnelle de type SQL.

Imaginons que vous vouliez avoir un accès sécurisé à une partie de votre site, vous allez faire une page où l'utilisateur peut entrer son nom et son mot de passe. Ensuite, vous allez traiter ce qu'il a entré.

Exemple à ne pas faire :
Bloc de code:
   $login = $_POST['login'];
   $password = $_POST['password'];
   $query = 'SELECT login, password FROM users WHERE login = "' . $login . '" AND password = "' . $password . '"; ";

Si vous exécutez la requête SQL ci-dessus et que vous vous contentez de vérifier uniquement si la requête a retourné une ligne de la table (peu importe laquelle), alors le script est vulnérable.

Quelqu'un de mal-intentionné n'aura qu'à rentrer dans votre script les données suivantes :
Pour le login : " OR TRUE OR login="
Pour le password : n'importe quoi

La requête retournera toujours quelque chose et l'utilisateur pourra donc accéder à votre site.

Ne vous contentez donc jamais de vérifier uniquement si une requête à retourner une ligne ou zéro ligne. Vérifiez aussi les données de la ligne retournée !
 
L'exemple suivant n'est pas vraiment dangereux, mais il peut être très dérangeant et il peut s'avérer utile à d'autres personnes pour commettre des actes mal-intentionnés.

Avant toute expication, voici un exemple sur MacGéneration même :
cliquez par ici
Et rentrez votre nom.

Le truc est basé sur le fait que la chaîne de caractère que l'on passe au moteur de recherche est réaffichée telle quelle dans le code source. Et je passe au script une chaîne de caractère qui contient un javascript qui affiche le texte et l'input.

Dans l'exemple d'un moteur de recherche ce n'est pas grave pour votre site. Un exemple où ça peut devenir sacrément gênant, c'est dans le cas d'un livre d'or. Il faut absolument éviter que quelqu'un puisse rentrer du code HTML sinon il risque de vous foutre un joli bordel. Rien de grave, juste très ennuyeux si quelqu'un peut inclure n'importe quoi dans votre livre d'or.

Lorsqu'on affiche des données rentrées par l'utilisateur, il est donc impératif de supprimer tous les code HTML, par exemple avec la fonction htmlsepcialchars.