-1

Webサイトアカウントにアクセスするために、パスワードから3文字または4文字をランダムに入力するようにユーザーに求めるサイトをいくつか見ました。PHP5、MySQL、そしておそらくAjaxを使用してこれを行う方法を知りたいです。

したがって、標準のログインフォームがある場合は

ユーザー名:
パスワード:
送信ボタン

しかし、私は次のログインフォームを実行したいと思います:

ユーザー名:
パスワード(次の文字を入力してください:) Char 1 [] Char 3 [] char 7 []
送信ボタン

文字1、3、および7はランダムであり、元のパスワードの長さに依存します。

あなたがこのようなスクリプトを作成し、それに光を当てることができれば、あるいは完全に機能するスクリプトが可能であれば、私は感謝するでしょう。

4

2 に答える 2

1

私が最初に考えたのは、ユーザーのパスワードを分割してランダムな文字を選択し、3 つのランダムなキー インデックスを取得することでした。これらのキー インデックスは、パスワードの 3 文字を表します。

これらのキー インデックスを使用して、キーがパスワード内の文字の数値インデックスであり、値が文字そのものである小さな配列を作成します。

$password = str_split( "stackoverflow" );
$randChar = array_rand( $password, 3 );

foreach ( $randChar as $key => $val )
  $letters[$val+1] = $password[ $val ];

この時点で、$letters配列は次のようになります。

Array
(
  [3] => a
  [5] => k
  [8] => e
)

ノート。これはランダムなセットです。このセットでは、3、5、および 8 番目の位置に文字を入力するようにユーザーに依頼します。ユーザーが送信した値は、ランダムに生成した値と比較できます。

于 2012-04-11T20:46:26.020 に答える
1

ログインフォームで (jquery を使用):

var passChars = [SOME,SERVER,DEFINED,CHARS]; // some random chars set by server
$('#submit').click(function(){
  $.post("login.php", { user: $('#username').text(), pass: $('#pass').text(), 'chars[]':passChars}, function (data)
  {
    if(data.suc)
      window.location(data.location);
    else
      alert("Try again");
  }, "json");
});

IN LOGIN.PHP SCRIPT (encrypt_pass は定義済みのパスワード暗号化関数であり、LANDING_PAGE はログインしたユーザーが成功した場合に移動する場所です):

$result = mysql_query("SELECT unencrypted_pass, encrypted_pass FROM users WHERE user = '{$_POST['user']}'");
$pass = mysql_fetch_array($result);
for($i = 0; $i<count($_POST['chars']);$i++){
  $pass[0][(int)$_POST['chars'][$i]] = $_POST['pass'][$i];
}
if($pass[1] == encrypt_pass($pass[0])) // success
  echo json_encode(Array("suc"=>true, "location"=>LANDING_PAGE));

これは、サーバーがパスワードを知っていることを前提としているため、指定された文字を文字列に入れ、文字列と暗号化されたバージョンを比較できます。パスワードの暗号化を解除することは不可能であるため (パスワードが正しく暗号化されている場合)、これが機能していることを確認できる唯一の方法です。これがどのように役立つかは疑問ですが...

于 2012-04-11T20:57:34.200 に答える