想象一个带有登录表单的通用 Web 应用程序来访问该应用程序。不管实际的身份验证是如何执行的,不检查引用标头以验证提交请求来自相同的应用程序/域/批准的 URL 有什么影响?
考虑这一点的另一种方法是,如果您放弃引用标头检查并正在检查验证其来自已知来源的内容。不检查表单数据源有什么影响?
特别是在被动情况下,例如纯粹基于浏览器。
我看到的最大含义是我可以从另一个站点提交凭据并成功登录。
但这有什么风险呢?我意识到这取决于每个应用程序及其威胁模型,但这可以概括吗?
想象一个带有登录表单的通用 Web 应用程序来访问该应用程序。不管实际的身份验证是如何执行的,不检查引用标头以验证提交请求来自相同的应用程序/域/批准的 URL 有什么影响?
考虑这一点的另一种方法是,如果您放弃引用标头检查并正在检查验证其来自已知来源的内容。不检查表单数据源有什么影响?
特别是在被动情况下,例如纯粹基于浏览器。
我看到的最大含义是我可以从另一个站点提交凭据并成功登录。
但这有什么风险呢?我意识到这取决于每个应用程序及其威胁模型,但这可以概括吗?
CSRF攻击试图利用“站点对用户浏览器的信任”(维基百科页面如此说,而且说得好)。它是关于服务器接受来自客户端的请求,由于请求带有一些身份验证特征,这使服务器相信它来自真实用户(它确实如此)并且在真实用户的有意识控制下(它是假的)。“身份验证特征”通常是一个 cookie 值(服务器可接受),或带有基于证书的客户端身份验证的 HTTPS。
对于登录页面,服务器不信任来自客户端的请求。这就是登录页面的重点:初始化信任。登录页面需要登录名和密码,正是因为请求不会附带任何内容,这将使服务器更快乐并分散其预期的操作,即验证登录名+密码对。因此,CSRF 攻击不适用于此页面。
您仍然可以检查该Referer字段以检查“可疑业务”(如果缺少或错误,则肯定有问题),但这不会真正改变安全性。
验证它的含义是什么?引用标头:
您的浏览器出于礼貌发送了引用标头,这不是 HTTP RFC 要求。有关标头的详细信息,请参见此处:http: //www.w3.org/Protocols/HTTP/HTRQ_Headers.html#z14。
因此,很明显,此标头没有任何价值,也不应作为任何东西的保证。此外,任何足够聪明的人都可以欺骗这一点。如果您想要真正保证您的登录表单数据确实来自您的登录表单,请构建一个检查以尝试查找唯一的、随机生成的、基于用户(或基于导航器)的值。这将比 Referer 标头更可靠(但取决于实现,不一定是防弹的)。
对于登录表单 - 不是那么多。最可能发生的情况是,像 Facebook 这样的知名网站可能会变得流氓,并使用他们客户的机器(通过来自由 javascript 触发的嵌入式表单的 POST 请求)作为类似僵尸网络的实体的一部分来暴力破解您的登录表单。
但这不太可能,所以在登录时不检查引荐来源是没有问题的。
请注意,网站的其余部分,在登录后,应该检查任何类型的请求(GET 或 POST)的引荐来源网址有副作用。否则,我可以创建一个具有嵌入式 iframe 的网站,其内容如下:
<form method=post action="www.yoursite.com/makepayment.php">
<input type=hidden name="to" value="123453323">
<input type=hidden name="amount" value="$10000">
</form>
和 JS 触发表单,提交一个 POST 请求,将钱从你转移给我(或其他)。
您想避免这种情况,因此请检查那里的推荐人。
更好的是,在<input type=hidden>具有副作用的页面上的每个表单中使用 CSRF 令牌(在一小段时间内附加到特定帐户的临时令牌)(即,不仅加载新页面,而且还会发生变异存储在服务器或其他地方的数据)