矩阵验证的后台

在给网站后台做强化设计,根据这么多年的经验,光验证用户名和密码真的让我太没安全感了。头脑风暴了一下,从农行的动态密码卡那里得到的灵感。登录后台除了验证用户名以外,还得有“动态密码卡”。“动态密码卡”就是一个矩阵,里面的每行每列都有一个对应的值,登录页面会随机显示两组行列号,需要输入行列号对应的值才行,这个雏形我只随机了一组行列号,慢慢来。当然弱点就是管理员需要保存这个“动态密码卡”上的数组且不被人得到:)

测试代码,这里的矩阵如下:

1.jpg

2.jpg

3.jpg

界面,test.php:

<?php
include_once("c.php");
//随机生成一个行列号
$test = rnd();
$num1 = $test[0];
$num2 = $test[1];
?>
<p>行:<?=$num1?>列:<?=$num2?></p>
      <form id="form1" name="form1" method="POST" action="c.php">
      <label>
      <input type="text" name="num" id="textfield" />
      <input name="rnd1" type="hidden" value="<?=$num1?>" />
      <input name="rnd2" type="hidden" value="<?=$num2?>" />
      </label>
      <label>
      <input type="submit" value="提交" />
      </label>
      </form>

核心代码,c.php:

<?php
/*
  生成一个 5 行 5 列的矩阵,为了不头脑糊涂,故让数组从1下标开始。
*/
$pass = Array();
$pass[0] = 0;
$pass[1] = Array(0,1,2,3,4,5);
$pass[2] = Array(0,6,7,8,9,10);
$pass[3] = Array(0,11,12,13,14,15);
$pass[4] = Array(0,16,17,18,19,20);
$pass[5] = Array(0,21,22,23,24,25);
/*
  函数说明:随机行列号
*/
function rnd()
{
    // 产生1 到 5之间的随机数
    $rand1 = rand(1,5);
    $rand2 = rand(1,5);

    // 返回一个数组,第一个元素包含行号,第二个元素包含列号
    return Array($rand1,$rand2);
}

// 接收行号
$rnd1 = $_POST['rnd1'];
// 接受列号
$rnd2 = $_POST['rnd2'];
// 接受对应的值
$num = $_POST['num'];

$check = $pass[$rnd1][$rnd2];

if ( $num >0 )
{
    if ( $num == $check )
	echo '正确,你输入的是:'.$num;
    else
	echo ':-(';
}
?>

这只是一个原型罢了,还需要很多强化。