2010-02-21 3 views
2

Je fileA.php sur SERVER_A et fileB.php sur SERVER_BPHP - Comment déterminer si la demande provient d'un fichier spécifique

fileB.php fait une demande de boucle fileA.php pour son contenu

Comment fileA.php peut-il déterminer que la requête provient spécifiquement de fileB.php?

-

Je pensais à envoyer $ _SERVER [ « SCRIPT_NAME »] dans fileB.php à fileA.php mais puisque quelqu'un peut aller dans fileB.php ou tout autre fichier en général, et il suffit de faire _SERVER $ ['SCRIPT_NAME'] = 'fileB.php'; ce n'est pas vraiment sécurisé.

Alors comment puis-je déterminer, pour des raisons de sécurité, que la requête provient d'un fichier spécifique sur un serveur différent?

+2

Avez-vous absolument besoin que ce soit 100% sécurisé? Parce que si c'est le cas, je vous recommande de trouver une autre façon de le faire. –

+0

Est-ce que fileA.php doit être accessible au public? Si votre question est de savoir comment rendre fileA.php accessible * seulement * à fileB.php, vous pouvez utiliser l'authentification HTTP pour ajouter une protection par mot de passe (le mot de passe peut alors être spécifié comme paramètre à curl dans le fichier B.php). –

Répondre

0

Une fois que vous faites une demande en dehors de votre serveur, vous n'avez vraiment aucun contrôle. Si fileA sur l'autre serveur a la possibilité d'un fichier man-in-the-middlingB, vous devez repenser votre modèle de sécurité. Quelle est la situation spécifique?

+0

bien si je ne peux pas le sécuriser je ne vais pas le coder. cette situation spécifique est moi juste essayer de trouver un moyen d'exécuter du code sur un serveur de clients sans qu'il soit réel et sans qu'ils puissent le voir. J'essaie de coder quelque chose comme fileB.php {eval (file_get_contents (fileA.php));} et fileA.php {ftp fileB.php - si md5 de fichierB.php est d'origine et demande à venir de fileB.php et un couple d'autres choses - lui donner le code php de SERVER_A à eval, sinon lui donner quelque chose à eval like die()} juste essayer de voir ce que je peux faire php faire =/ – Mickey

+0

je veux dire curl , pas file_get_contents, désolé. – Mickey

+2

Cela semble honnêtement voué à l'échec. Il n'y a pas de bon moyen de le faire. Vous pouvez fournir un script qui a été "chiffré" par quelque chose comme un ioncube ou un encodeur zend et les forcer à exécuter ces modules PHP, puis fournir seulement le PHP chiffré, mais ceux-ci ont été prouvés comme étant moins sécurisés. – Xorlev

0

Une façon serait de vérifier la

$_SERVER['HTTP_REFERER'] 

variable PHP, mais il est la décision du navigateur pour remplir ce ne peut donc pas être pleinement confiance.

+0

Demande de cURL. L'en-tête 'Referer' n'existe pas. –

+4

Vous pouvez spécifier une valeur arbitraire pour le référant avec cURL. – BojanG

+0

Spoofable. Pas sécurisé. – mixdev

4

Vous ne pouvez pas, de manière fiable. Vous pouvez essayer de définir un en-tête HTTP et de le vérifier de l'autre côté; ce n'est pas infaillible, mais c'est mieux que la plupart.

0

Peu de choses peuvent être faites si un tiers a accès à fileB.php. REFERER ne vous donne aucune protection. REMOTE_ADDR n'est pas aussi trivial à usurper, cela pourrait vous donner l'assurance que la requête est légitime.

2

Impossible, à cause de votre déclaration:

"since someone can go into fileB.php" 
2

Pourquoi ne pas mettre en place un jeton secret, et vérifiez sur l'extrémité de réception?

// fileB.php 

$url = "http://example.com/fileA.php" 
    . "?from=fileB" 
    . "&token=" . sha1('fileB' . 'myaw3som3_salt!') 
; 
// then make the cURL request. 


// fileA.php 
if (sha1($_GET['from'] . 'myaw3som3_salt!') != $_GET['token']) { 
    die(); 
} 

Ceci est un exemple simpliste ici, mais vous avez l'idée.

+0

J'utilise cette technique pour stocker les mots de passe dans une base de données, sha1 le mot de passe avec une clé mais si le "jeton" dans ce cas est visible dans l'URL et c'est tout ce que j'ai vérifié ou tout j'ai pu vérifier encore plus facile pour eux de parodier – Mickey

+0

@John: peut-être inclure '$ _SERVER ['HTTP_REFERER']' dans la chaîne avant le hachage? – nickf

0

Je pense que nickf était sur place, mais juste pour développer sa réponse un peu, voici ce que je ferais:

  • fileB.php sur les demandes Serveur1 fileC.php sur Server2
  • Filec. php sur Server2 retourne un sel généré aléatoirement, le stocke dans un fichier ou une base de données avec un horodatage
  • fileB.php sur Server1 demande fileA.php sur Server2, et envoie comme son corps de requête une clé préconfigurée, hachée, ajoutée à la sel aléatoire et haché à nouveau (par exemple sha1 (sha1 ('mypassword'). $ salt))
  • fileA.php vérifie si un salt a été généré dans les 60 dernières secondes, sinon renvoie une erreur
  • fileA.php exécute le même hachage avec sa dernière clé aléatoire salt et préconfigurée - sha1 (sha1 ('mypassword'). $ salt) à nouveau, ce qui est comparé avec le corps de la requête envoyé par fileB.php. Si elles correspondent, fileA.php accorde l'accès à fileB.php. FileA.php supprime le dernier sel qui a été généré.
+0

Aussi, si vous vous inquiétez de l'homme dans le milieu, utilisez HTTPS ... c'est probablement une protection adéquate et raisonnable – Zaahid

Questions connexes