bar_kow
27.11.2011, 18:16:02
Witam, męczę się jakiś czas. Może Wy mi pomożecie.
Mam prosty system logowania. Chciałbym do niego dodać odpowiednie uprawnienia. W MySQL dodałem kolumnę uprawnienia, gdzie domyślna wartość to "zwykle".
Jak zrobić aby po zalogowaniu, oprócz nazwy użytkownika pobierał też uprawnienia?
Plik logowania:
$message="";
// Sekcja logowania
$login=$_POST['login'];
if($login) {
$uzytkownik=$_POST['uzytkownik'];
$md5_haslo=md5($_POST['haslo']);
$host="localhost";
$db_user="UZYTKOWNIK";
$db_password="HASLO";
$database="NAZWA";
$rezultat=mysql_query("select * FROM logowanie WHERE uzytkownik='$uzytkownik' AND haslo='$md5_haslo'");
}else {
$message="<center><p algin='center'><div class='warning_box'>
Nieprawid?owa nazwa u?ytkownika lub has?o!.
</div></p></center>";
}
}
?>
STRONA
Plik strony (sesja):
<?
}
?>
STRONA
Proszę o pomoc...
Edit:
Pobieranie nazwy użytkownika np.:
Witaj,
<? echo $_SESSION['uzytkownik']; ?>.
Myślałem o tym $_SESSION['uprawnienia'] ale nie działa...;
szmerak
27.11.2011, 18:44:59
Po pierwsze to zabezpiecz te $_POSTy... Twój skrypt jest podatny na SQL INJECTION
a uprawnienia... w SELECie masz gwiazdke, więc pobiera wszystkie kolumny... tak więc co to za problem w indexie tablicy odwolac sie do tej kolumny?
i przypisac ja do zmiennej session
$result[nazwa_kolumny]
modern-web
27.11.2011, 19:20:47
Dodatkowo filtruj dane; ogranicz długość ciągu wprowadzanego do programu oraz zdefiniuj odpowiedni typ zmiennej (np. jeżeli ma być to liczbą to "(int) $zmienna = 1"). Odnośnie SQL Injection - skorzystaj z
mysql_real_escape_string. I tak na przyszłość, odradzam korzystania z MySQL. Poczytaj trochę o MySQLi oraz PDO. Nie dość, że szybsze to jeszcze oferują lepszą obsługę błędów
bar_kow
27.11.2011, 19:33:50
Coś takiego w pliku strony dać?
$_SESSION['uprawnienia'] = $result[uprawnienia]
?
modern-web
27.11.2011, 19:37:53
W pliku logowania musisz przekazać wartości do sesji - tutaj robisz $_SESSION['uprawnienia'] = $result['uprawnienia'].
Następnie w pliku strony musisz sprawdzić, czy sesja o nazwie 'uprawnienia' istnieje, a potem możesz sobie to przypisać do jakiejś zmiennej ale możesz też operować na zmiennej sesji
bar_kow
27.11.2011, 19:46:01
Coś mi dziś nie wychodzi... jakiegoś doła mam. Nawet nie wiem gdzie to wstawić aby działało
szmerak
27.11.2011, 19:55:09
Masz pliki... logowanie.php <- odpowiedzialny za sprawdzenie czy uzytkownik podał prawidłowe dane...
i index.php <- gdy użytkownik jest zalogowany ma dostęp do np. ukrytego menu...
W każdym pliku zaczynasz sesje
session_start();
Następnie w pliku logowanie po zwalidowaniu wszystkiego ustawiasz zmienne sesyjne.
$_SESSION['is_user_logged'] = TRUE;
+
$_SESSION['user_name'] = $result[username];
+
$_SESSION['rights'] = $result[rights];
i przekierowywujesz użytkownika na stronę index.php funkcją header();
W pliku index.php musisz sprawdzić czy użytkownik jest zalogowany..
np.
session_start();
<html>
<body>
//treść dostępna dla wszystkich
i tutaj sprawdzasz czy uzytkownik jest zalogowany
if($_SESSION['is_user_logged'] == TRUE) {
//treść tylko dla zalogowanych
Twoja nazwa użytkownika to: $_SESSION['user_name'];
Twoje uprawnienia to: $_SESSION['rights'];
}
//treść dostępna dla wszystkich
</html>
i w taki sposób możesz wszędzie sprawdzać czy użytkownik jest zalogowany...
if($_SESSION['is_user_logged'] == true)
{ tutaj dla zalogowanych }
Równierz wszystkie akcje dodawania/usuwania/edytowania możesz kontrować właśnie w taki sposób dając tylko dostęp zalogowanym użytkownikom...
Aby się wylogować używasz później funkcji session_destroy();
modern-web
27.11.2011, 19:57:30
LOGOWANIE:
<?php
if($login) {
$uzytkownik = $_POST['uzytkownik'];
$host="localhost";
$db_user="UZYTKOWNIK";
$db_password="HASLO";
$database="NAZWA";
$rezultat = mysql_query("SELECT * FROM `logowanie` WHERE `uzytkownik` = '$uzytkownik' AND `haslo` = '$md5_haslo'"); $_SESSION['uzytkownik'] = $rezultat['uzytkownik'];
$_SESSION['uprawnienia'] = $rezultat['uprawnienia'];
} else {
$message="<center><p algin='center'><div class='warning_box'>Nieprawid?owa nazwa u?ytkownika lub has?o!.</div></p></center>";
}
}
?>
STRONA:
<?php
if ( isset($_SESSION['uzytkownik']) && isset($_SESSION['uprawnienia']) ) { } else {
}
?>
Spróbuj teraz

Edit - @szmerak
Ja radziłbym wcześniej wyczyścić zawartość tablicy sesyjnej

$_SESSION = array();
szmerak
27.11.2011, 20:04:07
$start_user_sess = $_SESSION['uzytkownik'] = $rezultat('uzytkownik');
$start_user_priv = $_SESSION['uprawnienia'] = $rezultat('uprawnienia');
sorki ale nie wiem po co to skoro przekierowywujesz użytkownika na main.php
a po drugie dałeś nawiasy zwykłe zamiast kwadratowych
@EDIT
@up jak najbardziej zgadzam się z tym

. Ja mam do tego specjalne funkcje które są dołączane na początku każdego pliku
bar_kow
27.11.2011, 20:04:37
W pliku logowania wywala błąd w linii 3
modern-web
27.11.2011, 20:07:45
Faktycznie szmerak! Dzięki za czujność

Z pośpiechu popełniłem tak radykalny błąd.
Przypisałem te operacje do zmiennych z jednego powodu - żeby wiedział co się w tym momencie odbywa bo widzę, że facet jest ciemny w temacie sesje

Treść błędu poproszę.
szmerak
27.11.2011, 20:09:06
Mysql_real_escape_string możesz użyć dopiero po połączeniu się z bazą!
Przenieś to
$host="localhost";
$db_user="UZYTKOWNIK";
$db_password="HASLO";
$database="NAZWA";
Na samą górę pliku
bar_kow
27.11.2011, 20:10:16
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'coś'@'localhost' (using password: NO) in /home/xxxx/domains/xxxxx.eu/public_html/xxxxx/index.php on line 3
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/xxx/domains/xxxx.eu/public_html/xxxxx/index.php on line 3
modern-web
27.11.2011, 20:10:18
Najlepiej wywal poza katalog publiczny strony gdzieś katalog wyżej i użyj require do zaimportowania.
Mayka
27.11.2011, 20:11:44
No bo to że musisz wpisać swoje dane do logowania do sql'a to oczywiście wiesz
szmerak
27.11.2011, 20:13:27
Zrób tak weź utwórz osobny plik connect.php daj tam funkcję łączące się z bazą
a tam gdzie potrzebujesz łączyć się z bazą daj require './connect.php'; na samej górze
gotowca chyba nie musze ci dawać?
tak btw... taką masz nazwę użytkownika? Access denied for user 'coś'@'localhost'
"coś"?
modern-web
27.11.2011, 20:15:44
A skąd pewność, że nie jest to subdomena ;>? W tym wypadku pozostaje luka bezpieczeństwa przez domenę. Lepiej żeby wywalił ten katalog/plik ZUPEŁNIE poza public_html (w przypadku XAMPPA - poza htdocs)
@ nie używa się polskich znaków w programowaniu - wbij to sobie do głowy
bar_kow
27.11.2011, 20:16:43
Mayka, wiem wiem
Wywalił błąd w linii 23, poprawiłem nawiasy z ( ) na [ ] błąd zniknął. Teraz mam błąd w pliku strony
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at
Linia 4:
session_start();
Warning: Cannot modify header information - headers already sent by (output started at /ho
Linia 8:
header("location:index.php");
modern-web
27.11.2011, 20:17:48
dodaj
ob_start();
w 2 linijce kodu (pod session_start()

i
ob_end_flush();
na końcu pliku
szmerak
27.11.2011, 20:19:02
To znaczy że nagłówki zostały już wysłane...
Musisz wykonać te funkcje przed wyświetleniem czegokolwiek!
bar_kow
27.11.2011, 20:21:54
Jak zrobiłem tak:
<?php
if ( isset($_SESSION['uzytkownik']) && isset($_SESSION['uprawnienia']) ) { } else {
}
?>
STRONA
</div>
<?PHP
require('stopka.php');
?>
To wywala błędy w liniach:
4:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent
oraz 11
Warning: Cannot modify header information - headers already sent by (output started at
czyli w lini 11 jest header("location:index.php");
modern-web
27.11.2011, 20:24:40
Odpowiem tak; nie chce mi się tego wszystkiego tłumaczyć jak wątek ten był poruszany 1000 razy.
Rzuć okiem tutaj ->
http://forum.ovh.pl/showthread.php?t=7960i tutaj ->
http://pl.wikibooks.org/wiki/PHP/Sesjeoraz tutaj ->
header
szmerak
27.11.2011, 20:27:06
Przed znakiem <? masz spacje... A tam jej nie może być ponieważ ta spacja jest wyświetlana przed startem sesji.
Pamiętaj że te funkcje muszą być wywołane przed wysłaniem nagłówków...
Usuń spacje i powinno działać
bar_kow
27.11.2011, 20:30:03
Teraz nawet nie chce zalogować...
Ok wrócę do tego za tydzień, bo jutro wyjeżdżam na tygodniową konferencję po za Polskę...
modern-web
27.11.2011, 20:30:56
Język PHP pomija przecież spacje ;|, a na dodatek mówisz tu o spacjach, które wykraczają poza obszar skryptu...
szmerak
27.11.2011, 20:34:21
Ale przecież to co nie jest w znacznikach <?php?> jest wyświetlane jako HTML? right?
Tak więc to był problem ponieważ HTML(tutaj spacje) zostały wyświetlone przed wykonaniem kodu php
Nie potrzebnie to ciągniemy bar_kow daj kod źródłowy... Zobacze czy jestem wstanie ci pomóc
bar_kow
27.11.2011, 20:42:04
Plik index.php
<?php
$host="localhost"; // Nazwa hosta.
$db_user="nazwa_1"; // Nazwa użytkownika - MySQL.
$db_password="haslo"; // Hasło do bazy.
$database="tabela"; // Nazwa bazy.
if($login) {
$uzytkownik = $_POST['uzytkownik'];
// Połączenie z bazą.
$rezultat = mysql_query("SELECT * FROM logowanie WHERE uzytkownik = '$uzytkownik' AND haslo = '$md5_haslo'"); $start_user_sess = $_SESSION['uzytkownik'] = $rezultat['uzytkownik'];
$start_user_priv = $_SESSION['uprawnienia'] = $rezultat['uprawnienia'];
} else {
$message="<center><p algin='center'><div class='warning_box'>Nieprawid?owa nazwa u?ytkownika lub has?o!.</div></p></center>";
}
}
?>
<!-- PAGE --!>
<?PHP
require('gora.php');
?>
<div id="templatemo_main_top"></div>
<div id="templatemo_main"><span id="main_top"></span><span id="main_bottom"></span>
<?PHP
require('bok.php');
?>
<?PHP
require('../info.php');
?>
<div class="cleaner"></div>
</div> <!-- end of sidebar -->
<div id="templatemo_content">
<div class="content_box">
<h2>Logowanie</h2>
</div>
<div class="content_box">
<form id="form1" name="form1" method="post" action="
<? echo $PHP_SELF; ?>">
Username:<br>
<input type="text" name="uzytkownik" id="uzytkownik" size="35" /><br>
Password:<br>
<input type="password" name="haslo" id="haslo" size="35" /><br>
<input type="submit" name="login" id="login" value="Enter" />
</form>
<div class="cleaner"></div>
</div>
</div>
<div class="cleaner"></div>
</div>
<div id="templatemo_main_bottom">
</div>
</div> <!-- end of wrapper -->
</div>
<?PHP
require('stopka.php');
?>
Plik main.php
<?php
if ( isset($_SESSION['uzytkownik']) && isset($_SESSION['uprawnienia']) ) { } else {
}
?>
<!-- PAGE --!>
<?PHP
require('goraz.php');
?>
<div id="templatemo_main_top"></div>
<div id="templatemo_main"><span id="main_top"></span><span id="main_bottom"></span>
<?PHP
require('bokz.php');
?>
<?PHP
require('../info.php');
?>
<div class="cleaner"></div>
</div> <!-- end of sidebar -->
<div id="templatemo_content">
<div class="content_box">
<h2>Witaj
<? echo $_SESSION['uzytkownik']; ?> | Uprawnienia:
<? echo $_SESSION['uprawnienia']; ?> </h2>
</div>
<div class="content_box">
Aby kontynuować, wybierz odpowiednią pozycję w menu.
<div class="cleaner"></div>
</div>
</div>
<div class="cleaner"></div>
</div>
<div id="templatemo_main_bottom">
</div>
</div> <!-- end of wrapper -->
</div>
<?PHP
require('stopka.php');
?>
Juz tak namieszałem że sam już nic nie rozumiem, a głowa pi pęka przez stres... makabra
szmerak
27.11.2011, 21:16:01
Masz tutaj pliki.
index.php
http://wklej.to/KyhwWmain.php
http://wklej.to/TCbYNconnect.php
http://wklej.to/ay9l5zrobiłem na świeżo... niesprawdzałem
Używasz jakiegoś notepada? do pisania kodu?
bo masz straszny bałagan tam!
Dam ci jedną rade gdy robisz instrukcję if, funkcje, pętle ogólnie wszystko co otwiera i zamyka blok { }
Staraj się robić wcięcia tabulatur w środku... bardzo poprawia to czytelność kodu
i ogólnie zablokuj możliwość wejścia na formularz logowania jeśli ktoś jest zalogowany (zapomniało mi się)
daj na górze if($_SESSION['auth'] == TRUE) die("Wyloguj sie pierwsze");
Jeszcze jedno jak pewnie zauważyłeś użyłem ukrytego pola <input type="hidden" name="sent">
Jest to dobry sposób na sprawdzanie czy formularz został wysłany
bar_kow
27.11.2011, 21:24:14
Wielkie dzięki!
Tak, używam PSPad'a
Jednak nie pokazuje uprawnień

tylko nazwę użytkownika
szmerak
27.11.2011, 21:27:04
EDIT!
Omg jak ja mogłem tego nie zauważyć... Tam jest tylko zapytanie nie ma użytej funkcji mysql_fetch_array();
bar_kow
27.11.2011, 21:29:51
$rezultat = mysql_query("SELECT uzytkownik, uprawnienia FROM logowanie WHERE uzytkownik = '$uzytkownik' AND haslo = '$md5_haslo'");
nadal nie pokazuje uprawnień...
<h2>Witaj <? echo $_SESSION['uzytkownik']; ?> | Uprawnienia: <? echo $_SESSION['uprawnienia']; ?> </h2>
Pokazuje TYLKO nazwę użytkownika
szmerak
27.11.2011, 21:35:30
To:
$_SESSION['uzytkownik'] = $rezultat['uzytkownik'];
$_SESSION['uprawnienia'] = $rezultat['uprawnienia'];
$_SESSION['auth'] = TRUE;
zamień na:
$_SESSION['uzytkownik'] = $dane['uzytkownik'];
$_SESSION['uprawnienia'] = $dane['uprawnienia'];
$_SESSION['auth'] = TRUE;
Sorki mój błąd nie zauważyłem że tam jest tylko zapytanie mysql_query();
bar_kow
27.11.2011, 21:37:36
Działa! Dziękuję bardzo!!!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.