2011-12-24 21 views
1

我有一个非常机密的网站,只有少数人有权登录。如何检查用户是否尝试过三次登录,如果他们有,整个目录从我的服务器上删除。这很难做到吗?如何删除整个网站目录如果登录尝试达到最大

这是我的登录页面:

<?php 
require_once('scripts/user_authentication.php'); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<link href='http://fonts.googleapis.com/css?family=Inder' rel='stylesheet' type='text/css'> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Access login</title> 
<link href="../styles/users.css" rel="stylesheet" type="text/css" /> 
<style> 
span {font-family: 'Inder', sans-serif; color: #369; font-style: italic;} 

#login {width: 400px; margin: 60px auto 0 auto; padding: 20px; text-align: center; 
    box-shadow: 0px 9px 21px rgba(0, 0, 0, 0.63); 
    -moz-box-shadow: 0px 9px 21px rgba(0, 0, 0, 0.63); 
    -webkit-box-shadow: 0px 9px 21px rgba(0, 0, 0, 0.63); 
} 

#login p {text-align: left;} 

form {padding: 0; margin: 0; } 
input {margin: 0; padding: 0;} 

h1 { margin: 0 0 20px 0; padding: 0;} 

</style> 


</head> 

<body> 
<div id="login"> 
<h1><span>p*******</span> Partners Only</h1> 
<div id="inner"> 
<?php if ($failed) { ?> 
<p class="warning">Login failed. Try Again. Please contact ******* ***** if you do not know your access information. After multiple attempts this site will self destruct. Thank you for your cooperation.</p> 
<?php } ?> 
<form id="form1" name="form1" method="POST"> 
    <p> 
    <label for="username">Username:</label> 
    <input type="text" name="username" id="username" /> 
    </p> 
    <p> 
    <label for="password">Password:</label> 
    <input type="password" name="password" id="password" /> 
    </p> 
    <p> 
    <input type="submit" name="signin" id="signin" value="Sign in" /> 
    </p> 
</form> 
</div> 
</div> 
</body> 
</html> 

这里是user_authentication:

<?php 
$failed = FALSE; 
if ($_POST) { 
    if (empty($_POST['username']) || empty($_POST['password'])) { 
    $failed = TRUE; 
    } else { 
    require_once('library.php'); 
    // check the user's credentials 
    try { 
     $auth = Zend_Auth::getInstance(); 
     $adapter = new Zend_Auth_Adapter_DbTable($dbRead, 'users', 'first_name', 'family_name', 'password' 'sha1(?)'); 
     $adapter->setIdentity($_POST['username']); 
     $adapter->setCredential($_POST['password']); 
     $result = $auth->authenticate($adapter); 
     if ($result->isValid()) { 
     $storage = $auth->getStorage(); 
     $storage->write($adapter->getResultRowObject(array(
      'username', 'first_name', 'family_name'))); 
     header('Location: members_only.php'); 
     exit; 
     } else { 
     $failed = TRUE; 
     } 
    } catch (Exception $e) { 
     echo $e->getMessage(); 
    } 
    } 
} 
if (isset($_GET['logout'])) { 
    require_once('library.php'); 
    try { 
    $auth = Zend_Auth::getInstance(); 
    $auth->clearIdentity(); 
    } catch (Exception $e) { 
    echo $e->getMessage(); 
    } 
} 
+0

你为什么要删除目录?如果用户忘记了密码,或者如果其他人尝试使用用户名访问该页面怎么办? – Virendra 2011-12-24 23:09:56

+9

这是一个非常危险的方法。使攻击者可以轻松地将..从服务器上删除东西,使其无法访问您的真实用户。 – 2011-12-24 23:10:02

+3

如果您发布网址,我确定有人会为您进行测试;) – Ram 2011-12-24 23:18:40

回答

6

你的方法(删除用户文件)是真的不好的做法,但如果你确实需要去做,这里是一个办法......

在现有表中创建一个数据库表(或项目)来存储用户名和尝试次数。在进行身份验证之前,请检查尝试次数是否低于设定值。在验证部分中,如果密码错误,请增加“尝试”列。无论用户何时成功登录,都将尝试再次设置为零。如果超过了尝试次数,请删除文件或采取任何您需要的安全措施。

现在,为了使这个设计更好,我建议不要实际删除服务器上的数据。相反,我建议在X次失败尝试后,将增加的安全措施应用于尝试登录该用户名的用户,例如;

  • 要求用户解决一个验证码,让你知道他们是不是要多个密码

  • 店“安全问题”为每个用户一个机器人(如“什么是你的生日”),和要求他们回答这些

  • 锁定帐户并拥有一个安全的程序为真正的用户来访问再次
1

正如这是非常危险的评论中提到的人这样做。

但是,如果你仍然认为信息是这一重要性,并链接到登录页面是非常秘密的,你有备份别的地方,这个码应该这样做:

<?php 
session_start(); // Add this only if you don't have it in some other header files 

// Checking if the session variable exists and initiating it if it does not. 
if (!isset($_SESSION['failed'])) { 
    $_SESSION['failed'] = 0; 
} 

$failed = FALSE; 
if ($_POST) { 
    if (empty($_POST['username']) || empty($_POST['password'])) { 
    $failed = TRUE; 
    } else { 
    require_once('library.php'); 
    // check the user's credentials 
    try { 
     $auth = Zend_Auth::getInstance(); 
     $adapter = new Zend_Auth_Adapter_DbTable($dbRead, 'users', 'first_name', 'family_name', 'password' 'sha1(?)'); 
     $adapter->setIdentity($_POST['username']); 
     $adapter->setCredential($_POST['password']); 
     $result = $auth->authenticate($adapter); 
     if ($result->isValid()) { 

     // Setting the counter to 0 in case of successful login. 
     $_SESSION['failed'] = 0; 

     $storage = $auth->getStorage(); 
     $storage->write($adapter->getResultRowObject(array(
      'username', 'first_name', 'family_name'))); 
     header('Location: members_only.php'); 
     exit; 
     } else { 
     $failed = TRUE; 

     // Increment the failed logins counter at each failed login. 
     $_SESSION['failed']++; 

     // In case of 3 or more failed attempts 
     if ($_SESSION['failed'] > 3) { 

      // Remove some directory 
      rmdir("/path/to/the/dir"); 
      $_SESSION['failed'] = 0; 
     } 
     } 
    } catch (Exception $e) { 
     echo $e->getMessage(); 
    } 
    } 
} 
if (isset($_GET['logout'])) { 
    require_once('library.php'); 
    try { 
    $auth = Zend_Auth::getInstance(); 
    $auth->clearIdentity(); 
    } catch (Exception $e) { 
    echo $e->getMessage(); 
    } 
} 
+0

尽管所有的想法都非常糟糕,但我会添加上面的代码指令来启动会话变量,如果它不存在,并且在用户验证成功时将会话计数器设置为0 :) – 2011-12-24 23:30:48

+0

感谢主席先生次要重构=) – Dimme 2011-12-24 23:39:27

+0

此代码是否进入登录页面?这也不会影响任何数据库信息吗? – 2011-12-25 00:05:31