loculus/session-security-bundle

增强基于Symfony应用会话安全性的Bundle

v0.8.0 2022-07-14 17:38 UTC

README

关于

会话固定是一种安全攻击,允许攻击者劫持有效用户会话。当应用程序在验证用户时不分配新的会话ID时,容易受到这种攻击。

https://symfony.com.cn/doc/current/reference/configuration/security.html

Symfony可以通过使用三种不同的策略之一来处理会话固定问题

  • NONE - 验证后不更改会话,这不被推荐;
  • MIGRATE (默认) - 会话ID被更新,但会话的其他属性保持不变;
  • INVALIDATE - 完全重新生成会话,因此会话ID被更新,但所有其他会话属性都将丢失。

此Bundle的创建是为了为Symfony 6.0应用程序提供会话安全改进。

会话安全Bundle解决了会话cookie被某些用户代理/设备劫持并在另一个设备上使用的问题。

问题

假设你有两台电脑

  • 一台装有Ubuntu,你使用Mozilla Firefox 102.0.1;
  • 另一台装有Windows 10,你使用Google Chrome 100.0;

如果你以jane_doe的身份登录到你的应用程序,然后从一台电脑复制会话cookie(名称为PHPSESSID)到另一台,你也会在那个电脑上以jane_doe的身份登录。

这是因为Symfony没有保护你的应用程序免受会话cookie劫持。

要求

此Bundle的源代码是用PHP 8.0编写的,与Symfony 6.0相同

基于browscap的三个验证器 - 浏览器功能项目,允许你检测

  • 轻量版:浏览器名称、浏览器版本、设备类型、平台(操作系统);
  • 完整版:以上内容以及浏览器功能,例如是否支持JavaScript、CSS、框架、表格等。

Browscap安装

要安装browscap,只需下载browscap.ini文件(轻量版或完整版),然后在你的php.ini文件中设置其路径。

然后重新启动你的PHP服务(和Web服务器),你应该能够根据用户代理头部检测浏览器及其平台。

更多关于browscap的信息,你可以在php.net网站上阅读

Bundle安装

要将此Bundle添加到你的应用程序,只需运行以下命令

composer req loculus/session-security-bundle

此命令将添加此Bundle的最新版本到你的config/bundles.php

然后你需要配置验证器和会话失效策略。

如果你不这样做,你会得到以下错误信息

The child config "session_validators" under "session_security" must be configured.

配置

你需要创建新的Yaml文件config/packages/loculus_session_security.yaml

此Bundle的最小配置如下

loculus_session_security:
    session_validators: []
    session_invalidation_strategies: []

上述配置

  • 不会启用任何会话验证器,
  • 也不会启用任何会话失效策略。

所以你有这个Bundle启用了,但你的应用程序仍然像以前一样工作。

可用的会话验证器

你可以使用以下会话验证器

  • user_agent_validator - 它基于$_SERVER['HTTP_USER_AGENT'],它不被推荐,因为用户可以升级他们的网络浏览器,这会导致不良行为;
  • ip_address_validator - 该验证器基于 $_SERVER['REMOTE_ADDR'],但不推荐使用,因为用户的IP地址可能会频繁变化,这可能会导致不希望的行为;
  • browser_name_validator - 该验证器基于浏览器名称,由browscap库提供,强烈推荐;示例值:FirefoxChromeSafariOpera
  • browser_platform_validator - 该验证器基于浏览器平台(操作系统),由browscap库提供,强烈推荐;示例值:LinuxWin10iOSAndroid
  • browser_device_type_validator - 该验证器基于设备类型,由browscap库提供,强烈推荐;示例值:DesktopTabletMobile Phone

可用的会话无效化策略

您可以使用以下会话无效化策略

  • session_regenerate_id_strategy - 重新生成会话ID,然后销毁整个会话;如果您想保护我们的应用程序免受会话劫持,则此策略应启用
  • throw_invalid_session_exception_strategy - 抛出 InvalidSessionException,导致当前请求错误500;
  • throw_cookie_theft_exception_strategy - 抛出由 symfony/security-core 提供的 CookieTheftException,并强制Symfony将用户重定向到包含登录表单的页面;如果您想保护我们的应用程序免受会话劫持,则此策略应启用

无效配置

您不能启用不可用的会话验证器或会话无效化策略。

因此,以下包配置将抛出异常

loculus_session_security:
    session_validators:
       - 'unknown_validator'

    session_invalidation_strategies:
       - 'unknown_strategy'

您可以通过实现指定的接口添加自己的会话验证器或会话无效化策略

  • ValidatorInterface 用于会话验证器,
  • 以及 InvalidationStrategyInterface 用于会话无效化策略。

推荐配置

我们推荐以下配置

loculus_session_security:
    session_validators:
        - 'browser_name_validator'
        - 'browser_platform_validator'
        - 'browser_device_type_validator'

    session_invalidation_strategies:
        - 'session_regenerate_id_strategy'
        - 'throw_cookie_theft_exception_strategy'

在上面的情况下,我们检查浏览器名称、平台和设备类型。我们不检查浏览器版本(该验证器不在包中)。

如果验证管理器检测到无效会话,则将触发 InvalidSessionEvent。无效会话监听器拦截此事件,然后执行无效化策略管理器,以配置中指定的方式处理问题。

在上面的情况下,会话ID被重新生成,无效会话被销毁,用户被重定向到登录页面,因为正在抛出 CookieTheftException

针对Web开发者的注意事项

如果您是Web开发者并且在使用浏览器中的响应式模式,您可能会遇到(未)预期的注销。这是因为如果指定了一些移动设备,但您在桌面电脑上登录,您的用户代理标头将不同。

每次在响应式模式下更改设备时,都会发生重定向到登录页面。

测试

单元测试

php vendor/bin/phpunit

代码覆盖率

XDEBUG_MODE=coverage php vendor/bin/phpunit --coverage-clover=build/reports/phpunit-clover.xml --coverage-html=build/reports/coverage --log-junit=build/reports/phpunit-junit.xml