Laravel/PHP 多个表单提交(多次点击提交按钮)
Laravel/PHP multiple form submissions (multiple click on submit button)
由于提交了多个表单,我遇到了一些问题。
我正在使用 laravel 作为框架并创建浏览器游戏(我知道,有数百万)只是为了好玩。
我有一个建筑页面,其中有一个按钮 "Construct",它在一个表单中(方法="post")。
如果我按住 Enter 4-5 秒,将触发许多请求,用户可以在数据库中创建许多记录。
我不想要像
这样的唯一客户端修复
$(document).on('submit', 'form', function() {
$(this).find('button:submit, input:submit').attr('disabled', 'disabled);
});
因为从不信任客户。
这里有人有解决方案吗(也许 laravel)?
提前致谢。
此致。
您可以使用 csrf 令牌在服务器端控制它。您的表单将有一个用于防止 cross-site 请求伪造的令牌,您可以在控制器中访问此令牌以唯一标识客户端。当请求到达控制器时,您可以检查客户端是否第一次发送请求。如果不是第一次可以return回来。
示例:-
public function construct(Request $request){
$token = $request->_token;
//check weather the token already exists or not, using db or session
if(exists){
return;
}
}
"Generate a random token. Put token in session. Put token in form as hidden field. On submit if token received is equal to the one in session do all the stuff on database and delete token from session."
"Using middleware for route group (laravel.com/docs/5.6/routing#route-group-middleware) you can View::share (laravel.com/docs/5.6/views#sharing-data-with-all-views) a random token and save on session."
感谢@assistbss
由于提交了多个表单,我遇到了一些问题。 我正在使用 laravel 作为框架并创建浏览器游戏(我知道,有数百万)只是为了好玩。
我有一个建筑页面,其中有一个按钮 "Construct",它在一个表单中(方法="post")。
如果我按住 Enter 4-5 秒,将触发许多请求,用户可以在数据库中创建许多记录。
我不想要像
这样的唯一客户端修复$(document).on('submit', 'form', function() {
$(this).find('button:submit, input:submit').attr('disabled', 'disabled);
});
因为从不信任客户。
这里有人有解决方案吗(也许 laravel)?
提前致谢。
此致。
您可以使用 csrf 令牌在服务器端控制它。您的表单将有一个用于防止 cross-site 请求伪造的令牌,您可以在控制器中访问此令牌以唯一标识客户端。当请求到达控制器时,您可以检查客户端是否第一次发送请求。如果不是第一次可以return回来。 示例:-
public function construct(Request $request){
$token = $request->_token;
//check weather the token already exists or not, using db or session
if(exists){
return;
}
}
"Generate a random token. Put token in session. Put token in form as hidden field. On submit if token received is equal to the one in session do all the stuff on database and delete token from session."
"Using middleware for route group (laravel.com/docs/5.6/routing#route-group-middleware) you can View::share (laravel.com/docs/5.6/views#sharing-data-with-all-views) a random token and save on session."
感谢@assistbss