.htaccess : empêcher l'exécution sauvage d'un script

.htaccess : empêcher l'exécution sauvage d'un script - PHP - Programmation

Marsh Posté le 23-02-2009 à 11:47:58    

Bonjour,
tout d'abord, désolé pour le côté newbee de ma question, mais je rame complètement.
 
Que dois-je mettre dans mon fichier .htaccess pour que :
#1/ une page HTML puisse appeler une page PHP que j'appelerai ici p.php;
#2/ un utilisateur entrant "www.monadresse.fr/p.php" dans la barre du navigateur se prenne une erreur ?
 
J'ai bien sûr essayé OPTIONS -ExecCGI mais mon exigence décrite en #1 ne fonctionne plus.
 
Voyez-vous comment m'aider ? Merci d'avance !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 23-02-2009 à 11:47:58   

Reply

Marsh Posté le 23-02-2009 à 12:15:20    

Bon ... je pense qu'il faudrait que tu éclaircisse un peu ton problème pour dire exactement ce que tu veux parce que

suizokukan a écrit :

#1/ une page HTML puisse appeler une page PHP que j'appelerai ici p.php;

peut vouloir dire tout et n'importe quoi à la fois, les pages HTML 'n'appellent' pas de pages PHP à proprement parler.
Est-ce que tu veux faire de l'ajax ? de la redirection d'url ? Sois plus précis parce que là ...
 


---------------
By bob.
Reply

Marsh Posté le 23-02-2009 à 12:20:34    

Merci de m'avoir répondu : je précise, car en effet, ce n'est pas clair.
 
J'ai une page HTML qui contient un formulaire (... method="post" action="php/p.php" ). J'aimerais que cette page HTML puisse accéder à p.php mais qu'un utilisateur qui entrerait l'adresse www.monsite.fr/php/p.php ne puisse en exécuter le script.
 
Est-ce possible ? Merci d'avance !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 23-02-2009 à 14:18:46    

Oh ben, tu peux ...
Après il existe une multitude de techniques ...
Par exemple si tu soumets ton formulaire en 'POST' (comme dans ton exemple), tu peux en php récupérer la méthode d'envoi, et si c'est pas POST, tu renvoi un header 403 'accès refusé' (header("HTTP/1.0 403 Forbidden" )) et voilà le tour est joué.
Sinon, tu peux aussi passer par $_SERVER['HTTP_REFERER'] pour vérifier que l'utilisateur vient bien de ta page html.
Regarde du coté des variables transmises par le serveur ('http_referer', 'request_uri', 'query_string', ...).
A toi de chercher maintenant ce qui correspond le mieux à ce que tu veux ...
 


---------------
By bob.
Reply

Marsh Posté le 23-02-2009 à 14:47:08    

> superbob56 : un grand merci pour ces explications; je pensais devoir passer par .htaccess mais tu me donnes des idées très intéressantes.
 
Merci encore !


---------------
rule #1 : trust the python
Reply

Marsh Posté le 23-02-2009 à 15:17:01    

Le problème du referer est qu'il peut être vide. Ce n'est pas quelque chose de fiable [:sadnoir]
 
Pour vraiment se protéger (on appelle ça dans certains cas un CSRF, Cross-site request forgery), il vaut mieux utiliser un système de token, avec l'algo suivant :
 
Affichage du formulaire

  • Génération d'un token unique (genre un nombre aléatoire, ou son md5, etc. N'importe quelle méthode pour générer un truc qu'on ne peut pas deviner)
  • Insertion du token quelque part, genre en base de données
  • Affichage du token dans un input hidden du formulaire


Réception des données

  • Vérification que le token existe en base
  • Traitement des données
  • Suppression du token de la base pour qu'il ne soit plus réutilisable


 
Ainsi on est obligé de demander la page formulaire pour pouvoir l'envoyer :)

Reply

Marsh Posté le 23-02-2009 à 19:11:11    

on peut insérer le token en session sinon

Reply

Marsh Posté le 23-02-2009 à 23:15:38    

+1 pour le token en session, voyez vous des bots de spam les adopter ?


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 24-02-2009 à 11:59:58    

@FlorentG : J'avoue que le token c'est plus clean comme approche (sur le coup j'y avais pas pensé), d'ailleurs suizokukan, je te conseille vivement cette approche plutôt que celles que j'ai proposées qui, effectivement, sont moins fiables.
 


---------------
By bob.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed