我试图阻止会话固定并从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)
这是否意味着创建会话的唯一来源是通过安全的随机生成器?
默认情况下,PHP易于会话固定:
一个简单的攻击场景
直截了当的场景:
- Mallory已确定http://unsafe.example.com/接受任何会话标识符,从查询字符串接受会话标识符,并且没有安全验证.因此,http://unsafe.example.com/不安全.
- Mallory给Alice发了一封电子邮件:"嘿,看看这个,我们银行有一个很酷的新帐户摘要功能, http://unsafe.example.com/?SID = I_WILL_KNOW_THE_SID ".Mallory正在尝试将SID固定为I_WILL_KNOW_THE_SID.
- Alice感兴趣并访问http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID.弹出通常的登录屏幕,Alice登录.
- Mallory访问http://unsafe.example.com/?SID=I_WILL_KNOW_THE_SID,现在可以无限制地访问Alice的帐户.
http://en.wikipedia.org/wiki/Session_fixation
session.use_strict_modeboolean
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攻击
一种误解是只接受服务器生成的会话标识符的服务器是安全的.这是错误的.
场景:
- Mallory访问http://vulnerable.example.com/并检查返回的SID.例如,服务器可以响应:Set-Cookie:SID = 0D6441FEA4496C2.
- Mallory现在可以向Alice发送一封电子邮件:"查看我们银行的这一新酷炫功能, http://vulnerable.example.com/?SID = 0D6441FEA4496C2."
- Alice登录,具有固定的会话标识符SID = 0D6441FEA4496C2.
- Mallory访问http://vulnerable.example.com/?SID=0D6441FEA4496C2,现在可以无限制地访问Alice的帐户.
这可以session.use_only_cookies通过默认情况下启用来防止.
您可能仍然容易受到XSS的更多会话固定攻击,您必须使用PHP ini设置以外的其他措施来抵消这种攻击.