Witam
Próbuje napisać sprawny kod logowania z cookies opartym oczywiście o sesje i bazę danych mysql.
Jednak coś nie działa mi to w necie, bo lokalnie zdaję się że działa.
Mam jeszcze dodatkowe pytanie, czy da się jakoś sztucznie wydłużyć czas trwania SESSION? Typ serwera Home.pl, konto współdzielone, więc nie mam dostępu do php.ini
Oto zestaw plików odpowiedzialnych za logowanie u mnie.
Plik funkcje.php
<?php
require_once 'sterownik.php'; //cache
$host='localhost';
$user='xxxxxx';
$haslo='xxxxxx';
$baza='xxxxx';
//LOGOWANIE
//logowanie_cookies();
function polaczenie()
{
global $host,$user,$haslo,$baza; }
function wczytaj_ustawienia()
{
polaczenie();
$zapytanie=mysql_query('Select * from scms_ustawienia'); return $ustawienia;
}
function generuj_id_sesji()
{
return $id_sesji;
}
function logowanie_cookies()
{
//echo 'Logowanie cookies<br>';
if (!empty($_COOKIE['tajnecookie'])) {
//echo 'jest cookies<br>';
$id_sesji=$_COOKIE['tajnecookie'];
$test_session=sprawdz_sesje($id_sesji);
}
else
{
//echo '<br>nie ma cookies<br>';
}
}
function sprawdz_sesje($id)
{
//echo '<br>sprawdzanie cookies<br>';
polaczenie();
$zapytanie = "select * from scms_sesje where session_id='".$id."'";
//echo $zapytanie;
//echo "<br>Strona:".$_SERVER[HTTP_USER_AGENT].'<br>Baza:'.$dane['browser'].'<br>';
if(mysql_num_rows($wynik)!=0 and
($_SERVER[HTTP_USER_AGENT
]==$dane[agent
])) {
//echo '<br>Sesja z bazy:'.$dane[session_id].'<br>';
//echo '<br>Jest taka sesja w bazie<br>';
$_SESSION['uwierzytelniony'] = $dane['login'];
$_SESSION['user_poziom']=$dane['user_level'];
$_SESSION['id']=$dane['user_id'];
return $dane;
}
else
{
//echo '<br>Nie ma takiej sesji w bazie<br>';
return 0;
}
}
function czyszczenie_tabeli_sesji()
{
{
$czas=date(U
)-(60
*60
*24
*30
); $sql='DELETE from scms_sesje where czas<"'.$czas.'"';
}
}
?>
plik index.php
<?php
require 'funkcje.php';
polaczenie();
$ustawienia=wczytaj_ustawienia();
if ($ustawienia[status]=="OFF")
{
require ('strona_off.php'); exit; }
else
{
if (!$_SESSION['uwierzytelniony'] and !$_SESSION['user_poziom'] and !$_SESSION['id']) logowanie_cookies();
header ('Location: news.php');
}
?>
Plik logout.php
<?php
require 'funkcje.php';
function wyloguj($id)
{
polaczenie();
$zapytanie = mysql_query("delete from scms_sesje where session_id='".$id."'"); unset($_SESSION['uwierzytelniony']); unset($_SESSION['user_poziom']); header ('Location: index.php'); }
wyloguj($_COOKIE['tajnecookie']);
?>
Plik logowanie.php
<?php
if(isset($_POST['login']) and
isset($_POST['haslo'])) {
$iduzytkownika = $_POST['login'];
require_once ('funkcje.php');
polaczenie();
$zapytanie = "select ID_MEMBER,memberName,ID_GROUP,passwd,emailAddress from
smf_members where memberName='".$iduzytkownika."' and passwd='".sha1
(strtolower($iduzytkownika).$_POST[haslo
])."'"; if($jest_user > 0)
{
$polecenie=mysql_query('SELECT name from smf_ban_groups where name="'.$dane[memberName
].'"'); {
unset($_SESSION['uwierzytelniony']); unset($_SESSION['user_poziom']); }
else
{
$_SESSION['uwierzytelniony'] = $dane[memberName];
$_SESSION['user_poziom']=$dane['ID_GROUP'];
$_SESSION['id']=$dane['ID_MEMBER'];
$wygenerowane_id=generuj_id_sesji();
$sql=mysql_query('DELETE from scms_sesje where login="'.$_SESSION[uwierzytelniony
].'"'); $sql=mysql_query('Insert Into scms_sesje values (NULL,''.$wygenerowane_id.'',''.$dane[memberName
].'','' .$dane['ID_MEMBER'].'',''.$dane['ID_GROUP'].'',''.$_SERVER[HTTP_USER_AGENT
].'',''.date(U
).'')'); setcookie('tajnecookie',$wygenerowane_id,time()+60*60*24*30,'','',0
); czyszczenie_tabeli_sesji();
header ('Location: index.php');
}
}
else
{
header ('Location: news.php'); }
}
else header ('Location: news.php'); ?>
w nagłówku zaraz po body jest wywołanie funkcji:
<?php
if (!isset($_SESSION[uwierzytelniony
])) logowanie_cookies
(); ?>
Skrypt pisałem jakiś czas temu, mam świadomość że jest trochę chaotyczny (IMG:
http://forum.php.pl/style_emoticons/default/smile.gif) Jeśli jednak macie jakieś pomysły jak temu zaradzić. Nie trzeba tu nigdzie przypadkiem zregenerować id sesji? Tylko jak i gdzie? Będę wdzięczny za pomoc.
Pozdrawiam
Ten post edytował Avatarus 22.06.2008, 06:34:01