2016-12-13 171 views
-2

在這裏我有一些php代碼,它允許我更新我的學生表中的用戶信息。密碼驗證php表格

我想弄清楚如何才能夠檢查當前登錄的用戶的密碼是否與允許信息更新之前存儲在數據庫中的密碼相匹配。

+6

**切勿存儲純文本密碼!**請使用PHP的[內置函數](http://jayblanchard.net/proper_password_hashing_with_PHP.html)來處理密碼安全性。如果您使用的PHP版本低於5.5,則可以使用'password_hash()'[兼容包](https://github.com/ircmaxell/password_compat)。確保你*** [不要越獄密碼](http://stackoverflow.com/q/36628418/1011527)***或在哈希之前使用其他任何清理機制。這樣做會改變密碼並導致不必要的附加編碼。 –

+2

[Little Bobby](http://bobby-tables.com/)說*** [你的腳本有SQL注入攻擊的風險。](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)***瞭解[編寫]​​(http://en.wikipedia.org/wiki/Prepared_statement)語句[MySQLi](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)。即使[轉義字符串](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)是不安全的! [不相信嗎?](http://stackoverflow.com/q/38297105/1011527) –

回答

0

正如其他人所說,你的腳本有一堆漏洞。

我假設你只是在爲當地開發。

如果你在這個階段主持它,你肯定會遇到安全問題。

好的,回到你的問題。

有幾種方法可以在提交更新之前驗證用戶。

例如:

  1. 認沽SQL狀態更新變化

    if(isset($_POST['Update'])){ 
        $UpdateFName = $_POST['FirstName']; 
        $UpdateLName = $_POST['LastName'];   
        $UpdateEmail = $_POST['Email']; 
        $UpdateFPassword = $_POST['Password']; 
    
        $SQL = $conn->query("UPDATE students 
        SET FName='{$UpdateFName}',LName='{$UpdateLName}',Email='{$UpdateEmail}',Password='{$UpdateFPassword}' 
        WHERE UserID = $User and Password = '$_SESSION["PW"]' "); 
    
    header('Location:updateinfo.php'); 
    

    }

時,如果您使用此方法,如果當前的密碼與密碼不同那存儲在數據庫中,那些編輯SQL將不會運行,因爲條件無效

  1. 首先驗證用戶。

    if(isset($_POST['Update'])){ 
        $UpdateFName = $_POST['FirstName']; 
        $UpdateLName = $_POST['LastName'];   
        $UpdateEmail = $_POST['Email']; 
        $UpdateFPassword = $_POST['Password']; 
    
        $sqlValidate = $conn->query("SELECT * FROM students WHERE UserID ='$User' and Password='$_SESSION["PW"]' "); 
        $getUser = $sqlValidate -> fetch_array(MYSQLI_BOTH); 
    
        if($getUser['UserID'] != ''){ 
         $SQL = $conn->query("UPDATE students SET FName='{$UpdateFName}', LName='{$UpdateLName}', Email='{$UpdateEmail}', Password ='{$UpdateFPassword}' WHERE UserID = $User "); 
        }// end if 
    
    header('Location:updateinfo.php'); 
    

    }

你可以爲密碼加密閱讀http://php.net/manual/en/function.crypt.php

+0

是的,這只是爲了演示的目的,而不是現場主持。感謝您的代碼,但我得到這些錯誤:我得到這些錯誤: 意外的''',期待標識符(T_STRING)或變量(T_VARIABLE)或數字(T_NUM_STRING) 修復此錯誤後,我得到此解析錯誤,語法錯誤,意外的'$ _SESSION'(T_VARIABLE),我不確定我錯過了什麼。 –

+0

這意味着季節變量缺失,請確保您聲明會話變量爲密碼以上 – Windy

0

您的表單基本上沒有驗證。此外,還有SQL注入的機會。 在發佈之前驗證您的電子郵件字段。請嘗試:

if(!filter_var($email_variable,FILTER_VALIDATE_EMAIL){ 
//throw some kind of exceptions or kill the process 
} 

我還建議您使用PDO,因爲它支持使用預準備語句。有一個令人驚訝的函數bindParam()可以綁定你的參數。

嘗試:

$DBH = new PDO("mysql:host=localhost;dbname=test", 'root', ''); 
     $DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $STH = $DBH->prepare("SELECT * FROM student_table WHERE studentID= :id"); 
     $id = 1; // here you should keep it as variable and pass it to param 
     $STH->bindParam(':id', $id, PDO::PARAM_STR); 
     $STH->execute(); 

     $STH->setFetchMode(PDO::FETCH_ASSOC); 

此外,不發佈原始密碼,直接到你的數據庫。要麼使用內置的PHP哈希算法,要麼使用某種加密函數來保護它們。