Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这对于用户登录和验证是否足够安全?(PHP、MySQL、会话)_Php_Mysql_Sql_Session_Cookies - Fatal编程技术网

这对于用户登录和验证是否足够安全?(PHP、MySQL、会话)

这对于用户登录和验证是否足够安全?(PHP、MySQL、会话),php,mysql,sql,session,cookies,Php,Mysql,Sql,Session,Cookies,只是想确保我没有错过任何明显的东西。需要你们的专业知识 数据库中的用户数据: -密码以crypt()形式存储,该crypt()使用存储在用户表中的salt字符串进行加密 会议: -当用户正确登录时,我在会话表中创建一个具有唯一sha256哈希会话ID的新行。我也在其中存储用户ID,以查看哪个用户存在哪个会话。 -我创建了一个cookie,将会话ID存储在其中。 -当用户通过访问注销功能注销时,会话将被删除。 -会话在定义的过期时间(例如7天)自动删除 身份验证: -检查客户端是否有会话ID为的c

只是想确保我没有错过任何明显的东西。需要你们的专业知识

数据库中的用户数据: -密码以crypt()形式存储,该crypt()使用存储在用户表中的salt字符串进行加密

会议: -当用户正确登录时,我在会话表中创建一个具有唯一sha256哈希会话ID的新行。我也在其中存储用户ID,以查看哪个用户存在哪个会话。 -我创建了一个cookie,将会话ID存储在其中。 -当用户通过访问注销功能注销时,会话将被删除。 -会话在定义的过期时间(例如7天)自动删除

身份验证: -检查客户端是否有会话ID为的cookie。如果cookie会话ID与sessions表中的会话ID匹配,则对用户进行身份验证

你们觉得怎么样?我还需要做点别的吗

编辑:添加了生成密码的方法:

public function generate_salt($password) {
    $cost = $this->CONFIG['user__password_encrypt_cost'];
    $salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');

    // Prefix information about the hash so PHP knows how to verify it later.
    // "$2a$" Means we're using the Blowfish algorithm. The following two digits are the cost parameter.
    $salt = sprintf("$2a$%02d$", $cost) . $salt;

    // Hash the password with the salt
    $hash = crypt($password, $salt);


    return array(
        'salted_password' => $hash,
        'salt' => $salt
     );
}

带有Crypt_SHA512和salt的Crypt是安全的,但是建议使用password_hash()

不应使用带有MD5或类似弱哈希的Crypt

会话处理过于复杂

PHP具有会话处理功能,您可以在其中存储cookie(它实际上自动存储cookie)。 在会话中,可以添加用户id

$_SESSION['userid'] = $sUserIdFromDB;
如果客户端有cookie,它将找到会话数据,您可以检查他是否登录

if (isset($_SESSION['userid']) 
    AND is_int($_SESSION['userid']) AND (0 < $_SESSION['userid'])) {
    $oUserRow = $oDB->getByID($_SESSION['userid']);
} else {
   // user is not logged in (has no valid session)
}
if(isset($\u会话['userid']))
和是_int($_会话['userid'])和(0<$_会话['userid'])){
$USERROW=$oDB->getByID($\u会话['userid']);
}否则{
//用户未登录(没有有效会话)
}
将会话ID存储在DB中是可能的,但会向DB添加另一个不必要的额外请求。它不会增加安全性。实际上,您会发现用户同时从两个不同的浏览器(移动和桌面,移动API)使用DB方法登录的问题,因为会话ID不同

更重要的是: -每个用户都应该有不同的盐 -强制执行密码的最小长度(8个字符) -强制使用多种字符(小写、大写、数字、特殊字符) -允许安全重置新密码(不应通过电子邮件发送密码) -…

回答“足够安全”有点困难,但这里有一些其他问题需要考虑:

  • 盐强度——是用户名还是随机值或时间戳?我更喜欢后两种
  • 通过网络发送密码时是否需要SSL?考虑这样做。
  • cookie是否“安全”和“仅HttpOnly”以缓解CSRF?如果可以,请执行此操作(取决于客户支持)
  • 是否限制员工访问salt和加密值?限制谁可以访问任何敏感信息
  • 哪种加密算法和多少位?试试DES 512或更强
  • 您是否强制执行密码强度要求?你应该
  • 数据库连接安全吗?重要信息,尤其是当DB链路通过WAN时

  • 谢谢在表中设置会话的原因是,我希望能够看到哪些用户在线,以及他们上次执行的操作。因此,对于每一次页面加载,我都会使用该信息更新会话表中的信息。我还将有一个列定义用户登录的客户机,这样我就可以区分这些信息,并向用户显示他从哪个前端激活等…1。请看我原来的问题帖子,我用生成密码的代码更新了它。2.我会要求整个网站的SSL实际上,至少这是我现在的计划。3.谢谢,我会留意的!我不知道,现在它只是:setcookie('cookie\u name',$session\u id,$expire);4.你是说对数据库的物理访问受到限制吗?那么是的。5.有关密码生成,请参见上面的“我的代码”。6.是的。7.数据库连接由PHP连接到webroot之外的后端。没有前端可见性。再次感谢!谢谢我已将此标记为已解决:)