【问题标题】:PHP Session CheckingPHP 会话检查
【发布时间】:2014-08-19 15:47:26
【问题描述】:

我有一个网站,用户可以在其中登录并设置两个会话变量:

if (validate_password($password, $user_hash))
{
    $_SESSION['usrnam'] = $username;
    $_SESSION['uid'] = $user_id;
    $stmt -> close();
    $con -> close();
    dirto_homepage();
    exit();
}

然后我会检查页面上的显示元素:

if (isset($_SESSION['uid']) && isset($_SESSION['usrnam'])) {include ".....";} 

还有……

$auth_id = $con -> real_escape_string($_SESSION['uid']);
$message = $con -> real_escape_string($_POST['message']);
$stmt = $con -> prepare("UPDATE `db_table` SET `data` = ?, `date_mod` = ? WHERE `id` = ? AND `author_id` = ?")

这样做安全吗? - uid 只是数据库中用户详细信息的自动递增数。我能做些什么来使用户登录检查更加健壮吗?

【问题讨论】:

  • 最佳实践/安全问题:codereview.stackexchange.com
  • 你也可以记录用户 ip、用户代理等,以防止会话劫持。您还可以将密码哈希保存在会话中,并根据数据库检查它以在密码更改后使打开的会话无效,但您所拥有的可能没问题
  • 如果您使用参数化查询,则不应转义字符串。参数绑定已经保护了数据,如果您添加任何转义,它们将被视为文字数据。

标签: php security session


【解决方案1】:

如果您将real_escape_string 作为绑定参数提供给准备好的语句,则使用它是错误的。绑定参数按字面意思处理,绑定机制负责保护值,因此您将转义字符存储到数据库中,这是您不想要的。仅当您将值替换为 SQL 字符串时,才需要转义。

至于会话检查,我觉得这很好。会话数据都存储在服务器上,客户端只是发送链接到它的会话 ID,因此他们无法欺骗特定的会话值。唯一能做的就是猜测别人的会话 ID,然后他们就可以劫持他们的会话。对此您无能为力。

【讨论】:

【解决方案2】:

这是有关该主题的深入文章

http://shiflett.org/articles/the-truth-about-sessions, https://security.stackexchange.com/questions/23929/creating-secure-php-sessions.

会话永远不会 100% 安全...

不要相信投反对票的人,Chris Shiflett 的文章非常宝贵。

在另一个帐户上见。 ;)

【讨论】:

  • 仅链接的答案通常应该只是 cmets。
  • @Barmar 无法评论,抱歉!仅从 50 个代表开始。对那个限制感到头疼!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2012-05-26
相关资源
最近更新 更多