2017-05-10 44 views
-2

當試圖獲得密碼,以確認它是正確的,我得到錯誤:檢查密碼是否正確無法正常工作。 SQL語句錯誤

[10-May-2017 01:52:44 UTC] PHP Warning: password_verify() expects parameter 2 to be string, object given in /home/affattraction/login.affattraction.com/admin/login_process.php on line 22

代碼是:

<?php 
/* 
* 
* Copyright 2017 by Jarrod Estepp 
* This script is private software and is illegal to 
* use without consent from Jarrod Estepp - [email protected] 
* 
* login_process.php 
*/ 
session_start(); 
include('../includes/settings.php'); 
include('../includes/mysql.php'); 

    //Grab Login Details 
    $email = $_POST['email']; 
    $password = $_POST['password']; 

    //Grab Stored Password 
$password = $password; 
$password_stored = $conn->query("SELECT password FROM admins WHERE email = '$email'"); 

if(password_verify($password, $password_stored)) { 
    echo "Correct"; 
} else { 
    echo "Your not logged"; 
} 

?> 

爲什麼會出現這種錯誤。我無法找到任何解決辦法!

+0

** WARNING **:這有一些嚴重的[SQL注入錯誤](http://bobby-tables.com/),因爲'$ _GET'數據在查詢內使用。儘可能使用**準備好的陳述**。這些在['mysqli'](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和[PDO](http://php.net/manual/)中很簡單en/pdo.prepared-statements.php)其中任何用戶提供的數據都是用'?'或':name'指示符指定的,後者使用'bind_param'或'execute'填充,具體取決於您使用的是哪一個。 **絕不**將'$ _POST','$ _GET'或任何用戶數據直接放入您的查詢中。 – tadman

+0

**警告**:編寫您自己的訪問控制層並不容易,並且有很多機會使其嚴重錯誤。這有很多危險的[SQL注入漏洞](http://bobby-tables.com/),因爲你沒有[妥善轉義值](http://bobby-tables.com/php)。此代碼允許*任何人*從您的網站獲得*任何*。 **不要**寫你自己的認證系統。任何[開發框架](http://codegeekz.com/best-php-frameworks-for-developers/)像[Laravel](http://laravel.com/)都帶有一個[認證系統](https:/ /laravel.com/docs/5.4/authentication)內置。 – tadman

+0

版權警告和免責聲明有點多,特別是對於Stack Overflow問題。 – tadman

回答

0
$password_stored = $conn->query("SELECT password FROM admins WHERE email = '$email'"); 

我認爲沒有返回數據爲$ password_stored,再次檢查你的類並找到類似的方法,密碼 - >行()或類似的東西提取數據,例如

$password_stored = $conn->query("SELECT password FROM admins WHERE email = '$email'")->row();
echo $password_stored->password;

+0

好吧,我想我知道你現在在那裏得到什麼! –

+0

這一個固定我的整個情況 –

0

query()操作的結果不是字符串。這是一個結果。您需要調用適當的fetch方法。哪種方法取決於您是否使用PDO或mysqli,您的問題在這方面不明確。

+0

我正在使用mysqli –

+0

感謝您的回答。任何幫助我如何設置獲取字符串? –

+0

一如既往,[文檔](http://php.net/manual/en/class.mysqli-result.php)是你開始的地方。像'fetch_array'可能是一個不錯的選擇。 – tadman

1

爲什麼你必須重新分配$password變量?

$password = $password; /** JUST REMOVE THIS **/ 

您違反準備好聲明的目的。而且你不用密碼驗證查詢。您應該使用查詢結果來驗證它。

$stmt = $conn->query("SELECT password FROM admins WHERE email = ?"); 
$stmt->bind_param("s", $email); 
$stmt->execute(); 
$stmt->bind_result($password_stored); 
$stmt->fetch(); 
$stmt->close(); 

if(password_verify($password, $password_stored)) { 
    echo "Correct"; 
} else { 
    echo "Your not logged"; 
} 

確保您存儲使用password_hash

+0

非常感謝您爲添加準備好的聲明。現在我可以看看這些設置是如何學習它們的!我很欣賞這個答案! –