PHP:使用存储为cookie的令牌防止会话劫持?

Gre*_*reg 4 php cookies session token

我正在使用PHP进行RIA.为了防止会话劫持,我引入了一个基于盐,ISO-8601周数和用户IP的登录时生成的令牌.

$salt      = "blahblahblah";
$tokenstr  = date('W') . $salt . $_SERVER['REMOTE_ADDR'];
$token_md5  = md5($tokenstr);
define("token_md5", $token_md5); 
Run Code Online (Sandbox Code Playgroud)

目前,它通过GET或POST传递每个请求,但我想知道我是否可以通过提供它作为cookie来避免这种情况,因为它依赖于用户的IP.我刚刚学习课程,所以我想知道这样做是否有任何安全问题?这是个坏主意吗?

Mik*_*e B 7

session_regenerate_id() 非常适合防止会话劫持.

session_regenerate_id - 使用新生成的会话ID更新当前会话ID

每次页面访问时连续旋转session_id.劫持不断移动的目标非常困难.

  • 如果你没有将`true`传递给`session_regenerate_id`,那么旧的会话仍然可以被劫持者使用.而且,"困难"与"不能"不一样.如果您这样做并且劫持者成功,则用户将从其会话中启动. (2认同)

out*_*tis 7

用户保留的任何数据都可能被盗; 访问者发送的任何数据都可能被欺骗.最好在$_SESSION打开会话时存储远程IP ,并将远程IP与每个请求进行比较.如果他们不匹配,那可能是劫持.生成新ID并让用户重新登录.

  • @JoshuaKaiser:负载平衡转发代理也可能导致漏报,尽管大多数负载平衡代理应该是反向代理,这不是一个问题.如果请求是代理的,您也可以记录X-Forwarded-For标头,但它可以被欺骗(检查远程IP(如果不是反向代理)和X-Forwarded-For标头应该是安全的).此外,没有任何合适的机器标识符可访问服务器端(尽管JS脚本可能能够嗅探客户端的某些东西).虽然NAT仍​​然会导致误报,但IPv6应该会更好. (3认同)
  • 根据用户的 IP 生成令牌也是一种冒险的技术。这里的问题是用户的 IP 可能会因各种原因合法地更改,并且在大多数情况下,由于网络路由器的工作方式,多个用户隐藏在同一个 IP 地址后面。我自己正在研究这个挑战,还没有想出一种我更喜欢的技术。 (2认同)