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
);
....
}