2016-12-13 2 views
-2

Здесь у меня есть код php, который позволяет мне обновлять информацию о пользователе в таблице моих учеников.Проверка пароля php form

Я пытаюсь выяснить, как я могу проверить, может ли пароль для пользователя, который в настоящий момент вошел в систему, совпадать с паролем, хранящимся в базе данных, до того, как можно будет обновить информацию.

+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

[Маленький Бобби] ​​(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. Put 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, поскольку он поддерживает использование подготовленных операторов. Существует удивительная функция, которая может связыватьParam(), которая связывает ваши параметры.

TRY:

$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, либо используйте некоторую функцию шифрования для их защиты.