PHP会话固定/劫持
我正试图更多地了解PHP和劫持,以及如何防止这些问题。我一直在Chris Shiflett的网站上阅读以下两篇文章:PHP会话固定/劫持,php,security,session,session-cookies,Php,Security,Session,Session Cookies,我正试图更多地了解PHP和劫持,以及如何防止这些问题。我一直在Chris Shiflett的网站上阅读以下两篇文章: 然而,我不确定我是否正确地理解了事情 为了防止会话固定,调用session\u regenerate\u id(true)就足够了吗成功登录某人之后?我想我理解得对 他还谈到使用通过$\u GET在URL中传递的令牌来防止会话劫持。究竟如何做到这一点?我猜当有人登录时,您会生成他们的令牌并将其存储在会话变量中,然后在每个页面上将该会话变量与$\u GET变量的值进行比较
session\u regenerate\u id(true)就足够了吗代码>成功登录某人之后?我想我理解得对
他还谈到使用通过$\u GET
在URL中传递的令牌来防止会话劫持。究竟如何做到这一点?我猜当有人登录时,您会生成他们的令牌并将其存储在会话变量中,然后在每个页面上将该会话变量与$\u GET
变量的值进行比较
是否每个会话或每个页面加载只需更改一次此令牌
还有一种防止劫持的好方法,而不必在URL中传递值吗?这会容易得多。您提到的代币是一个“nonce”——使用过一次的数字。它们不一定只需要使用一次,但使用的时间越长,捕获和使用nonce劫持会话的几率就越高
nonces的另一个缺点是很难构建一个使用nonces并允许在同一窗体上有多个并行窗口的系统。e、 g.用户在论坛上打开两个窗口,并开始处理两个帖子:
window 'A' loads first and gets nonce 'P'
window 'B' loads second and gets nonce 'Q'
如果您无法跟踪多个窗口,您将只存储一个nonce,即窗口B/Q。当用户从窗口A提交帖子并传入nonce“p”时,系统将以p!=Q
我没有读希夫莱特的文章,但我认为你误解了什么
默认情况下,只要客户端不接受cookie,PHP就会在URL中传递会话令牌。Oherwise在最常见的情况下,会话令牌存储为cookie
这意味着,如果您将会话令牌放入URL中,PHP将识别它并随后尝试使用它。会话固定发生在某人创建会话,然后通过打开包含会话令牌的URL欺骗其他用户共享同一会话时。如果用户以某种方式进行身份验证,那么恶意用户就会知道经过身份验证的用户的会话令牌,该用户可能具有不同的权限
正如我确信Shiflett所解释的,通常要做的事情是每次用户的权限更改时重新生成不同的令牌。是的,您可以通过在登录时重新生成会话id来防止会话固定。如果攻击者不知道新认证会话的cookie值,则可以使用这种方法。另一种完全停止问题的方法是设置会话。在运行时配置中使用\u only\u cookies=True
。攻击者无法在另一个域的上下文中设置cookie的值。会话固定依赖于将cookie值作为GET或POST发送 好的,有两个独立但相关的问题,每个问题的处理方式都不同
会话固定
这是攻击者显式设置用户会话的会话标识符的地方。通常在PHP中,它是通过给他们一个url来完成的,比如http://www.example.com/index...?session_name=sessionid
。一旦攻击者将url提供给客户端,该攻击与会话劫持攻击相同
有几种方法可以防止会话固定(全部执行):
- 在
php.ini
文件中设置。这将告诉PHP不要在URL中包含标识符,也不要读取URL中的标识符
- 在
php.ini
文件中设置。这将告诉PHP永远不要使用带有会话标识符的URL
- 在会话状态更改时重新生成会话ID。这意味着以下任何一项:
- 用户身份验证
- 在会话中存储敏感信息
- 更改有关会话的任何内容
- 等等
劫持
这是攻击者获得会话标识符并能够发送请求的地方,就像他们是该用户一样。这意味着,由于攻击者拥有该标识符,它们与服务器上的有效用户几乎无法区分
您不能直接阻止会话劫持。但是,您可以采取措施使其变得非常困难和难以使用
- 使用强会话哈希标识符:在
php.ini
中。如果PHP<5.3,则为SHA1将其设置为session.hash_function=1
。如果PHP>=5.3,则将其设置为session.hash_function=sha256
或session.hash_function=sha512
- 发送一个强散列:在
php.ini
中。将此设置为session.hash\u bits\u per\u character=5
。虽然这并不会使破解变得更加困难,但当攻击者试图猜测会话标识符时,它确实会产生影响。ID将更短,但使用更多字符
- 在
php.ini
文件中设置额外的熵。将前者设置为session.entropy\u file=/dev/uradom
,将后者设置为将从entropy文件读取的字节数,例如session.entropy\u length=256
- 从默认的PHPSESSID更改会话的名称。这是通过在调用
会话\u start
之前使用您自己的标识符名称作为第一个参数进行调用来实现的
- 如果你是真的偏执狂,你也可以旋转会话名称,但要注意,如果你更改此名称,所有会话都将自动失效(例如,如果你使其依赖于时间)。但根据您的用例,它可能是一个选项
- 经常旋转会话标识符。我不会每一个请求都这样做(除非你真的需要)
function destroySession() {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
session_destroy();
}