Skocz do zawartości

[PHP/MYSQL]Akceptacja rejestracji :(


Necro

Rekomendowane odpowiedzi

Witam.

Wkurzało mnie to że ciągle w moim serwisie rejestrowały się osoby podające nieprawdziwy email.

Postanowiłem zrobić, aktywacje konta poprzez email, wszystko działa elegancko, wartość pola w bazie zmienia się itd. Tylko że osoba która nawet nie aktywowała poprzez email może się zalogować.

Co zrobić aby osoba która nie akceptuje nie będzie mogła się zalogować??

Plik: aktywacja.php

if(isset($_GET["active"]))
{
  mysql_query("UPDATE users SET u_active=1 WHERE u_activation_key='$_GET[active]' ");
  if(mysql_affected_rows()==1)
{
	 echo '<img src="./images/ok.png">   Aktywacja ukończona pomyślnie. Możesz już się zalogować.';
 }
 else
 {
	  echo '<img src="./images/blad.png">   Kod aktywacyjny jest nieprawidłowy.';
  }
}

Plik: kawałek z process.php

  
  /**
* procLogin - Processes the user submitted login form, if errors
* are found, the user is redirected to correct the information,
* if not, the user is effectively logged in to the system.
*/
  function procLogin(){
  global $session, $form;
  /* Login attempt */
  $retval = $session->login($_POST['user'], $_POST['pass'], isset($_POST['remember']));

  /* Login successful */
  if($retval){
	 header("Location: index.html");
  }
  /* Login failed */
  else{
	 $_SESSION['value_array'] = $_POST;
	 $_SESSION['error_array'] = $form->getErrorArray();
	 header("Location: index.html");
  }
  }

Plik: kawałek z session.php

  
function checkLogin(){
  global $database;  //The database connection
  /* Check if user has been remembered */
  if(isset($_COOKIE['cookname']) && isset($_COOKIE['cookid'])){
	 $this->username = $_SESSION['username'] = $_COOKIE['cookname'];
	 $this->userid   = $_SESSION['userid']   = $_COOKIE['cookid'];
  }

  /* Username and userid have been set and not guest */
  if(isset($_SESSION['username']) && isset($_SESSION['userid']) &&
	 $_SESSION['username'] != GUEST_NAME){
	 /* Confirm that username and userid are valid */
	 if($database->confirmUserID($_SESSION['username'], $_SESSION['userid']) != 0){
		/* Variables are incorrect, user not logged in */
		unset($_SESSION['username']);
		unset($_SESSION['userid']);
		return false;
	 }

	 /* User is logged in, set class variables */
	 $this->userinfo  = $database->getUserInfo($_SESSION['username']);
	 $this->username  = $this->userinfo['username'];
	 $this->userid	= $this->userinfo['userid'];
	 $this->userlevel = $this->userinfo['userlevel'];
	 return true;
  }
  /* User not logged in */
  else{
	 return false;
  }
  }

  /**
* login - The user has submitted his username and password
* through the login form, this function checks the authenticity
* of that information in the database and creates the session.
* Effectively logging in the user if all goes well.
*/
  function login($subuser, $subpass, $subremember){
  global $database, $form;  //The database and form object

  /* Username error checking */
  $field = "user";  //Use field name for username
  if(!$subuser || strlen($subuser = trim($subuser)) == 0){
	 $form->setError($field, "* Podaj użytkownika");
  }
  else{
	 /* Check if username is not alphanumeric */
	 if(!eregi("^([0-9a-z])*$", $subuser)){
		$form->setError($field, "* Username not alphanumeric");
	 }
  }

  /* Password error checking */
  $field = "pass";  //Use field name for password
  if(!$subpass){
	 $form->setError($field, "* Podaj hasło");
  }

  /* Return if form errors exist */
  if($form->num_errors > 0){
	 return false;
  }

  /* Checks that username is in database and password is correct */
  $subuser = stripslashes($subuser);
  $result = $database->confirmUserPass($subuser, md5($subpass));

  /* Check error codes */
  if($result == 1){
	 $field = "user";
	 $form->setError($field, "* Brak użytkownika");
  }
  else if($result == 2){
	 $field = "pass";
	 $form->setError($field, "* Błędne hasło");
  }

  /* Return if form errors exist */
  if($form->num_errors > 0){
	 return false;
  }


  /* Username and password correct, register session variables */
  $this->userinfo  = $database->getUserInfo($subuser);
  $this->username  = $_SESSION['username'] = $this->userinfo['username'];
  $this->userid	= $_SESSION['userid']   = $this->generateRandID();
  $this->userlevel = $this->userinfo['userlevel'];

  /* Insert userid into database and update active users table */
  $database->updateUserField($this->username, "userid", $this->userid);
  $database->addActiveUser($this->username, $this->time);
  $database->removeActiveGuest($_SERVER['REMOTE_ADDR']);

  /**
   * This is the cool part: the user has requested that we remember that
   * he's logged in, so we set two cookies. One to hold his username,
   * and one to hold his random value userid. It expires by the time
   * specified in constants.php. Now, next time he comes to our site, we will
   * log him in automatically, but only if he didn't log out before he left.
   */
  if($subremember){
	 setcookie("cookname", $this->username, time()+COOKIE_EXPIRE, COOKIE_PATH);
	 setcookie("cookid",   $this->userid,   time()+COOKIE_EXPIRE, COOKIE_PATH);
  }

  /* Login completed successfully */
  return true;
  }

Proszę o pomoc.

Pozdrawiam

Odnośnik do komentarza
Udostępnij na innych stronach

Znalazłem to chyba będzie to:

function confirmUserPass($username, $password){
  /* Add slashes if necessary (for query) */
  if(!get_magic_quotes_gpc()) {
	  $username = addslashes($username);
  }

  /* Verify that user is in database */
  $q = "SELECT password FROM ".TBL_USERS." WHERE username = '$username'";
  $result = mysql_query($q, $this->connection);
  if(!$result || (mysql_numrows($result) < 1)){
	 return 1; //Indicates username failure
  }

  /* Retrieve password from result, strip slashes */
  $dbarray = mysql_fetch_array($result);
  $dbarray['password'] = stripslashes($dbarray['password']);
  $password = stripslashes($password);

  /* Validate that password is correct */
  if($password == $dbarray['password']){
	 return 0; //Success! Username and password confirmed
  }
  else{
	 return 2; //Indicates password failure
  }
  }

Odnośnik do komentarza
Udostępnij na innych stronach

Zamień 8 linijkę na

$q = "SELECT password FROM ".TBL_USERS." WHERE u_active = '1' AND username = '$username'";

będzie zwracał błąd o braku takiego usera. Jeżeli chcesz lepiej obsługiwać błąd to :

function confirmUserPass($username, $password){
  /* Add slashes if necessary (for query) */
  if(!get_magic_quotes_gpc()) {
	  $username = addslashes($username);
  }

  /* Verify that user is in database */
  $q = "SELECT password,u_active FROM ".TBL_USERS." WHERE username = '$username'";
  $result = mysql_query($q, $this->connection);
  if(!$result || (mysql_numrows($result) < 1)){
	 return 1; //Indicates username failure
  }

  /* Retrieve password from result, strip slashes */
  $dbarray = mysql_fetch_array($result);
  $dbarray['password'] = stripslashes($dbarray['password']);
  $password = stripslashes($password);

  /* Validate that password AND ACTIVE CODE is correct */
  if($dbarray['u_active'] != 1) return 3;
  if($password == $dbarray['password']){
	 return 0; //Success! Username and password confirmed
  }
  else{
	 return 2; //Indicates password failure
  }
  }

i potem w cyt. 'Plik: kawałek z session.php' zmień :

 /* Check error codes */
  if($result == 1){
	 $field = "user";
	 $form->setError($field, "* Brak użytkownika");
  }
  else if($result == 2){
	 $field = "pass";
	 $form->setError($field, "* Błędne hasło");
  }

na

 /* Check error codes */
  if($result == 1){
	 $field = "user";
	 $form->setError($field, "* Brak użytkownika");
  }
  else if($result == 2){
	 $field = "pass";
	 $form->setError($field, "* Błędne hasło");
  } else if($result == 3){
	 $field = "active";
	 $form->setError($field, "* Konto nie aktywowane");
  }

Spróboj, pewnie będzie trzema jeszcze funkcje setError zmienić ale warto spróbować, jak będzie coś nie tak to pisz i odrazu wrzuć ten kodzik (serError).

logo-stat4seo-blue-small.png

Odnośnik do komentarza
Udostępnij na innych stronach

Już wszystko jest ok, tylko żeby nie zakładać nowego tematu to chciał bym się zapytać.

Użytkownik dostał pustego maila (onet) aktywacyjnego, co jest tutaj źle:??

function addNewUser($username, $password, $email){
  $time = time();
  /* If admin sign up, give admin user level */
  if(strcasecmp($username, ADMIN_NAME) == 0){
	 $ulevel = ADMIN_LEVEL;
  }else{
	 $ulevel = USER_LEVEL;
  }

$actCode=str_shuffle("Ah1nBhdsIyJNSmnJhsnbJyNBSY");


$content='
<html><head><title>Aktywacja Konta</title</head>
<body style="font-family: tahoma, verdana, trebuchet ms; font-size: 12px; color: #696969;">
Aby aktywować swoje konto, kliknij w link poniżej:<br>
<a href="https://www.adres.pl/index.php?p=aktywacja&active='.$actCode.'"> https://www.adres.pl/index.php?p=aktywacja&active='.$actCode.' </a><br /><br /><br />
Administracja <b>Adres.pl</b></body></html>';
$temat = 'Link Aktywacyjny';
$headers = "From: Adres.pl <robot@adres.pl>";
$headers .= "\nContent-type: text/html; charset=iso-8859-2\n" ."Content-Transfer-Encoding: 8bit\n";

mail($email,$temat,$content,$headers);

$q = "INSERT INTO users VALUES('$username', '$password', '', $ulevel, '$email', $time, '$actCode', '0')";
return mysql_query($q, $this->connection);	

}

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności