我有以下代码来生成随机字符串
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字段时提交,然后即使我没有添加验证码,自动脚本也无法处理
答案 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)
您有两种选择:
$_SESSION
变量中,然后在POST中,从那里获取字段名称。 $_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或运行脚本。我认为这足以阻止大多数脚本小子。