【问题标题】:PHP in_array not workingPHP in_array 不工作
【发布时间】:2009-07-01 16:05:09
【问题描述】:

我正在使用 PHP in_array() 函数来验证(通过会话)用户是否可以访问特定页面。由于某种原因,它无法正常工作...

PHP 页面

session_start();
require_once('../scripts/functions.php'); 
$role_auth = @$_SESSION['role_auth'];
access($role_auth, array(0,1,2,3,4));

访问功能

function access($role_auth, $array){

if(!(in_array($role_auth, $array))){ 
   header("Location: ../index.html");
}
}

如果我在函数中插入打印语句,我可以看到所有正确的值都被传递到函数中。问题是,如果在没有设置会话变量的情况下调用该函数,由于某种原因,它会被认为在数组中,并且它会进行身份验证。

有什么想法吗?

【问题讨论】:

  • 提示,您可以使用range(0,4) 代替array(0,1,2,3,4)php.net/range
  • 安全检查的简要说明。确保在发送标头后调用 die() 或 exit(),因为脚本中的内容仍将被发送。

标签: php arrays session


【解决方案1】:

您可能希望使用以下命令启用严格的类型检查:

in_array($role_auth, $array, true)

因为可能发生的情况是 $role_auth 被评估为 false 并且可能与 in_array 语句中的 0 匹配。

你应该这样做:

session_start(); 
require_once('../scripts/functions.php'); 
$role_auth = (isset($_SESSION['role_auth']))?$_SESSION['role_auth']:-1; 
access($role_auth, array(0,1,2,3,4));

或类似的东西。使用 @ 运算符没有什么好处

【讨论】:

    【解决方案2】:

    我会检查是否实际设置了 $_SESSION['role_auth'](使用 isset)而不是使用 @ 来抑制警告(恕我直言,这是不好的做法)

    我认为发生的事情是 false == 0 ...所以in_array 在 $role_auth 中没有任何内容时返回 true,因为它将它视为 0 并且 0 在您的数组中

    【讨论】:

      【解决方案3】:
       $role_auth = @$_SESSION['role_auth'];
      

      @ 符号会抑制您可能在此处收到的任何警告,例如索引不在数组中。像这样的东西怎么样:

       if(isset($_SESSION['role_auth']))
          $role_auth = $_SESSION['role_auth'];
       else
          $role_auth = -1;//(or whatever an invalid role is)
      

      【讨论】:

      • @ 在性能方面也相当昂贵,因为 php 在后台打开和关闭错误报告。
      【解决方案4】:

      在php中,数字0被认为等于大多数非数字的东西,例如:

      null   == 0
      false  == 0
      ""     == 0
      "asdf" == 0
      

      您可能需要事先确保$_SESSION 实际包含'role_auth' 键并将其转换为适当的类型,同时将$strict 参数传递给in_array,从而保证类型检查以及值检查(=====)。从数组中删除零也可能是个好主意。

      【讨论】:

      • 这让我吃惊!, 0 == "asdf" OMFG!! :@
      • HOLY SH#t!!,自从创建以来,这种行为影响了我的整个网络应用程序! (股票和序列号相关),现在我修补了这个并进行了一致性检查......(一切都很好!)说真的,我将提名 Noah Medling 为年度人物 =P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多