感谢您的回复。我已经更新了我的PHP会话代码。
我已经摆脱了用户代理检查,因为@Rook已经向我展示了逻辑中的缺陷。
不幸的是,我把原来的问题搞砸了,现在编辑它我无法回复对不起的家伙,但@Rook确实解决了我原来的问题。
再次感谢您的帮助,daza166
答案 0 :(得分:6)
你所做的一切都无法提高会话的实力。你必须清楚你正在防御什么攻击,因为你的检查不会阻止攻击。一个很好的例子是检查用户代理,这对于欺骗是微不足道的。滚动会话ID,即使一个值泄露或者您有XSS / CSRF漏洞也无济于事,然后攻击者可以控制会话。
阅读OWASP A3-Broken Authentication and Session Management。另请阅读有关OWASP A5-CSRF的内容,有时也称为“会话骑行”。
您应该在php头文件中使用此代码:
ini_set('session.cookie_secure',1);
ini_set('session.cookie_httponly',1);
ini_set('session.use_only_cookies',1);
session_start();
此代码会阻止session fixation。它还有助于防止xss访问document.cookie
,这是Session Hijacking可以发生的一种方式。仅强制使用HTTPS是解决OWASP A9-Insufficient Transport Layer Protection的好方法。这种使用HTTPS的方式有时被称为“安全cookie”,这是一个可怕的名称。此外,STS是一个非常酷的安全功能,但并非所有浏览器都支持它(<)。
答案 1 :(得分:4)
如果登录用户没有退出他的帐户并且会话永远不会被破坏即(logout-page.php),那么会话会在浏览器关闭时死亡吗?我问的原因是,当浏览器关闭时用户是否没有注销,当浏览器重新打开时,该网站表示用户仍然登录。
没有。会话在服务器端进行管理,客户端仅获取用于标识的会话ID。关闭浏览器只会破坏保存会话ID但不保存关联会话的session cookies(即仅在当前浏览器会话期间有效的cookie)。如果在重新打开浏览器后使用相同的会话,则会话的cookie可能不是真正的会话cookie而是persistent cookie。您可以将该设置session.cookie_lifetime调整为0
。
最好是让用户登录(例如login.php - 输入详细信息一次 - >开始会话),而不是要求用户继续登录,如上所述,如果我的脚本发生错误或某些页面用户访问我销毁会话(即注销)?
通常,当您将会话用于用户身份验证目的时,如果您对当前用户的身份验证有疑问(例如,用户代理已更改)或者您是否需要其他身份验证确认,则应仅要求重新身份验证(例如,特权变更,作为不可否认的证据等。)。
答案 2 :(得分:2)
对我来说似乎是一个合理的问题:)
无论如何,出于安全原因,你已经在重新编制ID方面走得很好。它确实有助于防止会话劫持。
您可以使用session_set_cookie_params设置会话ID Cookie的生命周期。这应该是#1
所需要的对于#2,我实际上没有遇到会在发生错误时破坏会话的应用程序,但我认为至少如果你的应用程序由于编程错误或者错误引发了错误,这可能是一个好主意。用户试图做他们不应该做的事情。您可能希望为此实现某种错误记录和警报,以便您可以修复这些内容。