【问题标题】:Making Random field in HTML Form在 HTML 表单中制作随机字段
【发布时间】:2023-04-04 02:26:01
【问题描述】:

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

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 字段,然后即使我没有添加验证码,自动脚本也无法处理

【问题讨论】:

  • 对隐藏字段使用随机字符串 例如:&lt;input type="hidden" name="tracer-number-input" value="&lt;?php echo $s;?&gt;"/&gt;
  • 但我希望用户在该文本输入字段中输入数据。如果我隐藏它,那么用户也如何输入。我想在该字段中从用户那里获取输入
  • 将随机字符串也保存在隐藏字段中或使用会话
  • 你有一个XY problem
  • 您可以尝试DynamicFormFields 在表单中隐藏真实的表单字段名称。

标签: php html forms random


【解决方案1】:

你有两个选择:

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

【讨论】:

    【解决方案2】:

    如何将值设置为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"/>
    

    【讨论】:

      【解决方案3】:

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

      <? 
          $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 或运行脚本。我认为这足以阻止大多数脚本小子。

      【讨论】:

        猜你喜欢
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多