通过确保创建会话的唯一来源应该是安全的随机生成器来防止会话固定

Har*_*ker 5 php session

我试图阻止会话固定并从owasp网站上阅读以下内容:

会话固定

会话ID仅由您的应用程序生成.永远不要仅因为从客户端收到会话ID而创建会话,创建会话的唯一来源应该是安全的随机生成器.

我使用以下方式处理会话:

ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies. 
ini_set('session.entropy_file', '/dev/urandom'); // better session id's
ini_set('session.entropy_length', '512');
session_start();
Run Code Online (Sandbox Code Playgroud)

并检查是否存在用户ID:

if(isset($_SESSION['user_id'])) {
    //act like user is logged in
} else {
    //refer user to the login page
}
Run Code Online (Sandbox Code Playgroud)

这是否意味着创建会话的唯一来源是通过安全的随机生成器?

dec*_*eze 7

默认情况下,PHP易于会话固定:

一个简单的攻击场景

直截了当的场景:

  1. Mallory已确定http://unsafe.example.com/接受任何会话标识符,从查询字符串接受会话标识符,并且没有安全验证.因此,http://unsafe.example.com/不安全.
  2. Mallory给Alice发了一封电子邮件:"嘿,看看这个,我们银行有一个很酷的新帐户摘要功能, http://unsafe.example.com/?SID = I_WILL_KNOW_THE_SID ".Mallory正在尝试将SID固定为I_WILL_KNOW_THE_SID.
  3. Alice感兴趣并访问http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID.弹出通常的登录屏幕,Alice登录.
  4. Mallory访问http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID,现在可以无限制地访问Alice的帐户.

http://en.wikipedia.org/wiki/Session_fixation

session.use_strict_mode boolean

session.use_strict_mode指定模块是否将使用严格的会话ID模式.如果启用此模式,则模块不接受未初始化的会话ID.如果从浏览器发送未初始化的会话ID,则会向浏览器发送新的会话ID.通过严格模式的会话采用保护应用程序免受会话固定.默认为0(禁用).

http://php.net/manual/en/session.configuration.php#ini.session.use-strict-mode

启用session.use_strict_mode可防止PHP接受不存在的会话的ID并创建它们.但这并不妨碍其他类型的会话固定:

使用服务器生成的SID攻击

一种误解是只接受服务器生成的会话标识符的服务器是安全的.这是错误的.

场景:

  1. Mallory访问http://vulnerable.example.com/并检查返回的SID.例如,服务器可以响应:Set-Cookie:SID = 0D6441FEA4496C2.
  2. Mallory现在可以向Alice发送一封电子邮件:"查看我们银行的这一新酷炫功能, http://vulnerable.example.com/?SID = 0D6441FEA4496C2."
  3. Alice登录,具有固定的会话标识符SID = 0D6441FEA4496C2.
  4. Mallory访问http://vulnerable.example.com/?SID=0D6441FEA4496C2,现在可以无限制地访问Alice的帐户.

这可以session.use_only_cookies通过默认情况下启用来防止.

您可能仍然容易受到XSS的更多会话固定攻击,您必须使用PHP ini设置以外的其他措施来抵消这种攻击.