ste*_*225 15 php security authentication cookies session
我正在制作一个我希望尽可能安全的登录脚本.问题是,安全似乎是一场永无止境的战斗.基本上,我正在寻找我的想法的建议和改进.
我所拥有的是仅基于会话的登录.无论何时会话信息发生变化,session_regenerate_id()都会调用以避免明显的劫持尝试.
如果未设置会话,我会检查cookie以进行有效登录,并且在成功时,我会更新会话.
我尝试通过添加哈希值以及一段唯一的用户信息(如用户名或ID)来保护cookie.这个哈希由各种信息组成,包括用户名/ id,无法解密的密码哈希,IP地址的一部分等.通过从cookie中提取用户名/ id,我可以从有效的用户信息中创建一个新的哈希并比较使用cookie中的哈希值.我希望这里是防止假cookie和cookie劫持(除非他们也欺骗IP地址).
编辑假设登录本身将通过HTTPS/SSL完成,因此转移(合理)安全.
我是在正确的轨道上吗?还有什么可以保证我的登录?
谢谢您的帮助!
停止你在做什么.不要检查user-agent或IP地址.用户代理是受攻击者控制的变量,检查此值不会增加此系统的安全性.IP地址将因合法原因而更改,例如,如果用户位于负载均衡器或TOR之后.
会话ID必须始终是加密随机数.在php中调用session_start()然后开始使用$_SESSION超级全局.PHP会为您完成所有这些工作.如果要改进php的会话处理程序,请使用配置.启用use_only_cookies,cookie_httponly 和cookie_secure.如果您使用的是*nix系统,那么设置entropy_file为/dev/urandom是一个好主意,但如果您的窗口下有麻烦.
例如,对用户进行身份验证:
//In a header file
session_start();
...
if(check_login($_POST['user_name'],$_POST['password'])){
//Primary key of this user
$_SESSION['user_id']=get_user_id($_POST['user_name']);
$_SESSION['logged_id']=True;
}
Run Code Online (Sandbox Code Playgroud)
并验证用户是否已登录:
//in a header file
session_start()
...
if(!$_SESSION['logged_id']){
header("location: login.php");
die();//The script will keep executing unless you die()
}
Run Code Online (Sandbox Code Playgroud)
要改进此系统,请阅读OWASP A9并在会话的整个生命周期中使用HTTPS.另请阅读OWASP A5:CSRF又名"会话骑行"和OWASP A2:XSS,因为它们都可以用来破坏会话.
小智 3
不存在安全 cookie 之类的东西,除非它仅通过 SSL 传输。当使用持久性非会话 cookie(例如记住我)时,可以通过完全按照您正在做的事情进行操作(但不是按照您想要的方式进行操作)来缓解一些问题。
您确实可以存储服务器变量,例如用户代理、IP 地址等(甚至 JavaScript 变量),但它们仅适用于验证持久 cookie 数据是否与客户端的新连接相匹配。IP 地址不是一个好主意,除非您知道客户端(仅像您一样)不会在每次页面加载时发生更改(a la AOL)。
现代网络浏览器和 LastPass 等第 3 方服务可以存储登录凭据,只需按一下按键(有时甚至不需要按键)即可将数据发送到登录表单。持久性 cookie 只对那些拒绝使用其他可用内容的人有好处。最后,持久性非会话 cookie 不再需要了。