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 フィールドを生成するたびにオートスクリプトが送信されないようにしたいのですが、キャプチャを追加していなくてもオートスクリプトは処理できません。

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

次の 2 つのオプションがあります。

  1. ランダムな文字列を変数に格納し、$_SESSIONPOST でそこからフィールド名を取得します。
  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 フレックスボックスまたは JavaScript を使用して入力フィールドを並べ替えることができます。自動フォーム入力者がこれを無効にするには、フレックスボックスを理解するか、スクリプトを実行する必要があります。ほとんどのスクリプト キディを防ぐには、それで十分だったと思います。

于 2013-09-21T05:29:08.007 に答える