我确实搜索了一些有关PHP中会话安全性的信息,生病找到了一些不错的东西,但我仍然不确定这是否正确且安全,可以防止常见攻击。
public static function session_start()
{
ini_set('session.cookie_httponly', 1);
ini_set('session.session.use_only_cookies', 1);
ini_set('session.entropy_file', '/dev/urando');
ini_set('session.cookie_lifetime', 0);
ini_set('session.cookie_secure', 1);
if(session_status() != 2) session_start();
//fixation security step
if(!isset($_SESSION[self::$_CHECK_KEY]) || $_SESSION[self::$_CHECK_KEY] !== self::$_CHECK_VAL)
{
session_regenerate_id();
$_SESSION[self::$_CHECK_KEY] = self::$_CHECK_VAL;
}
//Hijacking secuity step
if(isset($_SESSION[self::$_USER_AGENT]))
{
if(self::CryptPass(
$_SERVER['HTTP_USER_AGENT'],
self::$_USER_SALT,
$_SESSION[self::$_USER_AGENT])
!== $_SESSION[self::$_USER_AGENT])
{
$this->ReqLogin = true;
}
}
else
{
$_SESSION[self::$_USER_AGENT] = self::CryptPass($_SERVER['HTTP_USER_AGENT'], self::$_USER_SALT);
}
}
所以我想知道有什么我可以做得更好吗?有些事我不应该做?
答案 0 :(得分:0)
安全性是一个相当广泛的主题领域 - 您的代码无法解决许多问题,并且您没有定义要解决的安全问题。例如,这对于保护与共享主机平台上的其他用户的会话没有任何作用。
暂时搁置一旁,显而易见的问题是Chrome浏览器可以在会话中升级(即用户代理更改)。我只在Chrome(和Chromium)浏览器中看到过这种情况,并且在会话中不应该多次发生这种情况。
跟踪IP地址的变化是一个好主意 - 但这些也可能在会话期间发生变化,例如:跨多个代理负载均衡。但是网络提供商(在地址的whois数据中)很少会在会话期间进行更改 - 这仍然可能发生,例如,如果移动设备从仅具有3G连接的区域移动到Wifi热点。
在身份验证状态更改时,您没有提供强制更改会话ID的显式方法。虽然固定/劫持涵盖了大多数可能性,但在这里做一个明确的改变仍然是一个好主意。