2017-02-14 41 views
0

我使用以下postgresql命令來嘗試檢索給定電子郵件/散列pw組合的記錄。我有密碼和電子郵件存儲在表中,並且該查詢似乎成功地將f或t用於密碼檢查,但php腳本似乎不能處理輸出。使用select exists()來比較Postgres中的密碼與php

PHP:

// 2. Check Passwords 
    $sql = "select exists(select 1 from users where (email='".$email."') AND (pw = '".$password."'));"; 
    echo $sql . "<br>"; 

    $ret = pg_query($db, $sql); 
     if(!$ret){ 
      echo pg_last_error($db); 
      exit; 
     } 
    if($ret === true){ 
      echo "Login Successful"; 

    }else{ 
      $errors = $errors . "Passwords do not match. Please try again. <br>"; 
    } 

這目前輸出SQL查詢

select exists(select 1 from users where (email='[email protected]') AND (pw = '8a8bA3anjqV.g')); 

,其與任一噸或f成功返回

 exists 
-------- 
t 
(1 row) 

我似乎無法弄清楚爲什麼這不與我的PHP腳本。 (對所有結果(t或f)不合格)

任何想法都將非常感激。

+2

請注意,您的代碼已廣泛用於SQL注入。如果可能,您應該使用參數化查詢。請參閱[如何防止SQL注入PHP?](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) - 請注意,信息可能會有點不同,因爲你使用的是pgSQL。 – Bytewave

+0

在同一個程序中對它進行消毒...我需要在數據庫查詢級別進行消毒嗎? – itchyspacesuit

+1

參數化查詢更安全,因爲數據庫不必進行任何轉義,並可能錯過開發人員沒有考慮到的某些漏洞利用。它不會將整個語句作爲一個完整的SQL查詢執行,它會準備一個數據綁定的查詢,從而有效地消除SQL注入。 – Bytewave

回答

0

啊哈!

我正在愚蠢與我的PHP。

我修改了代碼,如下所示,現在看起來很好。

// 2. Check Passwords 
    $sql = "select exists(select 1 from users where (email='".$email."') AND (pw = '".$password."'));"; 
    echo $sql . "<br>"; 

    $ret = pg_query($db, $sql); 
     if(!$ret){ 
      echo pg_last_error($db); 
      exit; 
     } 
    $bool = pg_fetch_row($ret); 
    echo $bool['0'] . "<br>"; 
    if($bool['0'] === "t"){ 
      echo "Login Successful"; 

    }else{ 
      $errors = $errors . "Passwords do not match. Please try again. <br>"; 
    } 

看來,布爾是不是現成的,你需要從返回的結果中提取矩陣行,然後訪問零個元素,以獲得T/F。此外,它似乎不是布爾值(即使值爲「t」,=== true也會失敗)。

希望這可以幫助別人!

+0

有一個爲現場實例製作的擴展:https://www.postgresql.org/docs/9.5/static/pgcrypto.html – greg