使用Perl(CGI)避免用户提交表单两次

时间:2012-07-16 12:27:39

标签: perl security http-headers cgi double-submit-problem

我正在编写一个接收POST方法提交的小型Perl页面。我希望能够防止单个人/计算机多次提交表单(以避免因重复提交而泛滥)。但我在Perl CGI中找不到任何关于如何做到这一点的例子或解释。你能告诉或指导我一些例子吗? 我知道我可以在第一次提交后使用HTTP标头中的一些数据(令牌?)和/或种植一个cookie,但我不确定如何。

任何帮助将不胜感激。 最好的祝福, -Arseny

1 个答案:

答案 0 :(得分:1)

避免用户多次点击按钮的最简单方法是在页面中添加一些Javascript。那将不适用于脚本或按 F5

<input type="submit" name="go" id="go" value="go" onclick="this.disabled='disabled'"/>

您还可以在服务器上编写一个日志文件/数据库,其中包含用户的IP地址和时间戳,并检查他是否已经提交。除了设置和检查cookie之外,这样做可能是最佳选择。

对于Cookie,请参阅CGI文档中的cookies。简单的例子:

use strict; use warnings;
use CGI;

my $q = new CGI;

my $submitted = 0;
if ($q->cookie('submitted ')) {
  $submitted = 1;
}
# Here you could place the file/db check to also set $voted
if ($submitted) {
  print $q->header('text/plain');
  print "You have already submitted!";
} else {
  # Do stuff with the form, like $q->param('foo')...
  # Once you're done, place the cookie
  print $q->header(
    -type   => 'text/plain', 
    -cookie => $q->cookie(
      -name    => 'submitted',
      -value   => 1,
      -expires => '+1y',
  ));
}