我有一个网站,只有具有管理员权限的用户才能查看某些页面。当我登录我的管理员帐户时,$_session["is_admin"] = true
已设置。然后在我希望只有具有管理员权限的用户能够查看的页面上,我检查is_admin是否为真,否则我将它们重定向到索引页面。
if(!$_SESSION["is_admin"]){ //redirect to index.Php}
在这种情况下,有更好的方法来保护网页吗?
由于
答案 0 :(得分:3)
如果代码不在公共场所(公共文件夹上方),则代码更安全,因此问题发生的难度更大。这里发生了什么?
</php
// Code
如果整个页面的内容位于公共文件夹中,则它将以纯文本显示。虽然这种情况很少见,但缺少一个php标签并不常见,在包含的文件中更是如此(然后攻击者可以直接访问该文件)。
另外,请查看此其他SO question about session hijacking,它会直接关注您的问题。
EDIT。我刚看了facebook's Criticism Wikipedia page并且非常相关,所以我引用它:
据领先的互联网新闻网站称,2007年8月,当访问者浏览网站时,用于生成Facebook主页和搜索页面的代码被意外公开。 Facebook服务器上的配置问题导致显示PHP代码而不是代码应该创建的网页,这引起了对网站上私人数据安全性的担忧。
如果他们当天在其他地方问过这个问题,他们可能就不会被曝光了。
答案 1 :(得分:2)
严格依赖$_SESSION
全球不是非常安全。有些应用程序能够“劫持”会话并操纵存储在客户端的SESSION
ID
。看看FireSheep。
我建议的是实现某种类型的额外安全级别。额外的安全级别可能包括白名单IP地址,或SESSION
的短暂到期时间。
另见is storing data in php session insecure(这不是同一个问题,但类似)。
白名单IP地址:
作为mentioned in white list ip address for admin access,您可以保留有权访问您网页的IP地址记录。如果IP地址不在允许的地址中,则拒绝访问该页面。您可以将地址存储在数据库中或将其硬编码到脚本中(我将远离硬编码)。
以下是从上面链接中的zerkms中获取的修改示例,其中包含您的SESSION
测试:
$whitelist = array('192.168.0.1', '192.168.0.2');
if ($_SESSION['is_admin'] !== true || !in_array($_SERVER['REMOTE_ADDR'], $whitelist)) {
//Admin denied.
header('Location: denied.php'); exit();
}
echo "You're an admin!"
缩短会话到期时间:
我建议阅读Gumbo的回答here。
更多阅读材料:
答案 2 :(得分:1)
如果您在访问页面方面只有管理员和非管理员用户,则可以。 如果您有更多用户级别,也可以实现角色。