Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用HTML格式生成随机场_Php_Html_Forms_Random - Fatal编程技术网

Php 用HTML格式生成随机场

Php 用HTML格式生成随机场,php,html,forms,random,Php,Html,Forms,Random,我有以下代码来生成一个随机字符串 function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, st

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

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表单的submit按钮时,页面会重新加载,并且随机字符串会发生更改,因此POST表单不会获得以前的随机值。这打破了我的逻辑

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

我想阻止autoscript提交,因为每次生成不同的POST字段时,autoscript都无法处理,即使我没有添加验证码。您有两个选项:

  • 将随机字符串存储在
    $\u SESSION
    变量中,并在POST中从中获取字段名
  • 或者,如果您的目标是出于任何原因给帖子起一个不同的名称,并且您知道所有其他
    $\u post
    字段的名称,那么您可以在每个字段上循环,找到一个不匹配的字段。然而,这将消除您希望实现的任何“安全”
  • 您有两个选择:

  • 将随机字符串存储在
    $\u SESSION
    变量中,并在POST中从中获取字段名
  • 或者,如果您的目标是出于任何原因给帖子起一个不同的名称,并且您知道所有其他
    $\u post
    字段的名称,那么您可以在每个字段上循环,找到一个不匹配的字段。然而,这将消除您希望实现的任何“安全”

  • 将该值设置为一个
    隐藏的
    字段如何

    // 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"/>
    
    //如果设置了$\u POST[“random”],则将其值设置为$s,否则将$s设置为随机字符串
    $s=isset($_POST[“random”])$_POST[“random”]:generateRandomString();
    
    将该值设置为一个
    隐藏的
    字段如何

    // 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"/>
    
    //如果设置了$\u POST[“random”],则将其值设置为$s,否则将$s设置为随机字符串
    $s=isset($_POST[“random”])$_POST[“random”]:generateRandomString();
    
    您可以用只有您才能解密的方式加密字段名:

    <? 
        $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="...">
    

    但是,请注意,有些表单自动填充器使用表单标签或输入顺序而不是表单名称;我不认为有任何方法可以完全击败这些类型的表单填充器,同时仍然让您的表单可供实际用户使用;您所能做的最多就是确保您的标签和输入字段不容易匹配,这可以通过使用CSS3 flexbox或javascript对输入字段进行重新排序以及对字段名进行加密来完成。为了让自动表单填充器克服这个问题,他们必须理解flexbox或运行脚本。我认为这足以阻止大多数脚本小子。

    您可以用只有您才能解密的方式加密字段名:

    <? 
        $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="...">
    

    但是,请注意,有些表单自动填充器使用表单标签或输入顺序而不是表单名称;我不认为有任何方法可以完全击败这些类型的表单填充器,同时仍然让您的表单可供实际用户使用;您所能做的最多就是确保您的标签和输入字段不容易匹配,这可以通过使用CSS3 flexbox或javascript对输入字段进行重新排序以及对字段名进行加密来完成。为了让自动表单填充器克服这个问题,他们必须理解flexbox或运行脚本。我认为这足以阻止大多数脚本小子。

    使用随机字符串隐藏字段,例如:
    ,但我希望用户将在该文本输入字段中输入数据。如果我隐藏这一点,那么用户也是如何输入的。我想从该字段中的用户获取输入,也可以将随机字符串保存在隐藏字段中,或者使用会话。您可以尝试在表单中隐藏真实表单字段名称。使用随机字符串隐藏字段,例如:
    ,但我希望该用户将在该文本输入字段中输入数据。如果我隐藏了它,那么用户也是如何输入的。我想从该字段中的用户那里获取输入,也可以将随机字符串保存在隐藏字段中,或者使用会话。您可以尝试在表单中隐藏真实的表单字段名。
    
    $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
        );
        ....
    }