当前位置: 首页 > 面试题库 >

每个请求是否有新的CSRF令牌?

唐宇定
2023-03-14
问题内容

因此,我四处阅读,对于拥有CSRF令牌感到非常困惑,但是我应该为每个请求还是每小时生成一个新令牌?

$data['token'] = md5(uniqid(rand(), true));
$_SESSION['token'] = $data['token'];

但是,我们最好每小时生成一个令牌,然后我需要两个会话:令牌,到期,

我将如何处理该表格?只需将echo $ _SESSION [‘token’]放在隐藏值表单上,然后在提交时进行比较?


问题答案:

如果您按照表单请求进行操作-那么基本上就可以消除CSRF攻击的发生,并且可以解决另一个常见问题:提交多表单

简而言之-如果用户在提交之前询问表单,则您的应用程序将仅接受表单输入。

正常情况: 用户A进入您的网站,并要求提供表单A,并获得表单A以及表单​​A的唯一代码。用户提交表单A时,他/她必须包括仅用于表单A的唯一代码。

CSRF攻击情形:
用户A进入您的网站,并要求提供表格A。与此同时,他们访问了另一个“不良”网站,该网站尝试对他们进行CSRF攻击,使他们提交了伪造的表格B。

但是您的网站知道用户A从未要求过表单B-
因此,即使他们具有表单A的唯一代码,表单B也将被拒绝,因为他们没有表单B的唯一代码,只有表单A的代码。您的用户很安全,晚上可以入睡。

但是,如果您将其用作通用令牌,并且持续了一个小时(如您在上面发布的内容),则上述攻击可能会起作用,在这种情况下,CSRF保护并没有取得太大的成就。这是因为应用程序不知道最初从未要求过表格B。它是一个通用令牌。CSRF预防的整个要点是使每个表单令牌对于该表单都是唯一的

编辑:因为您需要更多信息:
1-您不必每次表单请求都要做,您可以按小时/会话等进行。要点是提供给用户的秘密值,在返回时会重新提交。另一个网站不知道该值,因此不能提交错误的表格。

因此,您可以根据请求或会话生成令牌:

// Before rendering the page:
$data['my_token'] = md5(uniqid(rand(), true));
$_SESSION['my_token'] = $data['my_token'];

// During page rendering:
<input type="hidden" name="my_token" id="my_token" value="<? php echo $_SESSION['my_token']?>" />

// After they click submit, when checking form:
if ($_POST['my_token'] === $_SESSION['my_token'])
{
        // was ok
}
else
{
          // was bad!!!
}

并且因为它是“按表单”的-您不会收到双份表单的提交-因为您可以在首次提交表单后擦除令牌!



 类似资料:
  • 我在自己的Web API上使用Oauth2,在Web应用程序上使用ASP.NET C#来使用该API。在我的web应用程序上,我正在进行HttpWebRequests。当我的访问令牌过期时,我调用一个方法“refreshToken”,该方法发出请求以获取新的访问令牌。这工作很好,没有问题...除了我得到的响应包含一个新的刷新令牌???我在等新的访问令牌。我甚至认为在没有再次传递凭据的情况下这是不可

  • 我遇到了CodeIgniter/CSRF/JSON的问题。 我正在向PHP后端发送内容类型为“application/json”的http POST请求。有效负载是json数据。我将与数据一起传递生成并存储在CSRF cookie中的CSRF令牌。对于标准POST表单请求,它工作正常,但作为json发送时失败。 由于$\u POST数组因JSON内容类型而为空,CodeIgniter无法验证coo

  • 概述 我将使用API网关作为基于Spring Security性的身份验证。我刚刚按照https://spring.io/guides/tutorials/spring-security-and-angular-js/链接中的步骤创建了一个基于其对应的github项目的“对双”模块的项目https://github.com/spring-guides/tut-spring-security-and

  • 我在Spring5(Boot2)RESTful web服务中配置了CSRF保护,因为我希望防止CSRF攻击(我使用cookie进行身份验证和授权)。在每个请求中,我都会得到一个新的cookie。我通过标头发回的cookie的值。 我注意到、和方法需要此标记的值(在标头中)才能正常工作,但是方法没有标头也可以正常工作。 这种行为是故意的,因为方法不应该改变状态,还是我做错了什么?

  • 我一直有一个问题,当请求来自域名而不是localhost时,会话变量不可用。例如,如果我设置一个用户变量: 当客户端发出另一个请求并且我尝试访问用户会话变量时,它返回null。 我注意到,在每个请求中,都会设置一个新的JSESSIONID cookie,并且ID值会更改。这是否意味着每次客户端访问服务器时都会创建一个新会话?如何在客户端之间保持相同的会话,以便我可以在Http会话中存储对象并访问它

  • 我尝试分析一个gRPC java服务器。我主要看到下面的一组线程池。 null