Forum Webmasterskie: Logowanie i rejestracja - Forum Webmasterskie

Skocz do zawartości

Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

Logowanie i rejestracja [PHP][SQL]

#1 Użytkownik nie jest zalogowany   Kamil995 Ikona

  • Amator
  • PipPip
  • Grupa Members
  • Postów 10
  • Rejestracja 11-sierpień 09
  • LocationDębno

Napisano 12 sierpień 2009 - 09:24

Witam, dziś pokaże wam jak zrobić prosty skrypt logowania i rejestracji na podstawie funkcji.
Zaczynamy od utworzenia odpowiedniej tabeli
 CREATE TABLE `portalsi_site`.`users` (
`id` TINYINT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 32 ) NOT NULL ,
`pass` TEXT NOT NULL ,
`mail` VARCHAR( 54 ) NOT NULL ,
`gg` VARCHAR( 20 ) NOT NULL ,
PRIMARY KEY ( `id` ) 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci 


Skoro mamy już tabelę możemy zacząć pisać kod. Na początku musimy stworzyć plik konfiguracyjny, który połączy nas z bazą
<?
 $connection = @mysql_connect('host', 'uzytkownik', 'haslo') 
or die('Nie można połączyć z bazą danych.<br />Błąd: '.mysql_error()); 
$db = @mysql_select_db('nazwa_bazy', $connection) 
or die('Nie mogę połączyć z bazą danych<br />Błąd: '.mysql_error()); 
?>

Zapisujemy to jako plik config.php.

Zaczynamy od pliku register.php
 <?php
include("config.php");
//Ważne aby config.php byl w tym samym katalogu co register.php
function registerForm() { //Formularz rejestracji
	?>
	<form method="POST">
	Nazwa:<br />
	<input type="text" name="name" /><br />
	Hasło:<br />
	<input type="password" name="pass" /><br />
	E-mail:<br />
	<input type="text" name="mail" /><br />
	Gadu-Gadu:<br />
	<input type="text" name="gg" /><br />
	<input type="submit" name="submit" value="Rejestracja" /><br />
	<?php
}
function register() { //Funkcja rejestracji
	//Odbieramy dane
	$name = $_POST['name'];
	$pass = md5($_POST['pass']);
	$mail = $_POST['mail'];
	$gg = $_POST['gg'];
	//Zmienna błedu
	$error = false;
	//Sprawdzamy czy wypełnione są pola nazwa, haslo i email
	if(empty($name)||empty($pass)||empty($mail)) {
		echo "Nie wypełniono wszystkich pól!<br />"; //Jesli nie wypelniono
		$error = true;
	}
	//Dodajemy do bazy jeżeli nie ma błedów
	if(!$error) {
		$query = "INSERT INTO `users` (`id`, `name`, `pass`, `mail`, `gg`) VALUES ('', '$name', '$pass', '$mail', '$gg');";
		$result = mysql_query($query);
		echo "Zarejestrowano poprawnie, <a href=login.php>możesz się teraz zalogować!</a><br />";
	}
}
//Teraz wywołujemy funkcje ifem 
if(isset($_POST['submit'])) {
	//Jeżeli wyslano formularz ;d
	register();
} else {
	//Jeżeli nie wyslano
	registerForm();
}
?>

Rejestracje mamy już za sobą, teraz pozostał tylko plik login.php
 <?php
session_start();
include("config.php");
//Funkcja formularza logowania
function loginForm() {
	?>
	<form method="POST">
	Login:<br />
	<input type="text" name="name" /><br />
	Hasło:<br />
	<input type="password" name="pass" /><br />
	<input type="submit" name="submit" value="Zaloguj" />
	</form>
	<?php
}
//Teraz funkcja odpowiadająca za zalogowanie
function login() {
	//Odbieramy dane
	$name = $_POST['name'];
	$pass = md5($_POST['pass']);
	$error = false;
	//Sprawdzamy puste pola
	if(empty($name)||empty($pass)) {
		echo "Nie wypełniono wszystkich pól!<br />";
		$error = true;
	} 
	//Sprawdzamy czy w bazie istnieje taki użytkownik i logujemy 
	$query = "SELECT * FROM users WHERE name = '$name' AND pass = '$pass'";
	$result = mysql_query($query);
	$dane = mysql_fetch_array($result);
	if($name == $dane['name'] && $pass == $dane['pass'] && !$error) {
		//Tu oczywiście możemy wczytać takie wartosci jakie chcemy
		$_SESSION['loged'] = true;
		$_SESSION['nick'] = $dane['name'];
		$_SESSION['gg'] = $dane['gg'];
		$_SESSION['mail'] = $dane['mail'];
		echo "Zostałeś poprawnie zalogowany!<br />";
	} else {
		echo "Nie można zalogować, <a href=login.php>spróbój ponownie.</a><br />";
	}
}
//Wczytujemy funkcje
if(isset($_POST['submit'])) {
	//Jesli wyslano formularz
	login();
} else {
	//Jesli nie wyslano
	loginForm();
}
?>PHP]
I taki mały „bajer” na sprawdzenie w postaci [b]index.php[/b]
[PHP] <?php
session_start();
header("Content-Type: text/html; charset=utf8");
include("config.php");
if($_SESSION['loged']) {
	echo 'Witaj '.$_SESSION['nick'].'<br />Twój e-mail to: '.$_SESSION['mail'].'<br />A gg: '.$_SESSION['gg'].'.';
} else {
	echo '<a href=register.php>Zarejestruj się </a><a href=login.php>lub zaloguj.</a>';
}
?>

Miłej zabawy w PHP, myślę że pomogłem :)
Skrypt sprawdzony, u mnie działa :D
<?php
echo "Zapraszam na Kamil-Net.pl";
?>
2

#0 Reklama

  • WebForum.pl
  • Grupa Advert

Napisano --



#2 Użytkownik nie jest zalogowany   WisJa Ikona

  • Ogarnięty
  • PipPipPipPip
  • Grupa Members
  • Postów 50
  • Rejestracja 25-grudzień 09

Napisano 25 grudzień 2009 - 15:29

Może i działa, ale widzę kilka problemów. Pierwszy to at przy połączeniu. Jest to ignorowanie na siłę błędów. Nie jest to raczej dobre rozwiązanie. Lepiej żeby błąd się na wyświetlił, żebyśmy wiedzieli co poprawić. Drugim, już poważniejszym jest zapisywanie statusu oraz danych w sesji. Można ją podrobić i łatwo podszyć się pod innego użytkownika. Najlepiej jest to zrobić przy użyciu MySQL tworząc tabelę z sesjami. W sesji w przeglądarce zapisywać tylko losowe id sesji a przy logowaniu dodawać do tabeli rekord z ip użytkownika, id sesji oraz czasem przeliczonym na minuty. Aby sprawdzić czy użytkownik jest zalogowany wykonujemy zapytanie, w którym sprawdzamy czy istnieje sesja o id zapisanym w sesji w przeglądarce, ip użytkownika oraz o czasie większym od aktualnego (również przeliczonego na minuty) -5. W ten sposób zbudujemy dużo bezpieczniejszy skrypt. Znajdę trochę czasu to zaprezentuje dokładniej :)
PS: po co tworzysz funkcję, której używasz tylko raz? Funkcję tworzymy po to, aby nie musieć bawić się w pisanie danego fragmentu kodu kilka(naście) razy.
0

#3 Użytkownik nie jest zalogowany   WisJa Ikona

  • Ogarnięty
  • PipPipPipPip
  • Grupa Members
  • Postów 50
  • Rejestracja 25-grudzień 09

Napisano 26 grudzień 2009 - 18:07

Ok. Oto - myślę - porządny skrypt logowania:
Tworzenie tabeli w mysql pozostawiamy takie jak u kolegi, skrypt register.php też.
Jeśli chodzi o plik cofing.php to optymalnie będzie to wyglądało tak:
<?php mysql_select_db('nazwa_bazy', mysql_connect('host', 'user', 'password')) or die ('Nie udało się nawiązać połączenia z bazą danych'); ?>


Czas na utworzenie w bazie danych tabeli z sesjami. Wygląda to tak:
CREATE TABLE `session` (
`id` INT NOT NULL AUTO_INCREMENT ,
`time` INT NOT NULL ,
`sess` INT NOT NULL ,
`ip` TEXT NOT NULL ,
`user` TEXT NOT NULL ,
`gg` TEXT NOT NULL ,
`mail` TEXT NOT NULL ,
PRIMARY KEY ( `id` )
) TYPE = MYISAM ;


Przejdźmy teraz do pliku login.php:
<form method="POST">
Login:<br />
<input type="text" name="name" /><br />
Hasło:<br />
<input type="password" name="pass" /><br />
<input type="submit" name="submit" value="Zaloguj" />
</form>

<?php
include('cofing.php');

if(isset($_POST['submit']))
{
  $name = $_POST['name'];
  $pass = md5($_POST['pass']);

  $q=mysql_query("SELECT * FROM `users` WHERE `name`='".$name."' AND `pass`='".$pass."';"); //szukamy w tabeli usera o podanym loginie i haśle
  $r=mysql_num_rows($q);
  if($r==1) //sprawdzamy czy user istnieje
  {
    $sess=rand(0000001, 9999999); //losujemy session id
    $time = (date(Y)*(365+date(L))*24*60)+(date(z)*24*60)+(date(H)*60)+date(i); //zamieniamy czas na minuty
    
    mysql_query("INSERT INTO `session`(`time`, `sess`, `ip`, `user`) VALUES('".$time."', '".$sess."', '".$_SERVER['REMOTE_ADDR']."', '".$name."');"); //dodajemy rekord do tabeli z sesjami
    $_SESSION['sess']=$sess;
    echo"Zostałeś poprawnie zalogowany. <a href=\"index.php\">Przejdź do strony głównej.</a>";
  }
  else echo'Podano złe dane.';
}
?>


Teraz czas na plik logged.php, który będzie miał za zadanie sprawdzanie czy user jest zalogowany.
include('cofing.php');
$time = (date(Y)*(365+date(L))*24*60)+(date(z)*24*60)+(date(H)*60)+date(i)-5; //obecny czas przeliczony na minuty -5

$q = mysql_query("SELECT * FROM `session` WHERE `ip` = '".$_SERVER["REMOTE_ADDR"]."' AND `sess` = '".$_SESSION['sess']."' AND `time` > '".$time."';"); //Sprawdzamy czy sesja istnieje w tabeli
$r = mysql_num_rows($q);

if ($r != 0)
{
	$logged = true;
	$t = (date(Y)*(365+date(L))*24*60)+(date(z)*24*60)+(date(H)*60)+date(i);
	mysql_query("UPDATE `session` SET `time` = '".$t."' WHERE `ip` = '".$_SERVER["REMOTE_ADDR"]."' AND `sess` = '".$_SESSION['sess']."';");
}
// Jeśli rekord istnieje modyfikujemy go na obecny czas

Aby sprawdzić czy user jest zalogowany dołączamy ten plik i sprawdzamy czy $logged==true;
Dziękuje za uwagę i powodzenie:)
0

#4 Użytkownik nie jest zalogowany   deniol13 Ikona

  • Przedszkolak
  • Pip
  • Grupa Members
  • Postów 2
  • Rejestracja 30-styczeń 10

Napisano 30 styczeń 2010 - 14:21

no tak, a bezpieczeństwo nie ma znaczenia ? dodanie w kilku miejscach mysql_real_escape_string pomoże...
co do hashowanie to md5 można łatwo złamać... dodawajcie jakąś sól np
<?php
$salt ='this is the salt';
echo md5($salt.$_POST['haslo']);
?>

0

#5 Użytkownik nie jest zalogowany   WisJa Ikona

  • Ogarnięty
  • PipPipPipPip
  • Grupa Members
  • Postów 50
  • Rejestracja 25-grudzień 09

Napisano 30 styczeń 2010 - 15:46

To może zamiast md5 sh1/sh2 itd... ?
0

#6 Użytkownik nie jest zalogowany   Monter Ikona

  • Przedszkolak
  • Pip
  • Grupa Members
  • Postów 2
  • Rejestracja 17-czerwiec 11

Napisano 17 czerwiec 2011 - 20:22

Może odkopuje temat, ale skrypty są narażone na tzw. Sql Injection, proponuje przed zapytaniem o login i hasło dodać add_slashes(). I nie radzę używać "$login", jeżeli przekazujecie przez POST to $_POST['login'], czysta głupota i nic więcej. Wystarczy przesłać zmienną przez GET i już nie musimy używać formularza..
Radzę zmienić:
$name=addslashes($_POST['name']);
$pass=addslashes($_POST['pass']);
$q=mysql_query("SELECT * FROM `users` WHERE `name`='".$name."' AND `pass`='".$pass."';");

0

Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych