Question

PayPal IPN envoie une requête POST avec un nombre variable de champs à l'informer URL, afin de confirmer que la demande POST est nous avons besoin légitime de soumettre à nouveau la même demande avec un champ cmd=_notify-validate supplémentaire à PayPal, qui répond alors VERIFIED ou INVALID.

Ma question est, pourquoi avons-nous besoin de renvoyer la demande à PayPal? Ne serait pas quelque chose comme ça suffire?

if (preg_match('~^(?:.+[.])?paypal[.]com$~i', gethostbyaddr($_SERVER['REMOTE_ADDR'])) > 0)
{
    // request came from PayPal, it's legit.
}

Iff nous pouvons faire confiance au serveur IP correctement de résoudre, je suppose que nous pouvons faire confiance à toutes les demandes de PayPal, non?

Était-ce utile?

La solution

Je sais que cette question est assez vieux, mais:

L'attaquant n'a même pas besoin d'usurper son ip ou d'effectuer toute sorte de MITM pour passer votre validation:

  1. Il se connecte à sa propre machine avec l'adresse IP x.y.z.t.
  2. Vos appels serveur GetHostByAddr ( "x.y.z.t") qui envoie une requête dns le nom t.z.y.x.in-addr.arpa.
  3. Si x.y.z.t appartient à l'attaquant, il y a des chances qu'il contrôle (au moins) du domaine et dns z.y.x.in-addr.arpa (depuis qui contient son propre IP). Il peut donc revenir « paypal.com » en réponse à cette requête.
  4. Votre serveur reçoit « paypal.com » à partir du serveur dns de l'attaquant, et votre contrôle de validation réussit.

Cette attaque est vaincu en envoyant une demande à paypal tel que recommandé par Lobos.

Autres conseils

Ceci est la meilleure façon que je l'ai trouvé de le faire, également par PayPal indique. J'utilise http_build_query () pour construire l'url du poste qui a été envoyé sur le site de PayPal. Paypal états docs que vous devez envoyer ce retour pour la vérification et c'est ce que nous faisons avec file_get_contents. vous remarquerez que j'utilise strstr pour vérifier si le mot « Verified » est présent et si nous continuons dans la fonction, sinon on retourne faux ...

$verify_url = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_notify-validate&' . http_build_query( $_POST );   

if( !strstr( file_get_contents( $verify_url ), 'VERIFIED' ) ) return false;

PayPal est qu'appliquer un meilleur niveau de sécurité pour votre propre site / avantages de l'application.

usurpation d'adresse IP peut facilement duper votre exemple fonction, se fondant sur REMOTE_ADDRESS seul est tout à fait enclin à attaquer.

Lorsque vous travaillez avec la sécurité des transactions financières est d'une grande importance. Si je peux usurper une demande IPN, je peux duper votre site / application dans l'exécution de transactions fausses. En envoyant une demande supplémentaire à un emplacement connu et de confiance, on obtient un niveau beaucoup plus élevé de lettres de créance sur lequel agir. L'ensemble de la demande IPN original est envoyé dans cette confirmation afin que PayPal peut vérifier que tous les détails de la transaction sont en fait valables, empêchant ainsi un homme-in-the-Middle Attaque par laquelle un attaquant modifie les détails (disons, en changeant un prix ou de la quantité ) d'une demande par ailleurs valide car il est envoyé de PayPal à votre serveur.

la chose se désagrège si quelqu'un parvient à modifier le fichier hosts sur la machine exécutant votre auditeur IPN;

  • mauvaise personne envoie une notification fausse de paiement

  • votre serveur envoie double à compromis 'paypal.com' qui est en fait fait à la machine de mauvaises personnes

  • mauvaise personne répond VÉRIFIÉ, reçoit des biens comme si elles avaient payé.

ce n'est pas tant d'un problème que si une personne a r / w accès à votre fichier hosts ils pourraient probablement mettre le dossier de paiement dans votre base de données à la main, ou faire beaucoup d'autres morceaux de dommages.

juste une pensée.

Voici une raison de répondre au POST, de la Guide IPN :

  

Votre auditeur doit répondre à chaque   message, si vous ou non l'intention de   faire quelque chose avec elle. Si tu ne le fais pas   répondre, PayPal suppose que la   message n'a pas été reçu et renvois   le message. PayPal continue à   renverrons périodiquement le message jusqu'à ce que   votre auditeur envoie le bon   un message de retour, bien que l'intervalle   entre les messages resent augmente chaque   temps.

     

IMPORTANT : PayPal prévoit recevoir une   réponse à un message IPN à moins de 30   secondes.

Voici une autre solution - https://stackoverflow.com/a/4988281/2165415

(parce que votre page IPN peut avoir besoin de vérifier d'où l'appel est)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top