2012-07-17 32 views
0

我有一个登录页面,它在加载后显示登录对话框。登录对话框只是使用Ajax callJQuery对话框。类似的东西:使用会话cookie生存期和登录过程进行处理。 PHP

$(function() { 
    var _width = $.browser.msie ? 316 : 'auto'; 
    var loginDialog = $('#loginDialog'); 

    loginDialog.dialog({ 
     closeOnEscape: false, 
     open: function() { 
      $(this).parent().find('.ui-dialog-titlebar-close').hide(); 
     }, 
     resizable: false, 
     position: 'center', 
     stack: true, 
     draggable: false, 
     height: 'auto', 
     width: _width, 
     modal: true, 
     buttons: { 
      'submit': function() { 
       $.ajax({ 
       type: 'post', 
       dataType: 'html', 
       url: '/ProjectName/Scripts/php/AccountController.php', 
       cache: false, 
       // async: false, 
       data: $('#loginForm').serialize(), 
       success: function(accessStatus) { 
        if(accessStatus === 'granted') { 
         loginDialog.dialog('close'); 
        } 
       }, 
       error: function(request, status, error) { 
        // handle it in a specific manner 
        alert(error); 
       } 
      }); 
     } 
    }   
}); 

所以如果没关系(在服务器端)我只是关闭对话框。

然后在AccountController.php文件作为现在我有类似的东西:

<?php 
    session_start(); 
    if(IsAjaxRequest()) { 
     if(isset($_REQUEST['username']) && isset($_REQUEST['password'])) { 
      require_once('LDAPHandler.php'); 

      // credentials 
      $username = $_REQUEST['username']; 
      $password = $_REQUEST['password']; 
      // ... more parameters 

      // ... Fetch against AD 
      if(IsInAdminRole($username, $password)) { 
       // ... establishing mysql connection & setting connection options 

       // and then:       
       mysql_query(
        'insert into accounts'. 
        '(login, sid) values({$username}, {session_id()})'. 
        'on duplicate key update sid=values(sid)' 
       ); 

       // write response 
       echo 'granted'; 
      } 
     } 
    } 
?> 

我想是存储sid在数据库中的相关记录(Accounts table)。是什么让我困惑:

  • 至于如果用户成功登录服务器后,复制一些页面会使用相同的会话cookie我明白了吗?我对吗?除非浏览器关闭。
  • 如何处理不同浏览器的情况?
  • 我读过,无论我需要使用会话,我都必须在页面上调用session_start()。这不会给出sid与登录时写入的不同吗?
  • 说如果我不想重复,我的意思是用户不应该多次访问相同的资源(同时),哪种方式是最好的处理呢?
  • 另外我明白,我需要使用某种标志(可能在帐户表中的字段)来说用户是active,导致以其他方式,我将只存储最后的sid。或者更好的解决方案是在会话关闭后从数据库中删除用户?

巨大的感谢!

+0

出于好奇,你的'LDAPHandler.php'使用PHP的本地'ldap_bind()'? – Adi 2012-07-17 08:49:41

+0

是的我正在使用本地ldap_bind();我还没有后悔) – lexeme 2012-07-17 08:51:34

+0

是否可以共享“LDAPHandler.php”的代码? (特别是'ldap_bind()'附近的部分。在将个人信息排除在外之后,我一直在研究一些不好的练习案例,而且我非常好奇 – Adi 2012-07-17 08:53:07

回答

1
  • 是的你是对的(除非在客户端有一些篡改)。
  • 你为什么需要担心?
  • session_start()将开始一个新的会话,如果之前启动,则恢复前一个会话。
  • 相信我,不要尝试。
  • 这很好看看现在谁已经登录,但是当用户注销或者他/她一段时间没有活动时(15分钟是合理的),您必须将活动设置为0。

更新:那些不是直接相关你的问题,但它是很好的记住它们。

  • 你的代码(SQL部分)易受SQL Injection,请仔细阅读本answer here学会如何保护自己。

  • 您的LDAP代码易受提供了空(或NUL)密码时,假阳性的认证,因为ldap_bind()将尝试anonymous binding,如果没有设置密码,这将导致任何人登录,如果他们提供正确的用户名。因此,请确保过滤掉所有控制字符,然后检查空密码。

  • 也可以通过提供*作为用户名来对您的代码执行LDAP“注入”。

+0

哦!这是伟大的,我真的很感激!另外我很好奇我如何拦截会话关闭事件并处理它。 – lexeme 2012-07-17 10:09:55