|
1
3
一方面,你说“我只希望远程请求能够来自我特别允许的远程站点”,但使用JSONP意味着你不会看到来自远程站点的请求——你会看到来自访问远程站点的浏览器的请求。这种区别是微妙但重要的,因为它严重限制了你的选择。 如果您想知道是哪个站点发起了JSONP请求,可以检查Referer标头。除了您不能依赖于它的设置,尤其是在HTTP/HTTPS转换中。然后你可能会想“嘿,我会用 CORS “,但当然,任何人都可以用他们想要的任何标头创建请求。我可以编写一个声称是你的远程站点之一的HTTP客户端,并用他们的凭据访问你的界面——所以,如果标头是限制访问的唯一方法,请知道它很容易被击败。 Referer头上的下一步是发布令牌并使用这些令牌进行识别。但是,正如您所指出的,远程站点必须将其提供给浏览器,浏览器才能创建请求。所以,有人可以复制它并在任何地方使用它。回到同一个问题。 您可以做的下一件事是发布令牌(用于标识)和共享机密(用于授权)。然后,您可以要求远程站点使用共享机密来签署请求——说“是的,实际上是我,远程站点”。通过这种方式,远程站点为用户的浏览器提供 签名 ,但不是秘密本身。你需要确保你签署的内容足以验证远程网站的意图(即网站希望用户浏览器执行的任何操作),并且它应该包括一个时间戳,以防止重放攻击。这需要来自远程站点的一些服务器端计算,但会阻止用户采取任何操作,除非远程站点明确允许。 然而你提到这些远程站点上的用户没有帐户。如果这意味着它们对公众可用,那么任何人都可以获取其中一个远程网站,提取签名,并自己使用它来做远程网站用户可以做的事情。这不是实现的问题,而是架构的问题:你的设计需要随机的web浏览器来与你的服务交互,根本没有办法阻止 man-in-the-middle 。使用共享的秘密可以让你有一定程度的控制,但你无法阻止它。 在这一点上,我建议你退一步,考虑一下你实际上试图解决的问题。这个接口的作用是什么?这些远程网站上的浏览器需要直接与您对接吗?你想把谁挡在门外,为什么?如果他们绕过你的支票怎么办? |
![]() |
James Williams · 如何在单击按钮时刷新div内容 2 年前 |
![]() |
Mehmet · javascript执行了多个 2 年前 |
![]() |
Shijil · 尝试在Jquery PHP搜索代码中添加选择标记功能 2 年前 |
![]() |
Parker · 如何使表格行的单元格项加粗n秒? 3 年前 |
![]() |
Chris J. · ajax获取查找数据属性值的请求 3 年前 |
![]() |
Pedro F · Ajax调用后脚本运行不正常 3 年前 |