PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 30-12-2011 16:02:37

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

empêcher l'exécution directe d'un fichier

Bonjour,

Je dirai qu'il y a semble-t-il tellement de solutions que je ne sais laquelle utiliser (et surtout comment l'utiliser !).

J'ai un formulaire (inscription.php) dont le bouton envoyer exécute un autre fichier PHP d'envoi de mail (envoi_mail.php) - dans ce mail je récapitule les infos données par la personne et lui souhaite la bienvenue...je précise que ce fichier m'envoie une copie de ce mail.

Je ne cherche pas une sécurité à toute épreuve, mais simplement une instruction qui éviterait qu'un robot ne lance directement le fichier envoi_mail.php.
En effet, je reçois de temps à autre le mail vide...ce qui laisse supposer que le fichier envoi_mail.php est exécuté directement...

J'ai vu des choses comme utiliser la variable $_SERVER - mais certains disent que ça ne marche pas avec tous les navigateurs ?
j'ai aussi trouvé une variable par define( '_VALID_MOS', 1 )   
voir mettre une variable dans le fichier inscription.php et la tester (et la remettre à zéro) dans le fichier envoi_mail.php

mais dans  un cas comme dans l'autre je ne sais pas comment utiliser cela ...

Alors certes, je présume que pour quelqu'un de compétent c'est facile, mais nous sommes ici sur un forum débutant (sur lequel j'espère traînent des experts ;-)

J'ai bien essayé de regarder des docs ici et là, et de faire des recherches via google (et ici même su rce forum) , mais à chaque fois ce sont des exemples précis sur un cas donné, que je n'arrive pas à transposer au mien...

alors si vous pouviez me donner un petit coup de pouce, je gagnerai beaucoup de temps...

merci

Gérard

Hors ligne

#2 30-12-2011 20:55:59

nicolas
Membre
Inscription : 11-11-2009
Messages : 69
Site Web

Re : empêcher l'exécution directe d'un fichier

Je te propose comme solution : faire le traitement complet de ton formulaire avec le script inscription.php. C'est-à-dire que l'action (attribut action de la balise form) de ton formulaire est aussi le script inscription.php ($_SERVER['PHP_SELF'] peut devenir ton amie).

Il faudra évidemment que tu agisses en fonction des différents cas possibles :
1) chargement initial du formulaire
2) soumission du formulaire mais il manque des infos obligatoires
3) soumission du formulaire avec toutes les infos requises

Pour différencier les cas, tu te bases sur le contenu du tableau $_POST.
Dans le cas 3, tu inclus le script envoi_mail.php (instruction include). Si tu ne peux pas mettre ce script dans un endroit inaccessible par un URL, tu peux comme tu le proposais utiliser par exemple une constante. Le code pourrait ressemblé à ça :

Dans inscription.php :

<?php
define('IS_VALID_INCLUDE', true);
//
?>

Et dans envoi_mail.php, tout en haut, tu peux ajouter ça par exemple :

<?php
if (!defined('IS_VALID_INCLUDE')) {
   header('Status: 412');
   exit();
}
?>

Hors ligne

#3 31-12-2011 14:54:38

Gaeil28
Membre
Inscription : 30-12-2011
Messages : 21

Re : empêcher l'exécution directe d'un fichier

Merci,
bon c'est encore un peu flou pour moi tout ça..

e script inscription.php ($_SERVER['PHP_SELF'] peut devenir ton amie

j'avais lu quelque part qu'avec cette fonction on pouvait tester  le nom du fichier "appelant" et dans le cas contraire (le fichier appelant n'est pas le bon où n'existe pas..on arrête le script. Mais j'ai essayé..et je dois faire des erreurs de syntaxe...
En fait dans le fichier envoi_mail.php il faudrait dire que si le fichier appelant n'est pas inscription.php alors on arrête.

bref...

en essayant la dernière solution que tu proposes,

if (!defined('IS_VALID_INCLUDE')) {
   header('Status: 412');
   exit();

j'ai eu un message d'erreur en provenance du fichier envoi_mail.php qui disait en gros que Header était déjà défini....(il faut dire que j'utilise phpmailer dans le script..peut-être que ça vient de là ?...)

bref, je m'en suis tiré (on verra si c'est efficace à l'usage ) par le test du mail du demandeur...à priori ça marche. Si je mets l'adresse (www.toto.com/envoi_mail.php) directement dans le navigateur, il affiche bien le message d'erreur et ne m'envoi pas le mail de copie.

en effet, si un robot exécute directement le fichier envoi_mail.php, alors l'adresse mail du demandeur (qui provient du formulaire et qui est récupérée ici par un POST) est vide. dans ce cas le script s'arrête..

voilà l'instruction que j'ai mise en début du fichier envoi_email.php

if (!isset($_POST['email'])) {echo "désolé nous n'avons pas récupéré votre mail - merci de nous contacter via la page contact du site et nous signaler ce problème";exit;}

j'ai mis une phrase, on sait jamais...(je précise que le formulaire inscription.php est testé en long en large et en travers..et qu'on ne peut pas le valider si on n'indique pas un mail demandeur "valide" (du moins dans la syntaxe xxxx@xxxx.xx)
merci
Gérard

Dernière modification par Gaeil28 (31-12-2011 14:56:20)

Hors ligne

#4 01-01-2012 12:48:18

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : empêcher l'exécution directe d'un fichier

Bonjour,

Meilleurs voeux pour cette nouvelle année, et une bonne santé surtout.
A mon humble avis, baser son script sur le fichier appelant n'est ni sage, ni suffisant. En effet, si votre fichier s'appele par exemple envoimsg.php, il suffit que quiconque sur son propre site créé son propre script avec le même nom de fichier pour envoyer des données sur le votre, et ... qui seront acceptés! ce qui n'est pas acceptable. Vous l'aurez compris, si on peut savoir quel est le nom du fichier qui appele son script, il est impossible de savoir si c'est le bon!

Le seul contrôle possible et raisonnable est de contrôler le nom des variables passées à votre script, en tester leur nombre, leur nom et leur contenu et donc leur format à chaque fois que cela vous est possible, le tout agrémenté par un contrôle d'identification d'utilisateur, et vous êtes normalement certain que tout est ok de ce côté là.

++

Dernière modification par Jc (01-01-2012 12:51:33)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums