我是PHP的新手并试图了解安全性。
我有一个管理页面,可以访问某些管理任务。现在,它允许您使用一些种子数据重新填充数据库表。
要访问管理页面,首先需要登录。目前登录不是通过https(很快就会结束)。
如果您进行身份验证,则会将令牌写入$ _SESSION。在每个管理页面中,都会检查令牌。如果无效,页面将重定向到登录页面。
我的问题:
这是在PHP中“锁定”敏感管理任务的正确方法吗?检查$ _SESSION变量中的值?我还应该做什么?
答案 0 :(得分:3)
这几乎是标准的做法。根据您的用户数据库/密码文件/其他一些身份验证数据对用户进行身份验证,将身份验证状态存储在会话变量中,最后检查每次用户尝试执行需要授权的操作时是否正确设置了会话变量。
答案 1 :(得分:1)
会话ID通常作为cookie存储在客户端。如果有人窃取了cookie,他们就可以劫持会话。即使您使用安全连接进行登录,以后,不安全的请求也会通过网络发送,并且无论加密通信如何,任何XSS漏洞都可用于捕获会话cookie。使用session_set_cookie_params
来限制发送cookie的网页的子域和路径。
您可以尝试使用不可欺骗的客户端数据来检测劫持。由于您无法控制协议,因此唯一的此类数据是远程IP,但攻击者可以在欺骗IP时进行盲目攻击。但是,这并不能防止与有效用户在同一NAT后面的劫持者,并且在代理请求方面存在问题。
您可以使用HTTP digest access authentication解决问题。它是一种质询 - 响应身份验证协议,因此可以在没有协议级加密的情况下工作。但是,它基于MD5,它具有已知的弱点。考虑到挑战的生命,这可能不是问题。 Digest auth很容易受到中间人攻击。
答案 2 :(得分:1)
如果您需要更精细的控制级别,可以查看基于角色的Access Control Lists。这样,经过身份验证的用户将根据您为其提供的角色授予或拒绝访问应用程序的某些部分。这是在常规密码身份验证之上的附加安全措施。
如果您只有一位用户,例如管理员,ACL虽然过度。