我见过一些网站要求用户随机输入3或4个字符,以获取网站帐户的访问权限。我想知道如何使用PHP5,MySQL和可能的Ajax。
所以,如果我有一个标准的登录表单,我就有
username: password: Submit Button
但我想做以下登录表单:
username: Password (Inptut the following Chars:) Char 1[] Char 3[] char 7[] Submit button
Chars 1,3& 7是随机的,取决于原始密码的长度。
如果您已经完成了这样的脚本并且可以对其进行说明,或者可能有一个完整的工作脚本我可以看一下,我将不胜感激。
答案 0 :(得分: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的字符。他们提交的值可以与您随机生成的值进行比较。
答案 1 :(得分:1)
IN LOGIN FORM(使用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));
这假定服务器知道您的密码,因此您可以将给定的字符放入字符串中,然后比较字符串与加密版本。这是我能看到这个工作的唯一方法,因为无法解密密码(如果它们被正确加密)。 我想知道这是如何有用的,但是......