我不认为我希望做的事情是可能的。我会描述这个想法。
用户请求foo.com
并获取带脚本的html页面。该脚本向bar.com
发出CORS请求。 bar.com上的服务器限制访问真正来自foo.com提供的脚本的/
请求。有没有办法让服务器可以安全地推断出请求真的来自foo.com上的脚本?
Referer
和Origin
标头包含我想要使用的信息。但是,显然这些很容易被伪造。
bar.com是否有可信赖的方面可以根据请求的来源更改其行为?
假设我可以控制foo.com上的脚本和bar.com上的服务器。有什么方法可以在脚本中插入一些无法由模仿脚本的攻击者重放/伪造的东西吗?攻击者可以访问该脚本,因为假设foo.com是公开的。
任何想法或讨论都将不胜感激。
答案 0 :(得分:2)
Origin
检查的目的是阻止第三方攻击者强制目标用户的浏览器执行危险操作。 (并且Referer
做得更差,甚至更不可能有任何价值。)
但您无法阻止用户自己通过使用浏览器发送任何类型的请求。即使你以某种方式使他们无法发送一个不准确的Origin
标题,他们仍然可能会干扰foo.com
页面内脚本的整个操作(例如使用F12调试器)来制作它在foo.com
发送Origin
时,做一些你不想要的事情。
你不能依赖发送用户执行的脚本而不做更改,你不能依赖发送用户保密的脚本内的信息,你不能确定请求是否来自真正的浏览器。
用户完全控制客户端环境,因此您需要设计信任模型。其影响取决于您尝试执行的操作,但可能的通用授权方案是创建一个令牌,表示允许用户对bar.com
执行哪些操作,并使用{上的密钥对其进行签名{1}},然后在执行CORS请求时将签名的令牌提供给用户以传递给foo.com
。