PayPal IPN Güvenlik

6 Cevap php

PayPal IPN POST isteği biz PayPal'a bir ek cmd=_notify-validate alan, birlikte aynı isteği yeniden gerekir okunaklı olduğunu teyit etmek için bildirmek URL'ye alanlarda bir değişken sayıda bir POST isteği gönderir sonra yanıtlar VERIFIED veya INVALID.

Benim sorum, neden PayPal isteği yeniden göndermek için ihtiyacım var? Böyle bir şey yeterli değil misiniz?

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

Iff Biz doğru IP'leri çözmek için sunucu güvenebilirsiniz, ben hayır, biz PayPal gelen bütün istekleri güvenebilirsiniz varsayıyorum?

6 Cevap

Bu soru oldukça eski olduğunu biliyorum, ama:

Saldırgan bile ip parodi ya da doğrulama geçmek için MiTM her türlü gerçekleştirmek gerekmez:

  1. He connects from his own machine with IP address x.y.z.t.
  2. Your server calls gethostbyaddr("x.y.z.t") which sends a dns query for the name t.z.y.x.in-addr.arpa.
  3. If x.y.z.t belongs to the attacker, chances are he controls (at least) the dns domain z.y.x.in-addr.arpa as well (since that contains his own ip). So he can return "paypal.com" in response to that query.
  4. Your server receives "paypal.com" from the attacker's dns server, and your validation check succeeds.

Bu saldırı Lobos tarafından önerilen şekilde paypal bir istek göndererek yenildi.

PayPal sadece kendi sitesi / uygulamanın yararı için daha yüksek bir güvenlik standardı uygulamaktadır.

IP spoofing kolayca REMOTE_ADDRESS yalnız saldırı oldukça eğilimli dayanarak gibi, örnek fonksiyonu kandırabilir.

Eğer mali işlemlerin güvenliği ile çalışırken büyük önem taşımaktadır. Ben bir IPN isteği parodi varsa, ben yanlış işlemleri gerçekleştirerek içine sitesi / uygulama kandırmak. Bir bilinen ve güvenilen konuma ek bir isteği göndererek, biz hareket üzerine kimlik bilgisi çok yüksek bir standart edinin. PayPal işlem tüm ayrıntıları geçerli aslında olduğunu doğrulamak böylece tüm orijinal IPN isteği, bir saldırganın bir fiyat veya miktar değiştirerek, diyelim ki (ayrıntıları değiştiren sayede böylece Man-in-the-middle saldırısı önlenmesi, bu onay gönderilir ) bu sunucuya PayPal gönderilen gibi bir başka geçerli isteği.

Bu durum aynı zamanda PayPal başı olarak, ben bunu yapmak için bulduk en kolay yoludur. Ben paypal dan siteye gönderilen görevinden url oluşturmak için () http_build_query kullanın. Paypal docs doğrulama için bu geri göndermesi gerektiğini belirtiyor ve biz file_get_contents ile ne olduğunu. Eğer ben kelime 'ONAYLI' mevcut olup olmadığını kontrol etmek için strstr kullanımı ve biz return false değilse bu yüzden, işlevi devam dikkat edecek ...

$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;

Birisi IPN dinleyici çalışan makinede hosts dosyasını değiştirmek için yönetir eğer her şey yıkılır;

  • kötü kişi yanlış ödeme bildirimini gönderir

  • Lütfen tehlikeye sunucu aslında kötü kişilerin 'makine işaret edildiği' paypal.com 'çoğaltmak gönderir

  • onlar ödemişti gibi ONAYLI kötü kişi cevaplar, mal alır.

Bir kişi muhtemelen sadece elle veritabanına ödeme kaydını koymak veya hasar diğer birçok bitleri yapabileceğini dosyanızda hosts r / w erişimi varsa, bu bir sorun çok değil.

Sadece bir düşünce.

İşte IPN Guide , POST cevap için bir neden:

Your listener must respond to each message, whether or not you intend to do anything with it. If you do not respond, PayPal assumes that the message was not received and resends the message. PayPal continues to resend the message periodically until your listener sends the correct message back, although the interval between resent messages increases each time.

IMPORTANT: PayPal expects to receive a response to an IPN message within 30 seconds.

Burada başka bir çözüm - http://stackoverflow.com/a/4988281/2165415

(IPN sayfa çağrı nereden geldiğini kontrol etmeniz gerekebilir çünkü)