2012-07-17 37 views
3

我有一个保留变量的问题。我想当你提交表单时,变量将被重置为默认值。所以我不知道如何限制3次登录尝试,直到它说“Go Away!Hacker!”。只使用PHP,没有别的。 任何人都有线索?不要担心安全问题,因为这只是我的教授给予我们的练习的一个例子,我们只需要使用php就可以完成。所以不要担心黑客重置cookie。PHP登录计数器

注意:我只使用XAMPP来使php在localhost中工作。

下面的代码在PHP中:

<center><form action="" method="post"><br> 
User ID: <input type="text" name="id"><br> 
Password: <input type="password" name="pass"><br> 
<input type="submit" name="submit" value="login"> 
</form> 

<?php 
if(isset($_POST['submit'])){ 
    $counter = 0; 
    $counter++; 
    $vid = 'hanzo'; 
    $vpass = '123456'; 
    $id = $_POST['id']; 
    $pass = $_POST['pass']; 
    $c = "<center>"; 
    if(empty($id)) echo "$c Please Input Username.<br>"; 
    else if(empty($pass)) echo "$c Please Input Password.<br>"; 
    else if($vid==$id && $vpass==$pass) echo "$c Login Succesfully<br>";  
    else if($counter>3) echo "$c Go Away! Hacker!<br>"; 
    else echo "$c Invalid Username/Password<br> Login Attempt: $counter"; 
} 
?> 
+2

你在使用Sessions吗? – Elen 2012-07-17 14:25:25

+1

我建议在数据库中记录失败的尝试,并且当它们达到3时,在最后5分钟内,即使正确但没有给出失败原因的登录失败。这应该有助于防止蛮力攻击 – Waygood 2012-07-17 14:27:53

+0

您需要将计数器存储在永久存储器中,例如数据库。然后在发生成功登录或足够的时间后重置为零。 – 2012-07-17 14:28:07

回答

0

你可以将其存储在$_SESSION但他们只要保持复位会话cookie是不可靠的。我建议您使用memcacheapc_store,具体取决于您使用哪一个IP地址运行和识别。

+0

我们可以考虑DB中的值作为另一种选择吗? – Dev 2012-07-17 14:27:36

+0

我们可以,但您需要设置一个cron或计划的事件来减少计数器到期后(或无限期地保留),但它也不是非常有效。 – Martin 2012-07-17 14:29:13

+0

不需要cron。 (*)FROM bad_logins WHERE username ='POSTED USERNAME'AND login_attept_date> DATE_SUB(NOW(),INTERNAL X MINUTE) – Waygood 2012-07-17 14:31:55

4

您可以在会话中粘贴变量,以便通过多页加载保留用户/客户端计算机的变量。 http://us3.php.net/manual/en/intro.session.php

每次脚本运行时,它都会以空白的石板开始。除魔术$ _X变量外,所有变量都是未定义的。您需要将自己的任何数据放在通过多次运行持续存在的地方 - 会话,cookie,数据库,文本文件等。

会话可能是最简单的方法。因为他们有一个客户端元素,但它们并不完全安全。一个相对复杂的用户可以规避会话检查。

+2

我不认为阻止Cookie需要一个非常复杂的用户:) – Martin 2012-07-17 14:30:59

+0

@Martin无论如何,黑客可能会使用某种自动化,并不会阻止在浏览器中的Cookie – galymzhan 2012-07-17 14:33:41

+0

@galymzhan你是正确的自动化,但它这可能是一个原始脚本,所以cookie可能会被默认禁用 – Martin 2012-07-17 14:40:37

0

您可以使用会话并将登录保存到这些会话。

if(!isset($_SESSION['logonCounter'])) { 
    $_SESSION['LogonCounter'] = 0; 
} 

if($LogonFail == true) { // do something that check if its correct 
    $_SESSION['LogonCounter']++; 
} 

if($_SESSION['LogonCounter'] < 3) { 
    // Do something 
} 
0

保存在SESSION柜台,并在每次失败登录增加它的价值..否则,你可以创建数据库中的表,并保持登录尝试在一排与用户的IP地址一起。随着第二种方法,如果你需要,你可以永久阻止某些IP的...

希望这有助于

0

个人而言,我会使用一个数据库,以便您可以看到发生了什么,这是不容易被避免黑客,但只使用PHP中可以登录尝试的次数存储在一个会话变量:

<?php 
// only check on posts 
if ($_SERVER['REQUEST_METHOD'] === 'POST') 
{ 
    session_start(); 
    $_SESSION['login_attempts'] = isset($_SESSION['login_attempts']) ? ($_SESSION['login_attempts'] + 1) : 0; 
    // do checking on number of attempts 
    if ($_SESSION['login_attempts'] > 3) 
    { 
    echo "Go Away! Hacker!"; 
    die(); 
    // or just do a redirect to another page... 
    } 
} 
?> 
<center><form action="" method="post"><br> 
... 
+0

因此,它是检查$ _SESSION ['login_attempts' ]> 3?以及如何在回显登录尝试#中使用$ _SESSION变量? – 2012-07-17 15:11:01

+0

@Hanzo Kimura起初我没有补充说,但现在它在那里。请注意,您可以在脚本中的任何位置使用该变量,但是在输出到浏览器之前,需要将'session_start();'放在顶部。 – jeroen 2012-07-17 15:13:07

+0

谢谢我会试试看:D – 2012-07-17 15:17:40

0
if(isset($_SESSION['attempts'])) 
{ 
    if $_SESSION['attempts'] == 3{ 
     echo "Go away!"; 
    } else { 
     $_SESSION['attempts']=$_SESSION['attempts']+1; 
    } 
} 
else 
{ 
    $_SESSION['attempts']=0; 
} 
0

你很可能会提供最好的服务为通过一个简单的实现会话做到这一点。但是,用户可以通过删除会话cookie来轻松终止会话。真正最安全的方法是将IP地址的所有登录请求记录到数据库中,然后在来自给定IP地址的Y次失败请求数量为Y的情况下显示安全警告。

1

尝试使用

<input type='hidden' /> 

不会真的做很多工作来防止意志坚定的黑客,但如果你有一个特别的厌恶他们,你可以用它来存储页面之间的变量不启用会话。

否则

session_start(); 
if (isset($_SESSION['loginCount'])) 
{ 
    $_SESSION['loginCount']++; 
    if ($_SESSION['loginCount'] > 3) 
    { 
    echo 'Bog Off!'; 
    exit; 
    } 
} else { 
    $_SESSION['loginCount'] = 1; 
} 

这将是更好,但被告知,如果你是黑客清除浏览器缓存中的会话将被重置。最好的办法是跟踪数据库中的源IP地址,但即使这样也可以用代理来解决。

+0

我将如何处理隐藏的输入?无论如何,我会尝试一个 – 2012-07-17 14:57:17

+0

会话与隐藏的输入,您可以将value元素设置为一个相同名称的变量,例如''/>'或其他值。您可以使用它在用户提交表单时在页面视图之间存储值。 – Bappy1988 2012-07-18 07:30:50