2013-04-26 8 views

Antwort

9

Wir haben eine Reihe von IPs, die für Webhooks verwendet werden, aber sie können sich (und werden wahrscheinlich) ändern oder neue hinzufügen, wenn wir skalieren. Eine Alternative wäre, der Webhook-URL, die Sie in Mandrill hinzufügen, eine Abfragezeichenfolge hinzuzufügen und dann nach dieser Abfragezeichenfolge zu suchen, wenn ein POST eingeht, damit Sie überprüfen können, ob er von Mandrill stammt.

+0

Oh ja, schön und effizient Idee. Bei den anderen geht es um Metadaten. Es ist ein Anlegesteg, ich kann deinen Post für jetzt nicht mögen :). Danke – devside

+0

Kann nicht IPs gefälscht werden! – ankitjaininfo

+0

@ankitjaininfo Stolperte über diese Frage und Ihr Kommentar weckte meine Neugier. Mein erster Instinkt war es, "nicht leicht" zu denken. Dann habe ich diesen Beitrag auf dem IT Security Stack Exchange gefunden: https://security.stackexchange.com/questions/14505/can-i-trust-the-source-ip-of-an-http-request. Besser 3 Jahre später als nie, denke ich. – nageeb

17

Mandrill Unterschrift wird in den HTTP-Antwort-Header zu finden: Authenticating-webhook-requests

im Request-Header finden: X-Mandrill-Signature. Dies ist eine Base64 des Hashcodes, die mit einem Web-Hook-Schlüssel signiert wurde. Dieser Schlüssel ist nur für Ihren Webhook geheim.

0

205.201.136.0/16

Ich habe die weiße Liste gesetzt sie nur in Firewall meinen Server.

2

einfach die Konstanten ersetzen und diese Funktion verwenden:

<?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

Wie docs in Mandrills beschrieben, bieten sie eine Unterschrift zu überprüfen, ob die Anfrage von ihnen wirklich kam. die Anfrage gibt es ein paar Schritte zu bauen:

  1. Start mit der genauen URL Ihrer Webhook (mind Schrägstriche und params)
  2. sortieren die Post Variablen durch Schlüssel (im Falle von Mandrill, werden Sie nur eine haben Post-Parameter: mandrill_events)
  3. hinzufügen Schlüssel und Wert auf die uRL, ohne Begrenzer
  4. hmac die uRL mit Ihrem geheimen Schlüssel (können Sie den Schlüssel aus dem Web-Interface) und base64 es.
  5. vergleichen das Ergebnis mit dem X-Mandrill-Signature Header

hier ist eine Beispielimplementierung in Python:

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")