代码之家  ›  专栏  ›  技术社区  ›  Tarik

PHP中的定时会话变量?我正试图锁定登录失败的用户

  •  4
  • Tarik  · 技术社区  · 15 年前

    有人能帮忙吗?我正在使用PHP和JavaScript(与jQuery一起使用)。

    4 回复  |  直到 15 年前
        1
  •  4
  •   rook    15 年前

    首先,不要锁定一个帐户,如果有人达到上限提示他们 reCaptcha

    您不能使用 $_SESSION 变量,因为它已绑定到cookie值。如果有人强行输入用户名/密码,那么他们就可以得到一个新的cookie和一个新的cookie $\u会话 . 你呢 为此使用数据库。对于每个失败的登录,您应该在一个至少有两列的简单数据库中创建一个条目 ip timestamp . 你应该有 时间戳 设置为插入时的当前时间。当有人登录时,你应该查看

    select count(ip) from brute_force_protection where DATE_SUB(NOW(),INTERVAL 1 DAY)>=timestamp and ip='".$_SERVER['remote_addr']."'

    数一数案件的数量,如果超过3起,那么禁止该ip。您可以围绕远程地址执行mysql\u real\u escape\u string(),但实际上该值是直接从apache的TCP套接字中提取的,攻击者无法控制该值,除非他可以毒害您的变量名称空间(这可以通过 extract() ).

    编辑:

        2
  •  1
  •   Jim    15 年前

    会话变量有一个缺陷,即它们只需要拒绝cookies,然后就可以被豁免。

    最好在数据库中用userid创建一个表。

    create table failedlogins (
        id INT NOT NULL auto_increment,
        user_id INT NOT NULL,
        time_tried DATETIME NOT NULL,
        primary key(id),
        index(user_id));
    

    function loginLocked($user) {
        $query = "SELECT count(fl.id) FROM failedlogins fl 
                     JOIN user u ON fl.user_id = u.id
                     WHERE time_tried < DATE_SUB(NOW(), INTERVAL 5 MINUTE) AND u.username = '" . mysql_real_escape_string($user) . "'";
    
        $res = mysql_query($query) or trigger_error("Failed Login Query failed: " . mysql_error();
    
        $attempts = mysql_result($res, 0, 0);
    
        return ($res < 3);
    }
    

    假设表格等,但应该给你一个好的开始/如何处理它的想法。每次登录失败时,您都必须插入一个条目。

    编辑:

    已将用户添加到where子句,抱歉,忘记了。

    澄清: 是的,锁定应该或多或少的(重新)验证码现在需要访问它的下一次登录尝试帐户。

        3
  •  0
  •   a1ex07    15 年前

    赢得美人归 建议)或将登录尝试保存在数据库中(例如,如果您想在多次输入错误密码后临时阻止帐户)

        4
  •  0
  •   HoLyVieR    15 年前

    首先,使用会话来防止人们强行输入密码是个坏主意。会话依赖于cookie,如果每次尝试时都忽略发送cookie,服务器每次都会创建一个新会话,并且无论使用的脚本是什么,都无法停止任何操作。

    推荐文章