[php] origine de variables

Résolu/Fermé
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 - 6 oct. 2007 à 21:49
grilladou Messages postés 1 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 7 mars 2008 - 7 mars 2008 à 23:36
Salut,

'tite question. Concernant la sécurité et plus particulièrement sur l'origine de variables à traiter. Je m'explique :
Supposons que j'ai un formulaire qui utilise la méthode POST, et transmet les variables à action.php , le tout étant hébergé sur le serveur SERVER_PERSO
En toute rigueur, il est possible à n'importe qui de de créer un formulaire utilisant la methode POST, hébergé sur SERVER_PIRATE, qui transmet les variables à SERVER_PERSO/action.php

Le problème, c'est que cette personne pourrait envoyer des choses non attendues sur mon SERVER_PERSO.

Quels sont nos moyens pour vérifier que toutes les variables transmises et traitées par action.php proviennent de SERVER_PERSO ?

9 réponses

PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
8 oct. 2007 à 22:49
Bonsoir

ha Ok, si tu veux t'assurer que l'appel de ta page action.php provient bien du navigateur d'un client qui a charger ta page SERVER_PERSO/form.html et non pas SERVER_PIRATE/form.html alors un moyen simple est d'utiliser les sessions et notemment le SID.


Ex : le formulaire sur le site PERSO


<?php
if (!isset($_SESSION)) 
{
	session_start();  // Restaure la session précédente ou démarre ou nouvelle session 
}
?>
<html>
<title>Formulaire du serveur PERSO</title>
<body>
<form action="action.php" method="post">
Variable A <input type="text" value="" name="variable_a" id="variable_a"><br/>
<input type="hidden" value="<?php echo session_id();?>" name="id">
<input type="submit" value="Envoyer">
</form>
</form>
</body>
</html>


le formulaire sur le site PIRATE : quasi identique ... ou presque et pourtant

<?php
if (!isset($_SESSION)) 
{
	session_start();  // Restaure la session précédente ou démarre ou nouvelle session 
}
?>
<html>
<title>Formulaire du serveur PIRATE</title>
<body>
<form action="http://site_perso/.../action.php" method="post">
Variable A <input type="text" value="" name="variable_a" id="variable_a"><br/>
<input type="hidden" value="le pirate ne peut pas connaître le SID" name="id">
<input type="submit" value="Envoyer">
</form>
</form>
</body>
</html>



la page action.php

<?php
// On restaure la session pour l'utilisateur
if (!isset($_SESSION)) 
{
	session_start();  // Restaure la session précédente ou démarre ou nouvelle session 
}
?>

<html>
<body>
<?php
$id="";
// On récupère l'ID posté par l'utilisateur
if (isset($_POST['id'])) $id=$_POST['id'];

// On teste si l'ID correspond au SID
if (session_id() != $id) 
{
	echo "Hum ! Votre session a expiré ou appel depuis une page non autorisée !";
}
else
{
	echo "Cette page a bien été appellée depuis une page autorisée du même site. Cool<br>";
	$variable_a = isset($_POST['variable_a']) ?  $_POST['variable_a']  : "";
	echo "variable_a = ".$variable_a;
}
?>
</body>
</html>




voilà c'était juste une idée
1
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
6 oct. 2007 à 23:22
salut Gryzzly !

ce que tu cherches c'est sans doute 'HTTP_REFERER' :
'HTTP_REFERER'
    L'adresse de la page (si elle existe) qui a conduit le client à la page courante. Cette valeur est affectée par le client, et tous les clients ne le font pas. Certains navigateurs permettent même de modifier la valeur de HTTP_REFERER, sous forme de fonctionnalité. En bref, ce n'est pas une valeur de confiance.

mais comme tu vois ce n'est pas le top.
mais en validant le contenu de ton '$_POST', en premier avec le type de variable retourné tu devrais faire mieux.
0
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 330
6 oct. 2007 à 23:27
"mais en validant le contenu de ton '$_POST', en premier avec le type de variable retourné tu devrais faire mieux"

tu veux dire quoi par là ?
0
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
8 oct. 2007 à 10:12
Bonjour

Sinon tu peux forcer l'identification avec nom d'utilisateur + mot de passe lors de l'accès à ta page :
Voir : http://fr3.php.net/manual/fr/features.http-auth.php

Tu peux gérer une liste d'utilisateurs en "dur" dans le fichier php (pas terrible, pas très sécurisé), dans un fichier sur ton serveur ou une base MySQL.

Sinon si tu utilises Apache et que tu as accès au serveur tu peux également gérer la sécurité au travers des fichiers .htaccess
apacht



0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 330
8 oct. 2007 à 10:27
Salut,

Je ne demande aucnement le moyen de protéger une page ou une transaction par login+mdp.

Je demande un moyen de vérifier que l'origine d'une trnasmission provient bien de mon serveur et non pas d'un serveur externe.
0
Dalida Messages postés 6728 Date d'inscription mardi 14 mai 2002 Statut Contributeur Dernière intervention 11 janvier 2016 920
8 oct. 2007 à 14:08
salut,

il s'agit juste de vérifier que ce que te renvoie le '$_POST' est un 'String' quand tu attends un 'String' ou un entier quand tu attends un entier.

dans ton cas ce n'est pas forcement suffisant, c'est très utile pour les types autres que les chaines.
et si tu te mets à l'objet c'est une excellente habitude de typer les variables de tes fonctions.

mais je me demande si ce que tu veux sécuriser est encore utile. je vais chercher mais avec PHP5 il me semble que par défaut l'exécution de scripts hors domaine est interdit par défaut.
je vais regarder 'php.ini' quand j'aurais un peu plus de temps.
0
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 330
8 oct. 2007 à 14:20
Salut,

"il s'agit juste de vérifier que ce que te renvoie le '$_POST' est un 'String' quand tu attends un 'String' ou un entier quand tu attends un entier."
ah oui, ca d'accord... mais ce n'est qu'un traitement après réception des données. là, la question porte sur l'étape d'avant : la réception des données en elle meme

la page perso SERVER_PERSO/form.html appelle le script dans le domaine (il appelle ma page action.php), c'est le contenu des variables qui peut provenir d'un autre domaine : SERVER_PIRATE/form.html qui transmet aussi à action.php.
de ce que tu me dis "execution de scripts hors domaine" signifierais que c'est le pirate qui ne peux plus envoyer à mon serveur, et non pas l'inverse, moi qui ne pourrait pas recevoir d'un autre domaine.

or nous savons tout deux que la portabilité est une chose essentielle ;-) et que l'on n'a pas toujorus la main sur tout, en particulier la config du php.ini . il faut donc prévoir en amont les problèmes que l'on pourrait rencontrer lors d'une déportatation sur un serveur configuré différemment ;-)
0
gryzzly Messages postés 4608 Date d'inscription lundi 7 novembre 2005 Statut Contributeur Dernière intervention 24 octobre 2020 1 330
8 oct. 2007 à 23:18
Ca me plait. Elle est bonne et me convient. Je l'adopte.

momentanément du moins, car je n'en ai pas l'utilité immédiate. Je me posait cette question suite à une lecture d'un très bon bouquin, mais comme tout bon bouquin, il n'adopte pas le meme schéma reflectionnel que ma cervelle et donc n'abordait pas cette aspect au moment ou mon imagination divaguait ;-)

Merci de cette contrib
0
grilladou Messages postés 1 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 7 mars 2008
7 mars 2008 à 23:36
Salut à tous

Je confirme que la méthode de PhP fonctionne parfaitement bien. Un grand merci pour ta contribution.

A+
0