使用请求的 "UserAgent" 来识别请求的来源有多安全或危险?

How safe or dangerous it is to use "UserAgent" of the request to identify the origin of the request?

我正在开发一种 SMS 服务,它使用 Twilio 作为 SMS 提供程序向目标号码发送 SMS。 Twilio 假设在消息状态更新(即已发送、已送达等)时向我的 Web 服务发送 POST 请求。

为了确保 POST 请求不是由 Twilio 以外的任何人发送的,我正在验证请求的 UserAgent,如下所示。

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

目前,我在每个 POST 操作中将 "TwilioProxy/1.0" 作为用户代理,我相信将来可以更改版本号,因此我已将其从验证中跳过。

是否可以从除 Twilio 以外的任何其他来源接收具有相同用户代理(以 "TwilioProxy/" 开头)的请求?依赖 UserAgent 进行此类验证是否安全?

对此的任何意见/建议都会对我很有帮助。

谢谢

这里是 Twilio 开发人员布道者。

正如评论所提到的,欺骗 header 是微不足道的,并且由于 Twilio 的 UserAgent header 非常简单,因此依赖它是不可靠的。

但是,如果您有兴趣验证请求是由 Twilio 发出的,那么您需要查看我们如何 sign requests 以确保它们不是恶意的。

工作原理如下:

  1. 在您的服务器上打开 TLS 并将您的 Twilio 帐户配置为使用 HTTPS url。
  2. Twilio 将其请求组装到您的应用程序,包括最终 URL 和任何 POST 字段(如果请求是 POST)。
  3. 如果您的请求是 POST,Twilio 将获取所有 POST 字段,按名称的字母顺序对它们进行排序,并将参数名称和值连接到 [=70] 的末尾=](没有定界符)。
  4. Twilio 获取结果字符串(带有查询字符串和所有 POST 参数的完整 URL)并使用 HMAC-SHA1 和您的 AuthToken 作为密钥对其进行签名。
  5. Twilio 在名为 X-Twilio-Signature
  6. 的 HTTP header 中发送此签名

然后要验证此 X-Twilio-Signature 是否包含有效签名,您需要在应用程序中执行以下操作:

  1. 获取您为 phone 号码或应用指定的请求 URL 的完整 URL,从协议 (https...) 到查询字符串的末尾(? 之后的所有内容)。
  2. 如果请求是 POST,请按字母顺序对所有 POST 参数进行排序(使用 Unix-style case-sensitive 排序顺序)。
  3. 遍历 POST 参数的排序列表,并将变量名称和值(无分隔符)附加到 URL 字符串的末尾。
  4. 使用您的 AuthToken 作为密钥使用 HMAC-SHA1 对生成的字符串进行签名(请记住,您的 AuthToken 的大小写很重要!)。
  5. Base64 编码生成的哈希值。
  6. 将您的哈希值与我们在 X-Twilio-Signature header 中提交的哈希值进行比较。如果它们匹配,那么你就可以开始了。

在我们的官方库中,我们包含一个请求验证器,可以为您完成所有这些工作。 There is an example of doing this in C# in the documentation.

如果这有帮助,请告诉我。