2010-07-26 137 views
1

我有我给具有匹配密码存储的密码,是一个简单的登录系统的用户=会话:PHP安全会话检查?

// Checks Password and Username 
if ($pSys->checkPassword($AccountData['password'], $StoredData['password'])) { 
    $_SESSION['login'] = true; 
} 

的问题是:这是足够安全?

// put this on every header page that needs to be loggedin. 
function loginCheck(){ 
    if (empty($_SESSION['login'])) { 
     header('location:index.php'); 
     die(); 
    } 
} 

die()exit()之间的差异?其次,有人说我应该加session_regenerate_id()? (这是一种矫枉过正?)无论如何,真正的问题在上面说过。

插件*

我已阅读PHP Session Security但似乎并不在这里与我的问题(该链接只是一般)。

这里是checkPassword()方法

function checkPassword($password, $storedpassword) { 
    if($password == $storedpassword){ 
     return true;    
    } 
} 
+1

'是有模()之间空一diffrence()?''比较模具()'和'空()'没有意义。也就是说,“死”等同于“出口”; – 2010-07-26 18:07:13

+0

对不起,我的意思是退出:) ive编辑一个乔治,谢谢。 – 2010-07-26 18:08:06

+1

我想的很多。如果您检查死亡的文档,您会注意到它指向退出。 http://php.net/manual/en/function.die。php – 2010-07-26 18:09:33

回答

3

接听第一部分:emptydie没有可比性:

  • empty是检查一个变量不存在,或具有等于一个值假(另请参阅此type comparison table)。
  • dieexit的别名,用于通过可选消息立即中止当前脚本的执行。

我们您的验证例如:是的,你应该使用session_regenerate_id生成一个新的会话ID,并通过session_regenerate_id设置可选参数设置为true撤销旧的会话ID:

if (!sizeof($ErrorAccount)) { // Checks Password and Username 
    session_regenerate_id(true); 
    $_SESSION['login'] = true; 
} 

的目的session_regenerate_id是为了避免session fixation攻击。如果服务器仅允许通过cookie发送会话ID,则这不是必需的,但由于默认情况下PHP允许使用URL,因此强烈建议重新生成该ID。

+0

我的意思是死亡和退出,我只是编辑它,谢谢秋葵,你总是很好的回答问题,所以使用session_regenerate_id确实生效,然后..嗯,这就够了吗? – 2010-07-26 18:11:05

+1

请解释'session_regenerate_id'的必要性这对于答案会非常有用。 – 2010-07-26 18:11:05

+0

那么logincheck函数怎么样才好呢?不需要添加东西? – 2010-07-26 18:13:17

1

由于您正在寻找有关安全性的答案,因此也请勿将存储的密码保存为纯文本。至少,盐和散列你的密码,然后存储散列。重新哈希和比较散列,而不是纯文本。

1

您可以向表单添加一个标记(哈希),然后验证该标记以确保通过表单提交的标记仍然有效。这有助于防止CSRF攻击。

您也可以将IP地址和浏览器连同令牌一起存储在数据库中以进行额外的验证,但是您需要了解某些ISP经常更改客户端IP地址并可能导致验证失败。

More Info