在PHP会话变量中存储“密码正确”的内容?

3

在会话变量中存储密码是否安全?

例如,这种用法是在一个表单中提交给自己的。

比如说,在更改分类页面上,用户首先输入密码,然后如果通过(pass=ok),显示更改分类的表单。所有这些都在同一php页面上。

但是,每当在php页面的“更改”部分上传图片时,表单必须再次提交给自己。

我是否应该在这里使用存储的会话密码来验证用户实际上是用户,并且是安全的?

换句话说,像这样存储东西是否安全:

 if($pass==$row['password']){ // If password was correct
    $_SESSION['pass_ok']='1';
 }

谢谢


1
附注:我建议在可能的情况下使用 === 和 !==,而不是 == 和 !=。粗心使用 == 可能会导致安全问题,因为 PHP 对于不同类型之间的比较规则有点奇怪。 - CodesInChaos
4个回答

10

Camran,你所做的是维护 PHP 会话的标准方式。实际上,你并没有将密码存储在会话中,而是只存储了这个特定用户已经登录的信息。

在每个页面上,你只需要执行 session_start() 并检查此会话是否已设置为1,如果是,则假定用户已登录并继续处理,否则重定向到登录页面。

如果有人掌握了会话 ID,那么他们肯定可以访问用户会话。你可以采取一些措施使其更加安全。

  • 使用 SSL(https),它可以使数据难以被窃听并获取你的会话 ID
  • 用户登录时将客户端 IP 保存在会话中,在每个请求后,检查请求是否来自同一 IP。
  • 设置短会话超时时间,以便在空闲一段时间后会话自动超时。

1
+1 用户无法修改自己的会话变量,因此我们通常只需在 $_SESSION['user'] 或类似位置中放置用户名,如果用户已登录。 如果该值缺失,则用户是匿名的。 - Annika Backstrom

1
使用预先构建的身份验证系统。这是保持安全的最佳选择,因为他们已经(或应该已经)考虑到所有的安全问题。

0

我所做的是:

  1. 检查用户是否正确登录
  2. 为用户名+用户已登录的会话分配一个会话
  3. 当页面被点击时,我的系统将在数据库中搜索用户名+用户已登录的会话,如果为真,则允许访问该页面,但它还会删除刚刚搜索的记录,并插入一个新记录,其中包含用户名+用户已登录的会话和不同的MD5 HASH。因此希望这样更难破解。

-2
我建议不要这样做。如果有人登录并复制了会话ID,他们理论上可以登录到任何页面。我建议您在每次页面刷新时检查密码是否正确,这将更安全。
此外,始终将密码哈希存储在数据库中,或者更好的方法是使用盐进行哈希处理。

1
把它加密存储在PHP会话中如何?然后每次解密,这样用户就不必每次上传图片时都输入密码了? - user188962
你不会加密它,而是会使用哈希。因此,你需要通过类似于 sha1 的东西将其传递,当用户输入他们的密码时,通过对其进行哈希处理并比较两者来验证密码是否匹配。将他们使用的输入作为哈希存储在会话或 cookie 中,并与数据库中的密码进行验证。 - Thomas O
你的两个回答都是不好的做法。你应该存储PHP会话ID、IP地址、浏览器标识和验证他们是否已经认证过。然后使用所有这些信息来批准用户的有效性。 - Petah
在cookie中存储哈希是一个不好的做法。我同意。但是我建议一些更好的东西。一个更好的系统将是一个会话系统,但不是使用php会话,而是使用数据库。 - Thomas O
所有的Web应用程序都必须在会话变量中存储已登录状态。另一种选择是将密码存储为cookie,这样做远远不如前者,因为现在您的密码是永不过期的会话ID。 - rook
哎呀,-2...我觉得人们误解了我。会话和Cookie确实会过期。说非PHP会话将被锁定到一个IP地址。 - Thomas O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接