2013-04-26 16 views

Odpowiedz

9

Posiadamy wiele adresów IP używanych do tworzenia haseł internetowych, ale mogą one (i prawdopodobnie będą) zmieniać się lub dodawać nowe podczas skalowania. Alternatywą byłoby dodanie ciągu zapytania do adresu URL webhooka, który dodasz w Mandrill, a następnie sprawdzenie tego ciągu zapytania, gdy pojawi się POST, abyś mógł sprawdzić, czy pochodzi on z Mandrill.

+0

Aha, miły i sprawny pomysł. Dla pozostałych dotyczy informacji o metadanych. To molo, na razie nie mogę polubić twojego wpisu :). Dziękujemy – devside

+0

Nie można sfałszować adresów IP! – ankitjaininfo

+0

@ankitjaininfo Natknąłem się na to pytanie, a twoja uwaga wzbudziła moją ciekawość. Moim pierwszym instynktem było "niełatwo". Następnie znalazłem ten post na giełdzie stosów zabezpieczeń IT: https://security.stackexchange.com/questions/14505/can-i-trust-the-source-ip-of-an-http-request. Lepsze 3 lata spóźnienia niż nigdy, jak sądzę. – nageeb

17

podpis Mandrill mieści się w nagłówku odpowiedzi HTTP: Authenticating-webhook-requests

W znalezisku żądanie nagłówka: X-Mandrill-Signature. Jest to podstawowa 64 hashcode, podpisana przy użyciu klucza sieciowego. Ten klucz jest tajemnicą tylko dla twojego webhooka.

0

205.201.136.0/16

Właśnie whitelisted je w zaporze mojego serwera.

2

Wystarczy zastąpić stałych i używać tej funkcji:

<?php 

function generateSignature($post) 
    { 
     $signed_data = WEB_HOOK_URL; 
     ksort($post); 
     foreach ($post as $key => $value) { 
      $signed_data .= $key; 
      $signed_data .= $value; 
     } 

     return base64_encode(hash_hmac('sha1', $signed_data, WEB_HOOK_AUTH_KEY, true)); 
    } 

//--- 

if (generateSignature($_POST) != $_SERVER['HTTP_X_MANDRILL_SIGNATURE']) { 
    //Invalid 
} 

?> 
1

Jak opisano w mandryl na docs one stanowić podpis, aby sprawdzić, czy żądanie pochodzi od nich naprawdę. zbudować żądania tam jest kilka kroków:

  1. zacząć od dokładnego adresu URL swojej webhook (ukośniki umysł i params)
  2. sortowania zmienne post przez klucz (w przypadku mandrill, będziesz miał tylko jedną parametr post: mandrill_events)
  3. dodaj klucz i wartość do adresu URL, bez ogranicznika
  4. hmac URL z tajnym kluczem (możesz uzyskać klucz z interfejsu internetowego) i base64 go.
  5. porównać wynik z nagłówkiem

X-Mandrill-Signature oto próbka implementacja w Pythonie:

import hmac, hashlib 

def check_mailchimp_signature(params, url, key): 
    signature = hmac.new(key, url, hashlib.sha1) 
    for key in sorted(params): 
     signature.update(key) 
     signature.update(params[key]) 
    return signature.digest().encode("base64").rstrip("\n")