Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP会话固定/劫持_Php_Security_Session_Session Cookies - Fatal编程技术网

PHP会话固定/劫持

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变量的值进行比较

我正试图更多地了解PHP和劫持,以及如何防止这些问题。我一直在Chris Shiflett的网站上阅读以下两篇文章:

然而,我不确定我是否正确地理解了事情

为了防止会话固定,调用
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();
    }