Skocz do zawartości

Logowanie i rejestracja


Kamil995

Recommended Posts

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 [/SQL]

Skoro mamy już tabelę możemy zacząć pisać kod. Na początku musimy stworzyć plik konfiguracyjny, który połączy nas z bazą

[PHP]<?
$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());
?>[/PHP]

Zapisujemy to jako plik [b]config.php[/b].

Zaczynamy od pliku [b]register.php[/b]

[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();
}
?>[/PHP]

Rejestracje mamy już za sobą, teraz pozostał tylko plik [b]login.php[/b]

[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>';
}
?>[/PHP]

Miłej zabawy w PHP, myślę że pomogłem :)

Skrypt sprawdzony, u mnie działa :D

  • Upvote 3
Link do komentarza
Udostępnij na innych stronach

  • 4 months later...

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.

Link do komentarza
Udostępnij na innych stronach

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:

&lt;?php mysql_select_db('nazwa_bazy', mysql_connect('host', 'user', 'password')) or die ('Nie udało się nawiązać połączenia z bazą danych'); ?&gt;

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:

&lt;form method="POST"&gt;
Login:&lt;br /&gt;
&lt;input type="text" name="name" /&gt;&lt;br /&gt;
Hasło:&lt;br /&gt;
&lt;input type="password" name="pass" /&gt;&lt;br /&gt;
&lt;input type="submit" name="submit" value="Zaloguj" /&gt;
&lt;/form&gt;

&lt;?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. &lt;a href=\"index.php\"&gt;Przejdź do strony głównej.&lt;/a&gt;";
  }
  else echo'Podano złe dane.';
}
?&gt;

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` &gt; '".$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:)

Link do komentarza
Udostępnij na innych stronach

  • 1 month later...

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

&lt;?php
$salt ='this is the salt';
echo md5($salt.$_POST['haslo']);
?&gt;

Link do komentarza
Udostępnij na innych stronach

  • 1 year later...

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."';");

Link do komentarza
Udostępnij na innych stronach

  • 2 years later...

Odkopujesz temat i wypisujesz głupoty.

Nie można na hamca dodawać slashy, bo może być włączona funkcja Magic Quotes.

Dość dobra I PODSTAWOWA funkcja do filtrowania zmiennych, opiera się przedewszystkim na usunięciu niebezpiecznych znaków:

function filtruj($zmienna)
{
    if(get_magic_quotes_gpc())
        $zmienna = stripslashes($zmienna); // usuwamy slashe

	// usuwamy spacje, tagi html oraz niebezpieczne znaki
    return mysql_real_escape_string(htmlspecialchars(trim($zmienna)));
}

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś treść z formatowaniem.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Wczytywanie...
×
×
  • Utwórz nowe...