2012-05-25 2 views
1

Est-il possible de restreindre les domaines autorisés à envoyer des informations POST à ​​un fichier process.php? Par exemple, en haut du fichier process.php (qui utilise les données $ _POST de la soumission du formulaire), je souhaite ajouter quelque chose comme ceci.Restriction des domaines pouvant envoyer des informations PHP POST

<?php 
    Allowed Domains: domain.com, domain2.com 
?> 

Et seuls les formulaires soumis à partir des domaines autorisés utiliseront l'une des informations de publication.

C'est d'empêcher quelqu'un de créer un formulaire HTML sur leur propre serveur et la manipulation d'un formulaire pour essayer et d'exploiter toutes sortes de failles dans le process.php

Fondamentalement, je dispose d'un fichier valider.php que je veux accepter les soumissions de formulaires provenant de plusieurs domaines.

e.g. Domain.com/form.html >>> http://MainDomain.com/process.php 
or Domain2.com/form.html >>> http://MainDomain.com/process.php 

Je veux permettre à toute page avec un formulaire sur la liste des domaines autorisés à être en mesure de fonctionner sur le process.php. Si un domaine qui n'est pas rejeté est soumis à process.php, je veux qu'il soit rejeté.

Répondre

3

Vous pouvez essayer quelque chose comme suivre.

<?php 

$allowedDomains = array('www.abc.com', 'www.xyz.com'); 

$referer = $_SERVER['HTTP_REFERER']; 

$domain = parse_url($referer); //If yes, parse referrer 

if(in_array($domain['host'], $allowedDomains)) { 
    //Run your code here which will process the $_POST 
} else { 
    echo "you are not allowed to post at this page"; 
    exit(); //Stop running the script 
} 
?> 
+5

'HTTP_REFERER' peut être usurpé –

0

Les requêtes POST ne proviennent pas toujours de domaines. Ils pourraient provenir de n'importe quel appareil connecté à Internet. Ainsi, vous devriez filtrer en fonction de l'adresse IP.

Vous pouvez le faire en créant un tableau d'adresses IP en liste blanche et utiliser in_array pour vérifier.

if (in_array($_SERVER['REMOTE_ADDR'], $whitelist)) { 
+0

Mais si je crée une liste de domaines autorisés, cela filtrerait les IP de toute façon, n'est-ce pas? – Talon

+0

$ _SERVER ['REMOTE_ADDR'] vous donne l'adresse IP. Vous devrez faire une recherche DNS inverse pour comprendre le nom de domaine. Cette recherche échouerait probablement si j'effectuais la requête POST de ma machine locale en utilisant PuTTY ou quelque chose de similaire. – xbonez

0

Vous pouvez vérifier que _SERVER[HTTP_HOST] est dans votre liste de domaines autorisés. Cette valeur est définie par le serveur afin qu'elle ne puisse pas être usurpée par le client. Notez que c'est le domaine que le code exécute sur, ce qui semble être ce que votre question demande. Voulez-vous dire le domaine que les demandes ont été envoyées de?

+0

J'ai édité la question, je pense qu'elle répond à votre question. – Talon

0
if (!in_array($_SERVER['REMOTE_ADDR'], array('ip1', 'ip2'))) die('Not allowed'); 
+0

Cela semble obtenir l'adresse IP de l'adresse IP de l'utilisateur, pas l'adresse IP du site référent. – Talon

2

Vous ne pouvez pas le faire en vérifiant les domaines depuis le domaine d'envoi de la demande peut être facilement mystifiée par l'agent utilisateur et vous serez sans défense. Sans espoir!

Ce qui vous préoccupe s'appelle Cross Site Request Forgery. Je pense que la solution idéale pour vous serait d'inclure un jeton généré de manière aléatoire sous la forme que vous voulez protéger et stocker un jeton correspondant dans la session et d'autoriser uniquement les messages s'ils correspondent. Quelqu'un postant à partir d'un autre domaine devra d'abord définir le jeton dans la session et ensuite acquérir le jeton .. ils ne peuvent pas le faire sans voir le formulaire que vous créez (ou être très chanceux).

+0

Je dois rendre ce super facile pour la personne qui crée le formulaire sur l'autre domaine. Cela semble trop compliqué pour eux d'espérer jamais accomplir. – Talon

+0

@Talon problèmes difficiles ont des solutions difficiles. Consultez la section "Prévention" de l'article que je vous ai lié. Si vous ne pouvez en faire fonctionner aucun, alors tout ce que vous pouvez faire est de vérifier HTTP_REFERER, qui ne vous offrira quasiment aucune protection contre les requêtes malveillantes. –

Questions connexes