2013-04-26 7 views

risposta

9

Abbiamo una gamma di IP utilizzati per i webhook, ma possono (e probabilmente lo faranno) cambiare o aggiungerne di nuovi quando scaliamo. Un'alternativa sarebbe aggiungere una stringa di query all'URL webhook che aggiungi in Mandrill e quindi controllare la stringa di query quando arriva un POST in modo da poter verificare che provenga da Mandrill.

+0

Oh sì, bello ed efficiente idea. Per gli altri, si tratta di informazioni sui metadati. È un pontile per il quale non mi piace il tuo post per ora :). Grazie – devside

+0

Gli IP non possono essere falsificati! – ankitjaininfo

+0

@ankitjaininfo Inciampato su questa domanda e il tuo commento ha suscitato la mia curiosità. Il mio primo istinto era quello di "non facilmente". Poi ho trovato questo post su IT Security Stack Exchange: https://security.stackexchange.com/questions/14505/can-i-trust-the-source-ip-of-an-http-request. Meglio 3 anni di ritardo che mai, immagino. – nageeb

17

firma di Mandrillo si trova nell'intestazione della risposta HTTP: Authenticating-webhook-requests

in Trova richiesta di intestazione: X-Mandrill-Signature. Questa è una base64 dell'hashcode, firmata usando la chiave di aggancio del web. Questa chiave è riservata solo al tuo webhook.

0

205.201.136.0/16

ho appena li whitelist nel firewall del mio server.

2

Basta sostituire le costanti e utilizzare questa funzione:

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

Come descritto nel mandrillo di docs, che forniscono una firma per verificare se la richiesta è venuto veramente da loro. per costruire la richiesta ci sono a pochi passi:

  1. inizio con l'esatto URL del vostro webhook (barre mente e params)
  2. sorta variabili messaggio da chiave (in caso di mandrillo, avrete un solo parametro postale: mandrill_events)
  3. aggiungono chiave e il valore per l'url, senza alcun delimitatore
  4. hmac l'URL con la chiave segreta (è possibile ottenere la chiave dal web-interfaccia) e base64 IT.
  5. confrontare il risultato con il colpo di testa X-Mandrill-Signature

qui c'è un esempio di implementazione 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")