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

标签 php mysql sql session cookies

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

数据库中的用户数据: - 密码存储为 crypt(),用存储在用户表中的盐字符串加盐。

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

身份验证: - 检查客户端是否有带有 session ID 的 cookie。如果 cookie session ID 与 session 表中的 session 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
     );
}

最佳答案

“足够安全”这个问题有点难以回答,但这里还有一些其他的事情需要考虑:

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

关于php - 这对于用户登录和验证是否足够安全? (PHP、MySQL、 session ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24421743/

相关文章:

javascript - node.js mysql LIKE语句用法

mysql - 在 mysql 中尝试跨数据库更新时找不到列

php - WooCommerce 隐藏特定的自定义属性

php - file_get_contents HTTP 请求失败

当数据不存在于另一个表中时,MySQL 连接也包含数据

MySQL datetime where 子句查询帮助

mysql - MySQL 中的 ROW_NUMBER()

MySQL 错误 1241 : Operand should contain 1 column(s) on insert statement (no selects)

php - 使用 PHP 和 Apache 的 NTLM 登录

php - mysql_query() 期望参数为 mysqli/string