在PHP中安全地创建和销毁登录会话

Cel*_*tas 17 php security authentication

这是我控制网站身份验证的代码.我不确定我的逻辑是否正确.如果用户名和密码正确,则会发生以下情况:

if(session_start())
{
        session_regenerate_id(true);//without this the session ID will always be the same
        $_SESSION['loggedInUser'] = $uName;
        echo 'You are now logged in';
}
else echo 'Right password/username but session failed to start';
Run Code Online (Sandbox Code Playgroud)

后续页面检查用户是否已登录

session_start();
if(isset($_SESSION['loggedInUser'])
{
 //rest of page
}
else echo 'you must log in';
Run Code Online (Sandbox Code Playgroud)

退出时我有

session_start();//if I don't have this the next line produces an error
session_unset();//destroys session variables
session_destroy();//ends session
Run Code Online (Sandbox Code Playgroud)

我红了不要在注销时调用session_start()但是如果我没有它那里我得到消息Trying to destroy uninitialized session.我怎样才能解决这个问题?

是否建议根据IP地址和用户代理创建指纹?我认为它很糟糕,因为多台计算机可以共享相同的IP地址(例如计算机实验室),并且所有流量都通过代理,同一台计算机可以更改它的IP地址(如果它是动态的).另一方面,这种情况多久发生一次?可能值得阻止所有会话劫持的少数阻止有效用途.

即使您可以推荐信誉良好的文章,我也应该阅读以了解这个主题,这将是非常好的,谢谢.

5/6答案的投票少于0 :(可能会对选民发表评论,所以我知道该注意什么?

roo*_*ook 26

首先,您应该阅读Mozilla WebAppSec安全编码指南 - 会话管理OWASP A3破坏的身份验证和会话管理.您可以配置PHP的会话处理程序以满足这些要求.

您应该防止的第一个缺陷是A9-传输层保护不足.简而言之,您不希望有人使用像Firesheep这样的工具劫持会话.可以通过强制浏览器仅通过https发送会话ID来防止此攻击:

session.cookie_secure=1
Run Code Online (Sandbox Code Playgroud)

您可以通过设置httponly标志来阻止攻击者使用XSS获取会话ID :

session.cookie_httponly=1
Run Code Online (Sandbox Code Playgroud)

始终希望使用Cookie来存储会话ID.如果可以使用GET或POST变量传递会话ID,则攻击者可以使用会话固定攻击来劫持会话.另一种思考此攻击的方法是,您不希望攻击者为其他用户创建会话:

session.use_cookies=1
session.use_only_cookies=1
Run Code Online (Sandbox Code Playgroud)

接下来,您要确保从CSPRNG获得至少128位的熵.在*nix系统下,您可以使用/dev/urandom:

session.entropy_file="/dev/urandom"
session.entropy_length=16
Run Code Online (Sandbox Code Playgroud)

会话处理程序不是一切.您仍然需要担心跨站点请求伪造攻击(又称CSRF或"会话骑行")和跨站点脚本(XSS).XSS可用于破坏CSRF保护(即使使用http_only cookie!). 攻击者也可以使用点击劫持来执行未经授权的操作.

设置这些配置选项后,只需调用即可session_start().至于session_destroy()用户注销时破坏会话调用,就这么简单!