Logowanie na istniejące konto

0

Witam, mam taki problem, że jak loguje się na stronę, nawet niestniejacym kontem, to zamiast wyskoczyć, że taki użytkownik nie istnieje, to loguje się na jedno istniejące konto. Czy coś w tym kodzie jest źle?
login.php

<?php
include 'core/init.php';
include 'includes/overall/header.php';
logged_in_redirect();

if(empty($_POST) == false) {
	$username = $_POST['username'];
	$password = $_POST['password'];
	
	if(empty($username) || empty($password)) {
		$errors[] = 'You need to fill up the username and password!';
	} else if(user_exists($username) == false) {
		$errors[] = 'This user doesn\'t exists';
	} else if(user_active($username) == false) {
		$errors[] = 'You have\'t activated your account!';
	} else {
		$login = login($username, $password);
		if($login == false) {
			$errors[] = 'Username and password combination is incorrect';
		} else {
			$_SESSION['user_id'] = $login;
			header('Location: index.php');
			exit();
		}
	}
	if(empty($errors) == false) {
		echo '<h2>Login failed...</h2>';
		echo output_errors($errors);
	}
} else {
?>
<h2>Login</h2>
<form action="" method="post">
	<input class="span4" type="text" name="username"  placeholder="Username" tabindex="1" /><br />
	<input class="span4" type="password" name="password" placeholder="Password" tabindex="2" /><br /><br />
	
	<input class="btn btn-primary span4" type="submit" name="submit" value="Login" tabindex="3" />
</form>
<?php
}
include 'includes/overall/footer.php';
?>

Jak się rejestruję, to i tak jest to jedno istniejące konto.
register.php

<?php 
include 'core/init.php';
logged_in_redirect();

if($settings['register'] == false && logged_in() == false){
	protect_page();
}
include 'includes/overall/header.php'; 
	
if(empty($_POST) == false) {
	$fields = array('username', 'password', 'password_again', 'email', 'name', 'captchavar');
	foreach($_POST as $key=>$value) {
		if(empty($value) && in_array($key, $fields) == true){
			$errors[] = 'All fields are required';
			break 1;
		}
	}
	
//captcha
include_once "core/functions/securimage.php";
$securimage = new Securimage();
$valid = $securimage->check($_POST['captchavar']);
//-------

	$_POST['name']     = htmlspecialchars($_POST['name'], ENT_QUOTES);
	$_POST['email']    = htmlspecialchars($_POST['email'], ENT_QUOTES);
	$_POST['username'] = htmlspecialchars($_POST['username'], ENT_QUOTES);
	
	if(empty($errors) == true) {
		if($valid == false) {
			$errors[] = 'Please enter the correct captcha code!';
		}
		//Just for fun ^_^
			if($_POST['username'] == "ChuckNorris"){
				$errors[] = "You tried to be Chuck Norris, now you will die !";
			}
		//END OF FUN!
		if(user_exists($_POST['username']) == true) {
			$errors[] = 'Sorry, the username \'' . $_POST['username'] . '\' is already taken.';
		}
		if(preg_match("/\\s/", $_POST['username']) == true) {
			$errors[] = 'Your username must not contain any spaces';
		}
		if(strlen($_POST['password']) < 6) {
			$errors[] = 'Password too short, it must be at least 6 characters!';
		}
		
		if($_POST['password'] !== $_POST['password_again']) {
			$errors[] = 'Your passwords need to match!';
		}
		
		if(filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) == false) {
			$errors[] = 'A valid email adress is required';
		}
		if(email_exists($_POST['email']) == true) {
			$errors[] = 'Sorry, the email \'' . $_POST['email'] . '\' is already in use';
		}
	}
}
?>
<h2>Register</h2>
<?php
if(isset($_GET['success']) && empty($_GET['success'])) {
	echo '<div class="alert alert-success">
			<button type="button" class="close" data-dismiss="alert">&times;</button>
			<strong>Congratulations!</strong> You\'ve been registered successfully!';
	if($settings['email_confirmation'] == '1') echo 'Please check your email account for activation!';
	echo '</div>';
} else {
	if(empty($_POST) == false && empty($errors) == true){
		if($settings['email_confirmation'] == '1') $active = '0'; else $active = '1';
		$register_data = array(
			'username'     => $_POST['username'],
			'password'     => $_POST['password'],
			'email'        => $_POST['email'],
			'name'         => $_POST['name'],
			'ip'           => $_SERVER['REMOTE_ADDR'],
			'date'         => date('Y.m.d'),
			'email_code'   => md5($_POST['username'] + microtime()),
			'active'	   => $active
		);
		register_user($register_data);
		header('Location: register.php?success');
		exit();
	} elseif(empty($errors) == false) {
		echo output_errors($errors);
	}

?>
<form action="" method="post">
	<label>Username</label>
	<input class="span3" type="text" name="username" />
	
	<label>Password</label>
	<input class="span3" type="password" name="password" />

	<label>Password Again</label>
	<input class="span3" type="password" name="password_again" /> 

	<label>Email</label>
	<input class="span3" type="text" name="email" />

	<label>Nickname</label>
	<input class="span3" type="text" name="name" /><br />
	
	<img class="img-polaroid" id="captcha" title="Captcha" src="core/functions/securimage_show.php" alt="CAPTCHA Image" />&nbsp;
	<input class="span2" type="text" style="text-transform:uppercase;" name="captchavar" id="captchavar" size="11" maxlength="4" placeholder="captcha" />
	<br /><br />
	<input class="btn btn-primary span3" type="submit" value="Register" />

</form>		
<?php
}
include 'includes/overall/footer.php'; 
?>

2

wygląda jakby błąd był w funkcji user_exists i/lub login. To jakiś framework? Pokaż kod tych funkcji

0

mam nadzieje, ze to o to chodzi

function send_avatar($file_temp, $file_extension) {
	global $file_path;
	$file_path = 'avatars/' . substr(md5(time()), 0, 10) . '.' . $file_extension;
	move_uploaded_file($file_temp, $file_path);
}
function online_users() {
    global $database;

    $online_users = $database->query("SELECT `user_id` FROM `users` WHERE `last_activity` > unix_timestamp() - 30")->num_rows;//in seconds
	echo $online_users;
}

function update_user($user_id, $update_data) {
    global $database;

    $update = array();
	array_walk($update_data, 'array_sanitize');
	
	foreach($update_data as $field=>$data) {
		$update[] = '`' . $field . '` = \'' . $data .'\'';
	}
		
	$database->query("UPDATE `users` SET " . implode(', ', $update) . " WHERE `user_id` = $user_id ");
}

function is_admin($user_id) {
    global $database;

    $user_id = (INT)$user_id;
	return ($database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `user_id` = {$user_id} AND `type` = 1")->num_rows);
}

function activate($email, $email_code) {
    global $database;

    $email		= $database->escape_string($email);
	$email_code = $database->escape_string($email_code);
	
	if($database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email` = '$email' AND `email_code` = '$email_code' AND `active` = 0")->num_rows) {
		$database->query("UPDATE `users` SET `active` = 1 WHERE `email` = '$email'");

        return true;
	} else {
		return false;
	}
}

function change_password($user_id, $password) {
    global $database;

	$user_id = (int)$user_id;
	$password = md5($password);
	
	$database->query("UPDATE `users` SET `password` = '$password' WHERE `user_id` = $user_id");
}

function register_user($register_data) {
    global $database;
    global $settings;

    array_walk($register_data, 'array_sanitize');
	$register_data['password'] = md5($register_data['password']);
	$active = $register_data['active'];
	$fields = '`' . implode('`, `', array_keys($register_data)) . '`';
	$data = '\'' . implode('\', \'', $register_data) . '\'';
	
	$database->query("INSERT INTO `users` ($fields) VALUES ($data)");
	if($active == '0'){
		sendmail($register_data['email'], 'Activate your account', "
			Hello " . $register_data['name'] . ",\n\n
			To activate your account, access the link below:\n\n
			" . $settings['url'] . "activate.php?email=" . $register_data['email'] . "&email_code=" . $register_data['email_code'] . " \n\n
		");
	}
}
function user_count() {
    global $database;

    return $database->query("SELECT COUNT(`user_id`) AS `count` FROM `users` WHERE `active` = 1")->fetch_object()->count;
}
function disabled_users_count() {
    global $database;

    return $database->query("SELECT COUNT(`user_id`) AS `count` FROM `users` WHERE `active` = 0")->fetch_object()->count;
}

function user_data($user_id) {
    global $database;

    $data = array();
	$user_id = (int)$user_id;
	
	$func_num_args = func_num_args();
	$func_get_args = func_get_args();
	
	if($func_num_args > 0) {
		unset($func_get_args[0]);
		$fields = '`' . implode('`, `', $func_get_args) . '`';
		$data = $database->query("SELECT $fields FROM `users` WHERE `user_id` = '$user_id'")->fetch_assoc();
		
		return $data;
	}
}

function logged_in() {
	return (isset($_SESSION['user_id'])) ? true : false;
}

function email_exists($email) {
    global $database;

    $email = sanitize($email);

    return $database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `email` = '{$email}'")->num_rows;
}

function user_exists($username) {
    global $database;

    $username = sanitize($username);
	return $database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '{$username}'")->num_rows;
}

function user_active($username) {
    global $database;

    $username = sanitize($username);
	return $database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `active` ='1'")->num_rows;
}

function user_id_from_username($username) {
    global $database;

	$username = sanitize($username);
	$query = $database->query("SELECT `user_id` FROM `users` WHERE `username` = '{$username}'");
	return $query->fetch_object()->user_id;
}
function username_from_user_id($user_id) {
    global $database;

    $username = sanitize($user_id);
	return $database->query("SELECT `username` FROM `users` WHERE `user_id` = '{$user_id}'")->fetch_object()->username;
}
function login($username, $password) {
    global $database;

    $user_id = user_id_from_username($username);
	$username = sanitize($username);
	$password = md5($password);
	return $database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'")->num_rows;
}
?>

ob_start();
session_start();
//error_reporting(0);
require 'database/connect.php';
require 'functions/general.php';
require 'functions/users.php';

if(logged_in() == true){
	$session_user_id = $_SESSION['user_id'];
	$user_data = user_data($session_user_id, 'user_id', 'name', 'username', 'password', 'email', 'type', 'avatar');
	if(user_active($user_data['username']) == false){
		session_destroy();
		header('Location: index.php');
		exit();
	}
	
	$database->query("UPDATE `users` SET `last_activity` = unix_timestamp() WHERE `user_id` = '$session_user_id'");
}


$settings = settings_data(1, 'url', 'title', 'disable_index_querying', 'facebook', 'twitter', 'contact_email', 'pagination', 'register', 'server_cache', 'email_confirmation', 'server_confirmation', 'advertise_top', 'advertise_bottom');
require 'functions/titles.php';

/* Generate current GET parameters to prepend to the filters */
$prepend = "";
foreach($_GET as $key => $value) {
	$prepend .= $key . "=" . $value . "&";
}

$errors = array();
?>

4

no jeszcze byś musiała pokazać chyba logged_in_redirect ale widzę już błąd że funkcja "login" zwraca liczbę wierszy zamiast $user_id:

    $user_id = user_id_from_username($username);
	$username = sanitize($username);
	$password = md5($password);
	return $database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'")->num_rows;

natomiast zwróconą wartość przypisujesz do:

$_SESSION['user_id'] = $login;

czyli zawsze user_id będzie równe 1 (gdy user i hasło się zgodzi) lub 0.

Powinno być coś w stylu

	$username = sanitize($username);
	$password = md5($password);
    return $database->query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'")->num_rows == 1 ? user_id_from_username($username) : false;

w dodatku nie wiem jakie teraz standardy obowiązują w php i czy to projekt na zaliczenie czy prawdziwy, ale używanie "md5" do hashowania haseł to prawie jak trzymanie hasła plaintekstem w 2023 roku, tak się nie robi już kilkanaście lat. Przekazywanie parametrów do zapytania też nie jest zrobione w dobry sposób, całość opiera się na poprawnej implementacji sanitize. Skąd jest ten kod? Dobrze by było go odświeżyć

0

Super, dziękuję za pomoc, logowanie działa, a powiedz mi w rejestracji widzisz jakiś błąd? bo jednak sie robię konto, to pisze, że użytkownik istnieje.... ;p

2

aa tak, funkcja "user_exists" jest zepsuta, podobnie "user_active"

wykonujesz zapytanie

SELECT COUNT('user_id') FROM `users` blahblah

a potem zwracasz liczbę wierszy. Zawsze w wyniku jest jeden wiersz bo zawsze to zapytanie zwróci count.
Musisz albo zmienić COUNT(user_id) na po prostu user_id co zwróci ci 1 albo 0 wierszy, albo sprawdzać zawartość kolumny "COUNT" zamiast liczby wierszy:

	return $database->query("SELECT COUNT(`user_id`) AS count FROM `users` WHERE `username` = '{$username}'")->fetch_object()->count;

podobnie w funkcji login, która teraz nadal ma błąd ale przypadkowo działa bo user_id_from_username zwraca wynik który jest falsy.

0

Ten kod był brany z jakiegoś gotowca? Bo tu co funkcja to problem.
Do czego to ma służyć?

0

To jest gotowiec, który pobrałam, ale jak widać błędy ma, niestety jestem ciemna w php, dlatego poprosiłam o pomoc.
Dziękuję wam za pomoc z logowaniem, może rejestrację też jakoś ogarnę :)

2

Dobra, ale to ma być jakiś zaczątek strony opublikowanej w necie? Jaki jest cel. Kod jest bardzo dziurawy. Nie nadaje się na umieszczenie w necie. I mówię to dla Twojego dobra, bo przejmą Ci stronę i będzie problem. Inna sprawa, że tak pisany kod może jeszcze używać jakiegoś PHP 5.X (albo nawet 4.X sądząc po global) które już nie powinno być używane.

0

no właśnie chciałam utworzyć swoją stronę z tym kodem, ale będę musiała zrezygnować i poczytać o tym dokładnie, jak dobrze zabezpieczyć

1

Załóż inny wątek, żeby nie mieszać. Opisz jakie masz wymogi co do strony i może ktoś doradzi jakiś gotowy silnik.
Od biedy nawet na Laravel w 15 minut zrobisz pół statyczną stronę z logowaniem, bazą, rejestracją i wysyłaniem maili.

1 użytkowników online, w tym zalogowanych: 0, gości: 1