2011-06-11 170 views
8

我正在开发一个使用Codeigniter的Web应用程序。当用户使用我的网站进行身份验证时,我正在将我们的用户标识符存储在会话cookie(我已启用加密)中。我的几个模型类使用session/cookie的'user-identifier'参数中的值来更改用户帐户的属性。Codeigniter/PHP会话安全问题

我担心的是,我想知道是否有人可以使用我设置的用户标识符获取有效的codeigniter会话cookie,将用户标识符的值更改为不同用户的值,并对其他用户的帐户进行更改。如果有人试图更改会话cookie的属性,codeigniter/php会话是否会产生错误?

回答

19

打开/application/config/config.php,找到“sess_use_database”并将其更改为“TRUE”(如果还没有的话)。通过这种方式,所有会话变量都将存储在数据库表中,而会话cookie将只包含会话ID字符串。

为了增加安全性,您还可以将“sess_match_ip”更改为TRUE。这样,如果有人窃取用户的cookie并尝试将其作为自己的cookie传递,会话将被销毁。

+3

从最新的CodeIgniter 3.0.1开始,“sess_use_database”名称已被替换为“sess_driver”,它可以设置为“database”。最新的文档声称,默认的'文件'驱动程序是最安全的选择:http://www.codeigniter.com/user_guide/libraries/sessions.html – 2015-05-21 21:32:51

+0

真棒知道。 – b3tac0d3 2016-01-09 04:34:37

3

我不确定你的“用户标识符”是什么。一般规则是,不要在会话cookie中存储任何内容,但会话ID。在服务器端存储其他所有内容(如用户ID),并使用会话ID检索它。

如果用户更改了会话ID(这是一个随机字符串),将开始一个新的会话。会话ID背后的想法是,无法猜测其他用户的ID - 这就是为什么它是随机的,这么久。

+0

你碰巧知道codeigniter的会话类是否具有这样的功能?我同意这是个好主意。例如,如果我这样做:$ this-> sessions-> set_userdata('id',5);这个值是在cookie中传递给用户还是存储在服务器上并与会话ID相关联? – 2011-06-11 16:46:37

+0

@Casey我不熟悉CI,但根据[文档](http:// codeigniter。com/user_guide/libraries/sessions.html),数据确实存储在cookie中。他们显示一个安全的数据库选项,虽然 – 2011-06-11 16:48:03

+0

我的'用户标识符'基本上是我的用户表中每个用户的主键。我在SQL查询中使用它来修改与每个用户关联的属性。我知道这可能很糟糕。 – 2011-06-11 16:48:33

4

“如果 有可能采取 有效笨,会话cookie 用户标识符的值更改为 不同用户的价值, 更改其他用户的 帐户。”

我的答案并不是真正的CI相关,所以请牢记这一点。

当你认证用户“username1”时,应该发送回客户端,为了认证目的,应该是服务器与该用户关联的散列。客户端和服务器之间的所有通信将依赖于该散列。

服务器将为每个用户生成一个唯一的哈希,并且哈希应该有一个短暂的生存时间。有人可以捕获一个散列并通过该用户?当然。这就是为什么您还应该检查用户的代理和IP以检查它们是否与哈希匹配以防止会话劫持。如果看到了一些新的开发存储在cookie中的用户名和reliing对客户端发送的变量来更新他们的数据库

永远不要这样做。永远不要这样做。永远不要信任客户。当服务器获取客户端的哈希时,它应该检查它是否属于经过身份验证的用户,并从服务器获取user_id(变量以更新用户数据)。永远不要从客户端。