2016-12-13 2 views
-2

여기 내 학생 테이블에서 사용자 정보를 업데이트 할 수있는 PHP 코드가 있습니다.비밀번호 확인 PHP 양식

정보를 업데이트하기 전에 현재 로그인 한 사용자의 암호가 데이터베이스에 저장된 암호와 일치하는지 확인하는 방법을 알아 내려고합니다.

+6

** 일반 텍스트 암호를 저장하지 마십시오! ** PHP의 [내장 함수] (http://jayblanchard.net/proper_password_hashing_with_PHP.html)를 사용하여 암호 보안을 처리하십시오. 5.5보다 작은 PHP 버전을 사용하고 있다면'password_hash()'[compatibility pack] (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

다른 사람들이 말한 것처럼 스크립트에는 많은 구멍이 있습니다.

로컬 영역 전용으로 개발 중이라고 가정합니다.

이 단계에서 호스트한다면 확실하게 보안 문제가 발생할 것입니다.

다시 질문에 답하십시오.

업데이트를 커밋하기 전에 사용자를 확인하는 방법에는 여러 가지가 있습니다. 예를 들어

:

  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'); 
    

    }

를 업데이트 그 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); 

가 직접 데이터베이스에 원시 암호를 게시하지 않습니다. 어느 쪽이든 inbuilt PHP 해시 알고리즘을 사용하거나 그들을 보호하기 위해 암호화 기능의 일종을 사용합니다.