-1

我见过一些网站要求用户从他们的密码中随机输入 3 或 4 个字符来访问网站帐户。我想知道如何使用 PHP5、MySQL 和可能的 Ajax 来做到这一点。

所以,如果我有一个标准的登录表单,我会有

用户名:
密码:
提交按钮

但我想做以下登录表单:

用户名:
密码(输入以下字符:) Char 1[] Char 3[] char 7[]
提交按钮

字符 1、3 和 7 是随机的,取决于原始密码的长度。

如果您已经完成了这样的脚本并且可以对其有所了解,或者可能有一个完整的工作脚本,我可以看看我将不胜感激。

4

2 回答 2

1

我最初的想法是从拆分用户密码中选择随机字母,并获取三个随机键索引。这些键索引代表密码中的三个字母。

使用这些键索引,我构建了一个较小的数组,其中键是密码中字符的数字索引,值是字符本身。

$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 回答