PHP会话变量处理不当?

时间:2009-05-04 14:17:31

标签: php security session

我目前在我的cms中使用以下代码来检查访问者是否以管理员身份登录,以便他可以编辑当前页面:

if($_SESSION['admin']=="1")
{
        echo "<a href="foobar/?update">edit</a>";
}

但我担心代码不安全。用户不能轻易修改$ _session变量吗?

什么是更安全的做法?

6 个答案:

答案 0 :(得分:4)

不,这是一个很好的方法。用户无法修改$ _SESSION全局,除非他有权访问您的服务器。请记住远离客户端Cookie

为了使它更安全,一个好方法是存储IP地址并检查它是否在每个请求之间保持不变。

答案 1 :(得分:3)

代码没问题,你只是显示一个链接。只需确保您的UPDATE脚本也受到保护。

答案 2 :(得分:1)

用户无法设置

$_SESSION个变量。因此代码非常好,尽管您通常会询问您的用户后端(通常只是表用户,有时是LDAP)有关当前用户的权限。

答案 3 :(得分:1)

我找到了关于会话安全性的演示文稿

它解释了如何避免:

  • 会话固定。
  • 会话劫持。

此外,包含更多信息的幻灯片还有一些真正的商品链接

答案 4 :(得分:0)

一旦编码安全,会话变量应该足够安全。

另外,请使用以下内容。用==停止错误 也可能也应该使用true,因为它比字符串比较快得多。

if( "1" === $_SESSION['admin'] )

答案 5 :(得分:0)

此代码不再安全:

if mypage.php contains this code:

session_start();
$_SESSION['admin']==1;
echo "<a href='http://the.link-to-your-page.php' target='_blank'>link</a>";

如果点击了该链接,则会话管理员1将被带到您的页面,并且会出现编辑按钮。

最安全的方法是在登录验证后立即设置令牌(这是一个非常简单的步骤)。 例如$token = sh512($var.....); $_SESSION['token']=$token;

在每个页面的顶部放置如下内容:

if(!isset($_SESSION['token'])){ die('Access Denied');}
if(!isset($_SESSION['username'])){ die('Access Granted');}

首先检查SESSION中的令牌进位,然后检查用户ID,包括用户的权限级别。这只是一种简单的方法,在开头添加更多的指纹扫描代码,使拦截sessionid变得复杂。