2

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

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 表单,其中名称字段获取该表单中的随机字符串

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

现在,当我使用它时,如何确保获得该随机字符串的 POST

$num = $_POST[$s];

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

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

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

4

3 回答 3

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"/>
于 2013-09-21T05:06:07.873 回答
1

你有两个选择:

  1. 将随机字符串存储在$_SESSION变量中,然后在 POST 上,从那里获取字段名称。
  2. 或者,如果您的目标是出于某种原因给帖子起一个不同的名称,并且您知道所有其他$_POST字段的名称,则可以遍历每个字段并找到不匹配的字段。但是,这将消除您希望实现的任何“安全性”。
于 2013-09-21T05:03:07.603 回答
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 或运行脚本。我认为这足以阻止大多数脚本小子。

于 2013-09-21T05:29:08.007 回答