Security-PHP登录尝试功能

时间:2011-07-29 18:02:51

标签: php security login

我正在登录表格,我必须将尝试限制为3,然后阻止任何表格提交10分钟。以下代码无法正常工作,我需要知道如何在尝试失败后阻止提交。感谢。

function autoDefender($attempts,$username,$pass)
    {
    $logins=0;
    $logins++;
    $ats = $attempts-$logins;
        if (isset($_POST['password']) && isset($_POST['userName']))
        {
            if($_POST['password']!=$pass && $_POST['userName']!=$username)
                {   
                    if($logins == $attempts)
                        {
                         echo ("<div class='errmg'>Acess denied for 1 minute</div>");
                        }
                    echo ("<div class='errmg'>Error:
                    invalid username or pass; <span class='atmpts'>$ats</span> attempts left</div>");
                }
        }
    }

2 个答案:

答案 0 :(得分:4)

此处的问题是,每次调用autoDefender时,本地变量$logins都会重置为0。因此,autoDefender的多次调用并未保持实际发生的次数的状态。

您需要持久存储此信息。在您的情况下甚至可以跨多个请求。

请注意,这也会导致拒绝服务攻击的攻击面,因为您可以锁定其他用户。因此,您应该三思而后行尝试失败的人。如果您按用户执行此操作,则攻击者可能会在对所有用户执行批量攻击时锁定许多用户。如果您按照每个远程客户端(例如IP地址)执行此操作,则可能会锁定恰好使用相同系统(例如公司或大学网络)的其他无辜用户。如果您在每个会话中执行此操作,攻击者可能只会丢弃已发布的会话ID。

答案 1 :(得分:1)

因为你的代码每次都从头开始执行,所以每次$ logins都用0初始化。所以,你需要初始化你的变量不是0,而是从这个ip的先前登录尝试次数的值(应存储在某处,即数据库中。)

不要听取建议在cookie(或sesstion)上存储$ logins。它可以(并且它将)被攻击者简单地删除。相反,将它存储在服务器端的某个地方:sql database,memcached,berkley db,...有很多选项。

最后,对我而言,您似乎误解了基本(网络,也许不仅仅是网络)编程概念,因此最好与您的导师仔细检查您的代码或使用stackexchange网络中的代码审查网站。特别是在编写如此重要的安全相关代码时。