2017-05-23 4 views
1

私はSMSプロバイダとしてTwilioを使用して宛先番号にSMSを送信するSMSサービスを開発しています。 Twilioは、メッセージのステータスが更新(送信、配信など)されたときに、自分のWebサービスにPOSTリクエストを送信することを想定しています。リクエストの発信元を特定するためにリクエストの「UserAgent」を使用するのはどのように安全か危険でしょうか?

Twilio以外の人がPOST要求を送信していないことを確認するために、以下のようにリクエストのUserAgentを検証しています。

If ((HttpRequest)request.OriginalRequest).UserAgent.StartsWith("TwilioProxy/")) 
     { 
      return true; 
     } 

現在、私は、私は、バージョン番号は、将来的に変更することができると信じてPOSTアクション、のそれぞれにおけるユーザエージェントとして「TwilioProxy/1.0」を取得していますので、私は、検証からそれをスキップしています。

Twilio以外の任意の起点から同じユーザエージェント(「TwilioProxy /」に始まるもの)を使用してリクエストを受け取ることはできますか?このタイプの検証にUserAgentを使用するのは安全ですか?

これに関する入力/提案は、私にとって大きな助けになります。

ありがとうございました

+2

これを偽装するのは非常に簡単です。私はそれをなりすましと呼んでいません。一部のブラウザには、任意の文字列を入力できる設定があります。 –

+2

ええ、ユーザーエージェントを偽装するのはまったく簡単です。確かに、これはあいまいさによるセキュリティですが、成功したリクエストと拒否されたリクエストの違いを見て、ユーザエージェント文字列が要因かもしれないと結論づけるのは、誰もが長くかかりません。 –

+0

ただし、ユーザーエージェント文字列に "B1TCH3ZZZZ!1 !!"という部分文字列が含まれている場合、クライアントは実際にNapoleon Bonaparteではありません。 –

答えて

1

Twilioの開発者エバンジェリストです。

コメントで言及したように、ヘッダーをスプーフィングするのは簡単で、TwilioのUserAgentヘッダーは非常に単純なので、信頼性が低いです。

しかし、Twilioによってリクエストが行われたことを確認するには、sign requestsがどのように悪意のあるかを確認する必要があります。サーバー上のTLS上

  1. 電源を入れて、HTTPS URLを使用するようにTwilioアカウントを設定します。

    は、ここでそれがどのように動作するかです。

  2. Twilioは、リクエストがPOSTの場合、最終URLとPOSTフィールドを含め、リクエストをアプリケーションに組み込みます。
  3. リクエストがPOSTの場合、TwilioはすべてのPOSTフィールドを取り、その名前でアルファベット順にソートし、パラメータ名と値をURLの最後(区切り文字なし)に連結します。
  4. Twilioは結果の文字列(クエリ文字列とPOSTパラメータを含む完全なURL)を取得し、HMAC-SHA1とAuthTokenをキーとして署名します。
  5. TwilioはこのX-Twilio-Signatureは、有効な署名が含まれていることを確認するために、次にX-Twilio-署名

と呼ばれるHTTPヘッダにこの署名を送信し、アプリケーションで次の操作を実行する必要があります。

  1. プロトコル(https ...)からクエリ文字列の最後まで(?の後ろのすべて)まで、電話番号またはアプリに指定したリクエストURLの完全なURLを取得します。
  2. リクエストがPOSTの場合、すべてのPOSTパラメータをアルファベット順にソートします(Unixスタイルの大文字小文字を区別したソート順を使用)。
  3. POSTパラメータのソート済みリストを繰り返し、URL文字列の最後に変数名と値(区切り文字なし)を追加します。
  4. AuthTokenをキーとしてHMAC-SHA1で結果の文字列に署名します(AuthTokenの場合は重要です)。
  5. 結果のハッシュ値をBase64でエンコードします。
  6. X-Twilio-Signatureヘッダーで送信されたハッシュと比較してください。彼らが合っていれば、あなたは良いことです。

私たちの公式図書館には、このすべてを行うことができるリクエストバリデーターが含まれています。 There is an example of doing this in C# in the documentation

これがまったく役に立ったら教えてください。

関連する問題