2016-09-10 62 views
-1

嘗試運行查詢以在數據庫中查找具有匹配密碼的記錄。它說,目前還沒有。 以下是密碼:如何在SQL中使用特殊字符的PHP變量?

密碼是「!7G7xMN & G3」。 其他憑證沒有問題。

<?php 
    //error_reporting(0); 
    require("session.php"); 
    require("funcx.php"); 
    header('Access-Control-Allow-Origin: *'); 
    if($_SERVER['REQUEST_METHOD'] == "POST") 
    { 
     require("dbconnect.php"); 
     $inv = inxanity($db_conn, $_POST['inv']); 
     $acc = inxanity($db_conn, $_POST['acc']); 
     $pass = inxanity($db_conn, $_POST['pass']); 

     $query = "SELECT username FROM login WHERE institution_id = '$inv' AND username = $acc AND password = '$pass'"; 
     $result = mysqli_query($db_conn, $query) or die(mysqli_error($db_conn)); 

     if(mysqli_num_rows($result) > 0) 
     { 
      $row = mysqli_fetch_assoc($result); 
      $_SESSION['id'] = $row['username']; 
      echo "1"; 
     } 
     else 
      echo "0"; 
    } 
?> 

下面是 「funcx.php」:

<?php 
    function xanity($data) 
    { 
     $temp = htmlspecialchars($data); 
     $temp = trim($data); 
    } 

    function inxanity($connection, $data) 
    { 
     $temp = htmlspecialchars($data); 
     $temp = trim($temp); 
     $temp = mysqli_real_escape_string($connection, $temp); 
     return $temp; 
    } 
?> 
+1

每個人都應該保存的密碼加密。 –

+0

密碼應該被鹽漬和散列。使用[內建PHP函數](http://php.net/manual/en/ref.password.php)。 –

回答

-1

您需要連接字符串與該變量的值。嘗試這個。

$query = "SELECT username FROM login WHERE institution_id = '".$inv."' AND username = '".$acc."' AND password = '".$pass."'"; 
+0

沒有工作。其他使用字母數字字符密碼的登錄工作得很好。 –

+0

''..''變量可以工作。 –

+0

您的密碼是「!7G7xMN&G3」或只有!7G7xMN&G3? – Jitendra

0

在表中假設usernamevarchar。所以你需要在變量上加單引號。

這樣,

$query = "SELECT username FROM login WHERE institution_id = '$inv' AND username = '$acc' AND password = '$pass'"; 

確保你打開SQL注入攻擊,所以使用準備好的語句來代替。

+0

用戶名不是VARCHAR。 mysqli_real_escape_string()不處理注入漏洞嗎? –

0

起初你必須改變這樣的查詢,因爲你錯過了PHP變量的引號。

替換:

$query = "SELECT username FROM login WHERE institution_id = '$inv' AND username = $acc AND password = '$pass'"; 

$query = "SELECT username FROM login WHERE institution_id = '".$inv."' AND username = '".$acc."' AND password = '".$pass."'"; 
+0

不相關???? –

0

你應該存儲密碼在你的數據庫中純文本。

您需要salt and hash your passwords然後將它們存儲到數據庫中。

在用戶註冊,你應該做的:

$salted_and_hashed_pass = password_hash($_POST["pass"]); 

,然後保存$salted_and_hashed_pass到你的數據庫裏面提出的password

登錄後,您可以檢索與機構標識和用戶名匹配的用戶。然後,將數據庫中的散列與使用POST請求發送的明文密碼進行比較。

if (password_verify($_POST['pass'], $row['password'])) 

您還應該使用prepared statements防止SQL注入,並獲得與逃避你的價值觀消除這個問題。
您應該記住避免將客戶端提供的值放入SQL查詢字符串中,並且應該只綁定它們。

您的代碼應該是這樣的:

require("session.php"); 
header('Access-Control-Allow-Origin: *'); 
if($_SERVER['REQUEST_METHOD'] == "POST") 
{ 
    require("dbconnect.php"); 

    $query = " 
     SELECT 
      username, 
      password 
     FROM login 
     WHERE 
      institution_id = ? AND 
      username = ? 
    "; 
    $stmt = $db_conn->prepare($query); 
    if (!stmt) 
     die($db_conn->error); 

    if (!$stmt->bind_param("i", $_POST['inv'])) // bind to the first ? as integer 
     die($stmt->error); 
    if (!$stmt->bind_param("s", $_POST['acc'])) // bind to the second ? as string 
     die($stmt->error); 

    if (!$stmt->execute()) 
     die($db_conn->error); 

    $res = $stmt->get_result(); 
    if (!res) 
     die($stmt->error); 

    $row = $res->fetch_assoc(); 

    // if the row exists and the sent plain text password matches the salted and hased password from the DB 
    if ($row !== null && password_verify($_POST['pass'], $row['password'])) { 
     $_SESSION['id'] = $row['username']; 
     echo "1"; 
    } 
    else 
     echo "0"; 
}