我想为一个“安全”的php页面创建一个函数来检查令牌(通过post传递的令牌和会话中的那个)。
但是我不想写两个if语句像这样:
function CheckToken(){
if(isset($_POST['token']) && isset($_SESSION['token']))
if($_POST['token']==$_SESSION['token']) return true;
return false;
}
我可以这样做(?):
function CheckToken(){
if(isset($_POST['token']) && isset($_SESSION['token']) && $_POST['token']==$_SESSION['token']) return true;
return false;
}
以下是关于执行这些函数的顺序(当使用和运算符时)。所以如果你使用AND操作数,那么如果第一个条件为false则不评估第二个。我记得vb.net有一个解决这个问题的方法(仅评估第一个函数 - 如果它是false则不评估第二个函数)。
因此,将所有内容放在一行上是否安全(如我在第二个例子中做过)?
答案 0 :(得分:1)
是的,改变这样的顺序确实没有区别。它是完全安全的,因为它所做的只是改变脚本的外观,而执行是完全相同的。
最好选择第二种选择。
答案 1 :(得分:1)
PHP与其他主要语言中通常的if
语句评估相同,即从左到右进行检查。
所以,如果你有
if (cond1 && cond2 && cond3)
情景1:
如果cond1
为真,则会执行cond2
,然后cond3
示例:https://3v4l.org/Ap9SQ
情景2:
如果我们说cond2
为false
,则cond3
将被忽略。
示例:https://3v4l.org/u9P4O
同样适用于OR
if (cond1 || cond2 || cond3)
如果cond1
为真,则会跳过cond2
和cond3
示例:https://3v4l.org/ZAZcD
因为您的函数只是返回true
或false
,所以您甚至可以将其简化为:
function CheckToken() {
return isset($_POST['token']) &&
isset($_SESSION['token']) &&
$_POST['token'] == $_SESSION['token'];
}
分割线以提高可读性。另外结帐isset
手册,因为您可以传入多个变量进行空检查。