Активация зарегистрированной учетной записи с использованием кода (PHP + JS) - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я работаю над проектом, и мне удалось получить рабочую форму регистрации и логин.После регистрации пользователь получает по электронной почте 5-значный код активации, и его просят вставить его на страницу профиля пользователя, чтобы изменить статус с активного: 0 на активный: 1, и он получает разрешение для остальной части сайта.

По какой-то причине код активации просто не будет работать: /

Следующий код - это код PHP, написанный для активации учетной записи, я использую запросы PDO для подключения к базе данных, но япопытался использовать запрос mysqli, но, похоже, он не работал.

<?php
session_start();

    // Allow the config
        define('__CONFIG__', true);
    // Require the config
    require_once "inc/config.php";  //possibly have to change the location
    include_once "inc/classes/DB.php"; //possibly have to change location
    include_once "inc/classes/Page.php";
    include_once "inc/classes/User.php";

    Page::ForceLogin();
//
//$email = filter_input(INPUT_POST['email'] );
//$username = Filter::String($_POST['username']);
//$skills = Filter::String($_POST['skills']);
//$email = filter_input(INPUT_POST['email'] );
//$username = filter_input(INPUT_POST['username'] );

    $return=[];

$User = new User($_SESSION['user_id']);
$username = $User->username;


////Connection Variables
//$host = 'localhost';
//$user = 'root';
//$password = '';
//$db = 'mdb_';
////Creating mysql connection
//$conn = new mysqli($host,$user,$password,$db);




//$username = $User->username;


$activationCode = User::Find(INPUT_GET['activationCode']);

if(isset($_GET['activationCode'])) {
    if(!empty($_GET['activationCode'])) {
        $query = "SELECT * FROM users WHERE username='.$username.'";
        $result = query($con, $query);
        if(ocirowcount($result) > 0){
            while($row = mysqli_fetch_array($result)){
                if($_GET['activationCode'] == $row["activationCode"]){
                    $con->query ("UPDATE users SET active=1 AND credit=100 WHERE username = '.$username.'");
                    $return['error'] = 'Your account is now activated! You have earned 100 Time-banking credits.';
                    //header("Refresh:0");
                }
                else{
                    $return['error'] = 'Code incorrect, please try again';
                }
            }
        }
        echo json_encode($return, JSON_PRETTY_PRINT);
    }
}

//$activationCode = filter_input(INPUT_GET, "activationCode" );
//if(isset($_GET['activationCode'])) {
//    if(!empty($_GET['activationCode'])) {
//        $query = "SELECT * FROM users WHERE username='$username'";
//        $result = mysqli_query($conn, $query);
//        if(mysqli_num_rows($result) > 0){
//            while($row = mysqli_fetch_array($result)){
//                if($_GET['activationCode'] == $row["activationCode"]){
//                    $sql = $conn->query ("UPDATE users SET active=1 AND credit=100 WHERE username = '$username'");
//                    $return['error'] = 'Your account is now activated! You have earned 100 Time-banking credits.';
//                    //header("Refresh:0");
//                }
//                else{
//                    $return['error'] = 'Code incorrect, please try again';
//                }
//            }
//        }
//        echo json_encode($return, JSON_PRETTY_PRINT);
//    }
//}

//$activationCode = filter_input(INPUT_POST, "activationCode" );
//
//  if(isset($_POST['activationCode'])) {
//      $activationCode = Filter::String( $_POST['activationCode'] );
//
//
//
//
//
//      $query = "SELECT * FROM users WHERE username='$username'";
//          $result = mysqli_query($con, $query);
//          if(mysqli_num_rows($result) > 0){
//
//              while($row = mysqli_fetch_array($result)){
//
//                  if($_POST['activationCode'] == $row["activationCode"]){
//
//
//                      $activateUser = $con->query ("UPDATE `users` SET  `credit` = :100, `active` = :1, WHERE `user_id` = :$user_id");
//                      //$sql = $con->query ("UPDATE users SET active=1, credit=100 WHERE username = '$username'");
//
//                      $return['error'] = 'Your account is now activated! You have earned 100 Time-banking credits.';
//
//                      header("Refresh:0");
//                  }
//                  else{
//                      $return['error'] = 'Code incorrect, please try again';
//                  }
//
//              }
//          }
//
//      echo json_encode($return, JSON_PRETTY_PRINT);
//
////      }
//  }



?>

Код ниже - это класс db, который создает $ con в PDO

class DB {

    protected static $con;

    private function __construct(){
        try {

            self::$con = new PDO( 'mysql:charset=latin1;host=host;port=****;dbname=mdb_', 'root', 'pass'); //change connection string
            self::$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            self::$con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
            self::$con->setAttribute( PDO::ATTR_PERSISTENT, false );
            self::$con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

        } catch (PDOException $e) {
            echo "Could not connect todatabase."; exit;
        }
    }


    public static function getConnection() {
        //If this instance has not been started, start it.
        if (!self::$con) {
            new DB();
        }
        //Return the writeable db connection
        return self::$con;
    }

1 Ответ

0 голосов
/ 07 декабря 2018

Здесь есть несколько проблем, от смешивания API базы данных до возможного внедрения SQL, проблем конкатенации строк и неправильного синтаксиса SQL в вашем запросе UPDATE.

Если вы используете PDO для подключения к базе данных, вам необходимоудалите все ссылки на функции oci* (для баз данных Oracle) и mysqli* (это другой API и не совместим с PDO) и используйте эквиваленты PDO.

Я также удалю $username из запросов и используйте вместо этого подготовленные заявления.$username может быть из вашей собственной базы данных, но я не вижу, как она туда попала.Если у вас нет ограничения на количество символов, которое может содержать имя пользователя, и имя пользователя правильно экранируется при вставке в вашу базу данных, тогда оно может содержать одинарные (или двойные) кавычки, которые все еще могут вызвать проблемы в этом коде.Итог: если это был изначально пользовательский ввод, ему никогда не следует доверять.

// I missed this in the code in your question
$con = DB::getConnection();

if (isset($_GET['activationCode'])) {
    if(!empty($_GET['activationCode'])) {
        // Note the placeholder ":username" -- PDO will fill that with
        // $username for you (see $stmt->execute() below) and take care
        // of adding quotes around it
        $query = "SELECT * FROM users WHERE username = :username";

        try {
            $stmt = $con->prepare($query);
            $stmt->execute(array(':username' => $username));

            if ($stmt->rowCount() > 0) {
                foreach ($stmt as $row) {
                    if ($_GET['activationCode'] == $row["activationCode"]) {
                        // note the syntax: "SET active=1, credit=100"
                        $update = $con->prepare("UPDATE users SET active=1, credit=100 WHERE username = :username");
                        $update->execute(array(':username' => $username));

                        $return['error'] = 'Your account is now activated! You have earned 100 Time-banking credits.';
                        //header("Refresh:0");
                    } else {
                        $return['error'] = 'Code incorrect, please try again';
                    }
                }
            }
        } catch (PDOException $error) {
            $return['error'] = (string)$error;
        }

        echo json_encode($return, JSON_PRETTY_PRINT);
    }
}

Обратите внимание, что это можно несколько оптимизировать, просто попытавшись выполнить запрос UPDATE.Для удобства я также предполагаю, что вы хотите, чтобы код активации можно было использовать только на неактивных учетных записях, которые вы в настоящее время не проверяете:

$con = DB::getConnection();

if (isset($_GET['activationCode']) && !empty($_GET['activationCode'])) {
    $query = "UPDATE users SET active = 1, credit = 100 WHERE username = :username AND activationCode = :code AND active = 0";

    try {
        $stmt = $con->prepare($query);
        $stmt->execute(array(
            ':username' => $username,
            ':code' => $_GET['activationCode']
        ));

        if ($stmt->rowCount() > 0) {
            $return['error'] = 'Your account is now activated! You have earned 100 Time-banking credits.';
        } else {
            $return['error'] = 'Code incorrect or account is already active, please try again';
        }
    } catch (PDOException $error) {
        $return['error'] = (string)$error;
    }

    echo json_encode($return, JSON_PRETTY_PRINT);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...