gpt4 book ai didi

php - X-Requested-With header 服务器检查是否足以防止 ajax 驱动的应用程序的 CSRF?

转载 作者:IT王子 更新时间:2023-10-28 23:45:54 25 4
gpt4 key购买 nike

我正在开发一个完全由 ajax 驱动的应用程序,其中所有请求都通过基本上相当于一个主 Controller 的东西传递,它的基本结构看起来像这样:

if(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
fetch($page);
}

这通常足以防止跨站点请求伪造吗?

当整个页面不随每个请求刷新时,使用轮换 token 是相当不方便的。

我想我可以在每个请求中将唯一 token 作为全局 javascript 变量进行传递和更新——但不知怎的,这感觉很笨拙,而且无论如何看起来本质上都是不安全的。

编辑 - 也许静态 token (如用户的 UUID)总比没有好?

编辑 #2 - 正如 The Rook 所指出的,这可能是一个令人毛骨悚然的问题。我读过两种猜测,并听到遥远的窃窃私语,说旧版本的闪存可用于此类恶作剧。由于我对此一无所知,因此我悬赏任何可以解释这是 CSRF 风险的人。否则,我会把它交给 Artefacto。谢谢。

最佳答案

我会说这就足够了。如果允许跨域请求,无论如何你都注定失败,因为攻击者可以使用 Javascript 获取 CSRF token 并在伪造的请求中使用它。

静态 token 不是一个好主意。每个 session 应至少生成一次 token 。

EDIT2 Mike 毕竟不对,抱歉。我没有正确阅读链接到的页面。它说:

A simple cross-site request is one that: [...] Does not set custom headers with the HTTP Request (such as X-Modified, etc.)

因此,如果你设置了X-Requested-With,请求必须是pre-flown,除非你响应pre-flight OPTIONS请求授权交叉-站点请求,它不会通过。

编辑 Mike 是对的,从 Firefox 3.5 开始,跨站点 XMLHttpRequests 是 permitted .因此,您还必须检查 Origin header (如果存在)是否与您的站点匹配。

if (array_key_exists('HTTP_ORIGIN', $_SERVER)) {
if (preg_match('#^https?://myserver.com$#', $_SERVER['HTTP_ORIGIN'])
doStuff();
}
elseif (array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER) &&
(strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'))
doStuff();

关于php - X-Requested-With header 服务器检查是否足以防止 ajax 驱动的应用程序的 CSRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3315914/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com