首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >会话写得不够快,无法防止后端提交重复的表单。(Laravel)

会话写得不够快,无法防止后端提交重复的表单。(Laravel)
EN

Stack Overflow用户
提问于 2019-10-31 13:01:53
回答 2查看 346关注 0票数 0

我有一个createOrder请求,目前有点慢(大约3-4秒)。我试图防止使用CSRF令牌或自定义令牌提交重复表单。

在这种情况下,我使用的是一个文件驱动程序.因此,这很可能是问题所在,但我还没有将这些代码推入生产服务器,因为它不是按照预期工作的。

它的工作方式如下:

  • 令牌被添加到隐藏的"custom_token"字段中的会话和提交表单中。
  • 表单被提交,在中间件或控制器本身中,我们进行快速比较。

代码语言:javascript
复制
if(! hash_equals($request->session()->get('custom_token'), $request->custom_token)){
    flash()->error('Order placed twice');
    return redirect('/checkout/thank-you');
}

$request->session()->put('custom_token', Str::random(40));

  • 如果它们不匹配,我们会快速重定向(Flash消息目前仅用于调试).

如果我将主create调用从控制器(即慢位)中删除,那么上面的内容就可以了,但是包含这个部分,hash_equals总是返回true。

所以我的问题是:

如果是这样的话,会话文件driver?

  • Surely的更新速度缓慢会导致
  1. 吗?即使在生产环境中,happening.
  2. Is仍然存在一些风险--我可以更好地防止在后端提交重复表单?
EN

回答 2

Stack Overflow用户

发布于 2019-10-31 14:49:08

有几件事,首先我要弄清楚为什么你的createOrder花了这么长时间,3到4秒是很长的时间。使用队列(https://laravel.com/docs/5.8/queues)并处理其中的大部分工作。

如果将您的解决方案放置在控制器的开头,您的解决方案应该工作得很好。我可能很厚,但您想要拒绝散列匹配的那些,所以您需要删除!

代码语言:javascript
复制
if(hash_equals($request->session()->get('custom_token'), $request->custom_token)){
    flash()->error('Order placed twice');
    return redirect('/checkout/thank-you');
}

$request->session()->put('custom_token', Str::random(40));

我假设您正在创建您的散列,存储它并将其传递给您的表单,并且它正在正确地返回到$request中的控制器?尝试将custom_token设置为类似于“fred_bloggs”的内容,只需确保它是正确的。

票数 1
EN

Stack Overflow用户

发布于 2019-10-31 13:07:07

尝试在控制器代码中使用具有以下Try捕获的事务:

代码语言:javascript
复制
try{
   \DB::beginTransaction(); //initiate the transaction and lock the database or table
   //execute your desired code here

   \DB::commit(); //commit the changes and unlock the database or table
}catch(\Exception $e){
   \DB::rollback(); //revert to original state if something goes wrong
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58643960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档