验证重定向是否来自特定域的最安全方法是什么?

What is the most secure way to verify a redirect is coming from a specific domain?

我们当前的项目有一家合作伙伴公司想要重定向到我们的网站并继续 我们网站上的旅程。他们将连同重定向一起发送登录用户的数据。

确保重定向来自该特定域并安全发送数据的最佳方法是什么。

我在考虑在查询字符串中使用 HTTP 引用 header 和加密数据?

along with encrypted data in the query string?

只有当客户端或原始服务器已经向您发送了解密所需的信息时,才会安全地工作——如果客户端知道如何解密,客户端可能会篡改数据,并篡改请求headers,允许他们到达第二个站点,尽管他们不是来自第一个站点。 (是的,HTTP 引荐来源 can be forged. 一般来说,在 client-side 上所做的任何事情都是不可信的。)

安全方法是,当发件人站点确定经过身份验证的用户可以被授权重定向到您的站点时,让发件人站点发送一个server-side 请求到您网站的后端,当然是加密的。您的后端可以将信息或令牌保存在数据库中,然后告诉原始站点请求已成功。然后原始站点可以与客户沟通,他们可以重定向到您的站点。当客户端访问您的站点时,在您的数据库中查找(加密的)令牌以确保此类请求是在过去几秒钟内发出的,并且该令牌之前未被使用过。

设置所有 cross-site 通信确实需要一些努力,但完成后,您可以确定只有允许的用户才能获得原始站点的授权.

在两个应用程序之间集成 SSO(单点登录)的理想方式是使用 SAML、OAuth 等企业集成技术。

如果不可能,他们应该向用户发送一个唯一令牌 (GUID/UUID)

您的代码随后会在合作伙伴应用的服务器上调用 URL 来验证令牌并获取用户的身份。

这将确保用户的身份在重定向请求中不会被篡改。

用户的身份信息不应作为 HTTP(S) 请求的一部分传递,因为这可以通过使用 burp 或 fiddler 等代理工具 tampered/changed

实现此目的的一种方法是在两个应用程序之间实施 SSO。如果您使用 SAML SSO,您始终可以使用证书以及签名和验证来往数据来保护重定向。