[PHP]Problem z logowaniem w CMS

Hej, witam Was. Ostatnio zabrałem się za książkę wydawnictwa Helion pt: “Projektowanie Systemów CMS przy Użyciu PHP i JQUERY”. 

Nikt tego nie ściągnie, wstaw fragment kodu, który podejrzewasz, o niepoprawne działanie. Użyj znacznika code.

Być może jest to plik admin_libs.php, który sprawdza czy sesja jest adminem i tak dalej. 

?php
require $_SERVER['DOCUMENT_ROOT'].'/mt.incs/basics.php';
function is_admin(){
    if(!isset($_SESSION['userdata']))return false;
    if(
        isset($_SESSION['userdata']['groups']['_administrators']) ||
        isset($_SESSION['userdata']['groups']['_superadministrators'])
    )return true;
    if(!isset($_REQUEST['login_msg']))$_REQUEST['login_msg']='permissiondenied';
    return false;
}
if(!is_admin()){
    require SCRIPTBASE.'mt.admin/login/login.php';
    exit;
}
?

Albo plik login.php. 

?php
	require SCRIPTBASE.'mt.incs/recaptcha.php';
	$captcha=recaptcha_get_html(RECAPTCHA_PUBLIC);
?
html
	head
		titleLogowanie/title
		script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"/script
		script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/jquery-ui.min.js"/script
		link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/themes/south-street/jquery-ui.css" /
		script src="/mt.admin/login/login.js"/script
		link rel="stylesheet" type="text/css" href="/mt.admin/login/login.css" /
	meta http-equiv="Content-Type" content="text/html; charset=utf-8"/head
	body
		div id="header"/div
?php
if(isset($_REQUEST['login_msg'])){
	require SCRIPTBASE.'mt.incs/login-codes.php';
	$login_msg=$_REQUEST['login_msg'];
	if(isset($login_msg_codes[$login_msg])){
		echo 'script$(function(){$("strong'
			.htmlspecialchars($login_msg_codes[$login_msg])
			.'/strong").dialog({modal:true});});/script';
	}
}
?
		div class="tabs"
			ul
				lia href="#tab1"Logowanie/a/li
				lia href="#tab2"Przypomnienie hasła/a/li
			/ul
			div id="tab1"
				form method="post" action="/mt.incs/login.php?redirect=?php echo $_SERVER['PHP_SELF'];?"
					table
						trthe-mail/thtdinput id="email" name="email" type="email" //td/tr
						trthhasło/thtdinput type="password" name="password" //td/tr
						tr id="captcha"thcaptcha/thtd?php echo $captcha; ?/td/tr
						trth colspan="2" align="right"input name="action" type="submit" value="zaloguj" class="login" //th/tr
					/table
				/form
			/div
			div id="tab2"
				form method="post" action="/mt.incs/password-reminder.php?redirect=?php echo $_SERVER['PHP_SELF'];?"
					table
						trthe-mail/thtdinput id="email" type="text" name="email" //td/tr
						trth colspan="2" align="right"input name="action" type="submit" value="wyślij mi moje hasło" class="login" //th/tr
					/table
				/form
			/div
		/div
	/body
/html

Albo login.php z innego folderu. 

?php
require 'login-libs.php';

login_check_is_email_provided();

//sprawdzenie czy podano hasło
if(!isset($_REQUEST['password'])|| $_REQUEST['password']==''){
	login_redirect($url,'nopassword');
	}

login_check_is_captcha_provided();
login_check_is_captcha_valid();
//sprawdzenie czy podana kombinacja hasła i adresu e-mail pasuje do użytkownika

$password=md5($_REQUEST['email'].'|'.$_REQUEST['password']);
$r=dbRow('select * from user_accounts where email="'.addslashes($_REQUEST['email']).'" and password="'.$password.'" and active');
if($r==false){
	login_redirect($url,'loginfailed');
}
// powodzenie! utworzenie zmiennej sesji i dokonanie przekierowania 
$_SESSION['userdata']=$r;
$groups=json_decode($r['groups']);
$_SESSION['userdata']['groups']=array();
foreach($groups as $g)$_SESSION['userdata']['groups'][$g]=true;
if($r['extras']=='')$r['extras']='[]';
$_SESSION['userdata']['extras']=json_decode($r['extras']);

login_redirect($url);
'select * from user_accounts where email="'.addslashes($_REQUEST['email']).'" and password="'.$password.'" and active'

1. Niektóre bazy mogą takiego czegoś nie wspierać, chodzi o “and active”

http://stackoverflow.com/questions/859762/is-this-the-proper-way-to-do-boolean-test-in-sql

  1. Pokaż kod dodający administratora do bazy

  2. Włącz powiadamianie o błędach - może jakieś się generują?

Ps dużo funkcji jest “opkaowane” (dbRow, login_redirect, etc.) i strasznie kiepsko się to czyta. Nie wiem czy nie lepiej byłoby to samemu od początku napisać w prostszy sposób.

Nie potrafiłbym napisać tego sam. 

Czyli jak rozumiem, póki co przepisujesz książkę i jak coś zadziała to się cieszysz. Coś jak uczenie się jazdy na rowerze, patrząc jak robią to inni?

Ściągnąłem ten plik .rar i ogólnie jeśli taki bełkot jest w tej książce to bym za nią 5 groszy nie dał. Znalazłem coś, co może być przyczyną błędów (raczej jest na pewno), ale może to nie być jedyny błąd i nie naprawi wszystkiego

 

--
-- Zrzut danych tabeli `user_accounts`
--
 
INSERT INTO `user_accounts` (`id`, `email`, `password`, `active`, `groups`, `activation_key`, `extras`) VALUES
(3, 'mateusz@gmail.com', '202cb962ac59075b964b07152d234b70', 1, '["_superadministrator"]', NULL, NULL),
(4, 'mt@gmail.com', '81dc9bdb52d04dc20036dbd8313ed055', 1, '[]', NULL, NULL);

...
//powodzenie. Utworzenie zmiennej sesji i dokonanie przekierowania
$_SESSION['userdata']=$r;
$groups=json_decode($r['groups']);
$_SESSION['userdata']['groups']=array();
foreach($groups as $g)$_SESSION['userdata']['groups'][$g]=true;
if($r['extras']=='')$r['extras']='[]';
$_SESSION['userdata']['extras']=json_decode($r['extras']);

function is_admin(){
if(!isset($_SESSION['userdata']))return false;
if(
isset($_SESSION['userdata']['groups']['_administrators']) ||
isset($_SESSION['userdata']['groups']['_superadministrators']
))return true;
if(!isset($_REQUEST['login_msg'])) $_REQUEST['login_msg']='permissiondenied';
return false; }
 
if(!is_admin()){
require SCRIPTBASE.'mt.admin/login/login.php';
exit;
}

Jako, że nie lubię dawać ryby: Znajdź błąd ograniczając się do tych fragmentów.

PS

  1. Przechowywanie group jako wielu wartości w formacie json jest beznadziejne (poszukaj czemu nie należy tak robić)

  2. Zapisanie uprawnień na sztywno to kastracja wszelkich znamion CMS-u

Nie przepisuje książki na sztywno. Czytam czego dotyczą rzeczy w niej zawarte oraz jak działają. 

Cóż podpowiem, tylko bo faktycznie może ci to zająć: singular vs plural.

_superadministrators =/= _superadministrator. Tak?

Niestety logowanie nadal nie działa. Proszę kogokolwiek o pomoc :slight_smile:

Proszę korzystać z opcji Edytuj , zamiast pisać post pod postem.

rgabrysiak