2016-04-02 86 views
0

我想爲「安全」php頁面創建一個函數,該頁面將檢查令牌(通過post和會話傳遞的令牌)。
           但我不想寫兩個if語句是這樣的:在if語句中執行函數的命令php

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操作數,那麼如果第一個條件ns是錯誤的,不要評估第二個。我記得vb.net有解決這個問題的方法(只評估第一個函數 - 如果它是錯誤的,不要評估第二個函數)。
           因此,把所有東西都放在一條線上是安全的嗎(就像我在第二個例子中那樣)?

+0

我會一直堅持第一個選項,因爲我喜歡分開我的條件。這通常用於診斷問題並根據狀態返回單獨的錯誤消息。但是,如果你不擔心將錯誤返回給用戶等,那麼任何一個都沒問題。兩個人都在做同樣的事情。 – Juakali92

回答

1

PHP與其他主要語言中通常的if語句評估的功能相同,即從左到右進行檢查。

所以,如果你有

if (cond1 && cond2 && cond3) 

方案1:
如果cond1是真的,這將執行cond2,然後cond3
樣品:https://3v4l.org/Ap9SQ

方案2:
如果讓我們說cond2false,然後cond3將被忽略。
樣品:https://3v4l.org/u9P4O

同去OR

if (cond1 || cond2 || cond3) 

如果cond1是真實的,cond2cond3將被跳過。
樣品:https://3v4l.org/ZAZcD


如此以來,你的函數只是返回truefalse,你甚至可以它簡化爲這樣的事情:

function CheckToken() { 
    return isset($_POST['token']) && 
      isset($_SESSION['token']) && 
      $_POST['token'] == $_SESSION['token']; 
} 

分割線可讀性。同時結賬isset手冊,因爲您可以傳遞多個變量進行空檢查。

1

是的,改變這種順序確實沒有什麼區別。這是完全安全的,因爲它所做的只是改變腳本的外觀,而執行完全一樣。

最好做第二個選項。