2016-12-13 13 views
-2

ここに私の学生テーブルのユーザー情報を更新できるPHPコードがあります。パスワード確認PHPフォーム

現在ログインしているユーザーのパスワードが、情報の更新を許可する前にデータベースに保存されているパスワードと一致するかどうかを確認する方法を見つけようとしています。

+6

**プレーンテキストのパスワードを保存しないでください!**パスワードのセキュリティを処理するには、PHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)を使用してください。 5.5より小さいPHPバージョンを使用している場合、 '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)文(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

他の人が言うように、あなたのスクリプトにはたくさんの穴があります。

あなたはローカルエリア向けに開発していると仮定します。

この段階でホストすると、セキュリティ上の問題が発生します。

申し訳ございませんが、ご質問ください。

コミットの更新前にユーザーを検証する方法はいくつかあります。例えば

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. dbに格納されているものは、条件が無効なので編集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ハッシュアルゴリズムを使用するか、暗号化機能を使用してそれらを保護してください。

関連する問題