여기 내 학생 테이블에서 사용자 정보를 업데이트 할 수있는 PHP 코드가 있습니다.비밀번호 확인 PHP 양식
정보를 업데이트하기 전에 현재 로그인 한 사용자의 암호가 데이터베이스에 저장된 암호와 일치하는지 확인하는 방법을 알아 내려고합니다.
여기 내 학생 테이블에서 사용자 정보를 업데이트 할 수있는 PHP 코드가 있습니다.비밀번호 확인 PHP 양식
정보를 업데이트하기 전에 현재 로그인 한 사용자의 암호가 데이터베이스에 저장된 암호와 일치하는지 확인하는 방법을 알아 내려고합니다.
다른 사람들이 말한 것처럼 스크립트에는 많은 구멍이 있습니다.
로컬 영역 전용으로 개발 중이라고 가정합니다.
이 단계에서 호스트한다면 확실하게 보안 문제가 발생할 것입니다.
다시 질문에 답하십시오.
업데이트를 커밋하기 전에 사용자를 확인하는 방법에는 여러 가지가 있습니다. 예를 들어
:
넣어 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은 실행되지 않습니다, 조건이 유효하지 않기 때문에
사용자를 먼저 확인하십시오.
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를 읽을 수 있습니다.
예 이것은 데모 용이며 실시간으로 호스팅되지 않습니다. 하지만 고맙습니다. 다음 코드를 사용해 주셔서 감사합니다. 예기치 않은 '' ', 식별자 (T_STRING) 또는 변수 (T_VARIABLE) 또는 숫자 (T_NUM_STRING)가 필요합니다. 이 오류를 수정 한 후 구문 분석 오류가 발생합니다. 구문 오류, 예기치 않은 '$ _SESSION'(T_VARIABLE) 그리고 내가 무엇을 놓쳤는 지 확신 할 수 없습니다. –
시즌 변수가 누락되었음을 의미합니다. 위의 비밀번호에 대해 세션을 가변적으로 선언해야합니다. – Windy
양식에는 기본적으로 유효성이 없습니다. 또한 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 해시 알고리즘을 사용하거나 그들을 보호하기 위해 암호화 기능의 일종을 사용합니다.
** 일반 텍스트 암호를 저장하지 마십시오! ** 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) *** 또는 해싱을하기 전에 다른 클렌징 메커니즘을 사용하십시오. 이렇게하면 암호가 변경되어 불필요한 추가 코딩이 발생합니다. –
[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) –