在HTML表单中创建随机字段

时间:2013-09-21 04:43:12

标签: php html forms random

我有以下代码来生成随机字符串

function generateRandomString($length = 10) {
  $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $randomString = '';
  for ($i = 0; $i < $length; $i++) {
    $randomString .= $characters[rand(0, strlen($characters) - 1)];
  }
  return $randomString;
}
$s= generateRandomString();

并且有一个HTML表单,其中name字段获取该表单中的随机字符串

<input type="text" maxlength="10" name="<?php echo $s;?>" class="tracer-number-input"/>

现在,当我使用此

时,如何确保获得该Random字符串的POST
$num = $_POST[$s];

它没有按预期工作,因为当我单击HTML表单的提交按钮时,页面重新加载并且随机字符串被更改,因此POST表单没有获得先前的随机值。这打破了我的逻辑。

主要动机是创建一个HTML表单,其中输入字段的名称是随机的,post字段也将获得该随机字符串。

我想阻止自动提交每次生成不同的POST字段时提交,然后即使我没有添加验证码,自动脚本也无法处理

3 个答案:

答案 0 :(得分:3)

如何将值设置为hidden字段。

// If $_POST["random"] is set, set its value to $s, else set $s to a random string
$s = isset($_POST["random"]) ? $_POST["random"] : generateRandomString();

<input type="hidden" name="random" value="<?php echo $s; ?>" />
<input type="text" name="<?php echo $s; ?>" value="whatever user types"/>

答案 1 :(得分:1)

您有两种选择:

  1. 将随机字符串存储在$_SESSION变量中,然后在POST中,从那里获取字段名称。
  2. 或者,如果您打算做的只是出于任何原因给帖子指定一个不同的名称,并且您知道所有其他$_POST字段的名称,则可以遍历每个字段并找到一个不存在的字段。匹配。但是,这将消除您希望实现的任何“安全”。

答案 2 :(得分:0)

您可以以只有您可以解密的方式加密您的字段名称:

<? 
    $MY_SECRET_KEY = ...; // this is a constant with random string, stored somewhere safe and not disclosed to anyone
    $iv = mcrypt_create_iv(...);
?>
<input name="iv" type="hidden" value="<?= $iv ?>" >
<input name="<?= base64_encode(mcrypt_encrypt(
                           MCRYPT_RIJNDAEL_128, 
                           $MY_SECRET_KEY,
                           $plain_field_name, 
                           MCRYPT_MODE_CBC, 
                           $iv)); 
?>" value="...">

解密表格时:

$iv = $_POST['iv'];
for ($_POST as $encrypted_field_name => $value) {
    if ($encrypted_field_name == 'iv') continue;
    $plain_field_name = mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        $MY_SECRET_KEY,
        base64_decode($encrypted_field_name), 
        MCRYPT_MODE_CBC, 
        $iv
    );
    ....
}

但是,请注意,有一些表单自动填充程序使用表单标签或输入顺序而不是表单名称;我认为没有办法彻底击败那些类型的填表,同时仍然可以让你的表格可供实际用户使用;您可以做的最多是确保您的标签和输入字段不能轻易匹配,这可以使用CSS3 flexbox或javascript来重新排序输入字段以及加密字段名称。对于自动表单填充程序来解决这个问题,他们必须了解flexbox或运行脚本。我认为这足以阻止大多数脚本小子。