Php Octobercms-表单上的CSRF保护,以防止多次提交

Php Octobercms-表单上的CSRF保护,以防止多次提交,php,laravel,csrf,octobercms,Php,Laravel,Csrf,Octobercms,我有一个带有表单的组件,然后编写代码来处理提交。问题是,如果我垃圾邮件按钮,它将提交表单多次。解决方法是通过Javascript添加禁用状态,以防止用户执行此操作 出于安全原因,我根本不希望发生这种情况,并阻止服务器端。我有一个令牌,在配置中我启用了CSRF 'enableCsrfProtection' => true, 这是我的表格 {{ form_open({ request: 'onSubmit' }) }} <div class="form-gro

我有一个带有表单的组件,然后编写代码来处理提交。问题是,如果我垃圾邮件按钮,它将提交表单多次。解决方法是通过Javascript添加禁用状态,以防止用户执行此操作

出于安全原因,我根本不希望发生这种情况,并阻止服务器端。我有一个令牌,在配置中我启用了CSRF

'enableCsrfProtection' => true,
这是我的表格

{{ form_open({ request: 'onSubmit' }) }}

            <div class="form-group">
                <label class="control-label" for="subject_name">Subject's name</label>
                <input id="subject_name" name="subject_name" type="text" placeholder="" class="form-control input-md" required="">

            </div>

            <div class="form-group">
                <label class="control-label">Postcode</label>
                <input id="postcode"  name="postcode" class="form-control input-md" type="text" required>
            </div>

            <div class="form-group">
                <button id="submit" type="submit" value="submit" class="btn btn-lg btn-gold pull-right"><i class="fa fa-lock"></i> Request Job</button>
            </div>

 </form>

然而,我垃圾邮件提交按钮,它将执行多次。如何添加只执行一次的功能?

对于您想要执行的操作,有许多解决方案

我的建议最有说服力的解决方案是重定向或ajax更新。通过将表单替换为“请求已提交。谢谢”的消息,与用户进行沟通。这将阻止用户通过“提交”按钮发送垃圾邮件


你可以像Magnus建议的那样做一些事情。确保包含时间戳,以便在一段时间后将其删除

你需要的是一个加载器


请求工作

CSRF保护与多次提交无关。如果您只想停止多个提交,只需设置一个会话值,如:
session::set('form_posted',true),然后在开头添加一个检查,检查是否已设置。设置好了,什么都不要做。@MagnusEriksson如果我能在每个请求上强制一个新的令牌,那就不太好了。你建议我怎么做才能阻止它多次提交?我不喜欢每次请求都刷新令牌,因为这会给用户带来恼人的问题。示例:用户打开您的站点。然后单击链接并在新选项卡中打开它。然后,返回到第一个选项卡并尝试发布表单,但是CSRF现在无效,因为您已经在另一个选项卡中刷新了它。@MagnusEriksson很好。那个么,会议是最好的方式吗?只是想,如果他们想在同一个会话中提交另一个请求,他们将无法这样做。我只想在一分钟左右的时间内停止执行多次。这会归结为设置时间戳吗?这肯定会起作用。如果会话不存在或时间戳超过x分钟,请处理提交的信息,否则,返回一些错误消息或其他信息。但这不会阻止他们在不同的浏览器和/或匿名模式下多次发布。但这是一个更难解决的问题。
<input name="_handler" type="hidden" value="onSubmit">
<input name="_session_key" type="hidden" value="7Eg9bK4pcT2NOgWwUS0UFUckjkSMRC1UDBkBhPwO">
<input name="_token" type="hidden" value="00nbkK3EAo2I8WGWSh85qkMjHYig6aldrd3oe8HZ">
public function onSubmit()
{

    $name = post('subject_name');
    $postcode = post('postcode');

    if (Session::token() != Input::get('_token')) 
    { 

        /* Invalid token */ 
        return print('Token invalid');

    }

    $job = new Job;
    $job = $job->name = $name;
    $job = $job->postcode = $postcode;
    $job->save();

}
<div class="loading-indicator-container">

    <button id="submit" type="submit" value="submit" data-load-indicator="Saving..." class="btn btn-lg btn-gold pull-right"><i class="fa fa-lock"></i> Request Job</button>
</div>