Diskuze: Rozdílné menu podle typu uživatele v PHP
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
No, to ti muzeme tezko poradit, kde mas v kodu chybu, kdyz sis ho nechal pro sebe. Ani nemame tuseni, jakym zpusobem vypisujes menu. Jako, klidne to muzes includovat.
<?php
// --- menu.php ---
function menu($prava = 'quest')
{
if ($prava=='uzivatel') {include 'soubor1.htm';}
if ($prava=='admin') {include 'soubor2.htm';}
if ($prava=='editor') {include 'soubor3.htm';}
if ($prava=='uzivatel') {include 'soubor4.htm';}
}
//---
?>
<?php
// --- index.php ---
include 'menu.php';
$prava = 'uzivatel';
menu($prava);
//---
?>
A mimochodem, nez polozis dotaz sem, poloz dotaz googlu. Treba si usetris
spustu casu... behem 20 min se da zkouknout treba 100 moznosti. Nic z toho se ti
nelibilo?
google = php menu navigation / About 2,630,000,000 results (0.69 seconds)
google = php menu by user permissions / About About 163,000,000 results (0.69
seconds)
google = php include menu by user roles / About 904,000,000 results (0.69
seconds)
google = php include menu by user roles school example
https://www.youtube.com/watch?…
Krasne videjko. Resi to pomoci databaze. Coz si muzes upravit podle sebe na neco
jineho.
Ahoj Peter. Děkuji za příklad a google nápovědu. Samozřejmě jsem se to
snažil googlit, ale když někdo (já) zadává špatný dotaz k vyhledání,
tak vyjedou výsledky, který mi až tolik nepomohli.
Kód jsem si zatim nechal "pro sebe", protože jsem si říkal, že někdy je
lepší raději začít od nuly než se přehrabovat ve "zmatku"
Zatím díky za nápovědu a případně doplním o konkrétní kód.
No, ale, kdyz nedas kod, tak neni na cem stavet, neni mozne ti v nem najit chybu a psat vlastni je prace navic. Vlastni vedomosti obvykle touzime zpenezit. Jinak by asi bylo lepsi jit kopat tunely, ne?
Jakoze, poradit najit chybu je jedna vec, jina udelat to cele za tebe.
Rozhodně to nechci, aby to udělal někdo za mě Šlo mi jenom o nějaký základní
typ.
Každopádně jsem tedy "vyzobal" kód a nechal to podstatné a přikládám.
Mám možná trochu podezření i na typ proměnné "spravce", která nabývá
hodnoty buď 0 nebo 1 (v základu).
<?
session_start();
require "./func.php";
if ($_GET["a"]=="logout")
{
unset($_SESSION["id"]);
}
elseif ($_GET["a"]=="login" or isset($_SESSION["id"]))
{
$link=mysqli_connect("localhost", "user", "pass");
mysqli_select_db($link,"database");
if (isset($_POST["odesli"])) {
$id = iduzivatele($_POST["jmeno"], $_POST["heslo"], $link);
if ($id<>0) $_SESSION["id"]=$id;
$spravce = pravauzivatele($_POST["jmeno"], $_POST["heslo"], $link);
}
}
?>
<!DOCTYPE html>
<html lang="en-US">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title></title>
</head>
<body class="size-1140">
<!-- HEADER -->
<header role="banner">
<!-- Top Navigation -->
<? switch ($spravce) {
case "1":
{
print '<li><a href="#">Admin funkce</a>';
print ' <ul>';
print ' </ul>';
print '</li>';
break;
}
case "0":
{
print '<li><a href="index.php?a=strana1">Strana 1</a></li>';
print '<li><a>Info</a>';
print ' <ul>';
print ' </ul>';
print '</li>';
break;
}
default:
{
print '<li><a href="index.php?a=uvod">Úvod</a></li>';
print '<li><a href="index.php?a=contacts">Kontakty</a></li>';
print '<li><a href="index.php?a=login">Přihlášení</a></li>';
break;
}
}
?>
</header>
</body>
</html>
<!-- func.php -->
<?php
function iduzivatele ($jmeno, $heslo, $link)
{
$vysledek = mysqli_query($link, "SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'");
if (mysqli_num_rows($vysledek)== false)
return false;
else {
$radek = mysqli_fetch_array($vysledek);
return $radek["id"];
}
}
function pravauzivatele ($jmeno, $heslo, $link)
{
$vysledek = mysqli_query($link, "SELECT spravce FROM Users WHERE email_rodic='".$jmeno."' and heslo='".$heslo."'");
if (mysqli_num_rows($vysledek)== false)
return false;
else {
$radek = mysqli_fetch_array($vysledek);
return $radek["spravce"];
// return $vysledek;
}
}
?>
"Mám možná trochu podezření i na typ proměnné "spravce""
Tak si to vypis tam, kde to pouzivas. var_dump($spravce);
function sqlRow($link, $query)
{
if (!$link || !$query)
return false;
$vysledek = mysqli_query($link, $query);
if (mysqli_num_rows($vysledek)== false)
return false; // return ukoncuje, takze neni treba psat else, ale muzes ho tam mit, pro tvoji vetsi prehlednost
return mysqli_fetch_assoc($vysledek); // tady ti staci fetch_assoc misto fetch_array
}
function iduzivatele ($jmeno, $heslo, $link)
{
$radek = sqlRow($link, "SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'");
return $radek["id"] || false;
}
function pravauzivatele ($jmeno, $heslo, $link)
{
$radek = sqlRow($link, "SELECT spravce FROM Users WHERE email_rodic='".$jmeno."' and heslo='".$heslo."'");
return $radek["spravce"] || false;
Ja bych si pred ten radek pridal var_dump. Bez nalogovani je to pradzne a po nalogovani, kdo vi.
<?php var_dump('$spravce=', $spravce, '$_SESSION=', $_SESSION); ?>
<? switch ($spravce) {
======
Jinak, v tom kodu je nekolik kritickych chyb.
$_GET["a"]=="login"
, pak je divne, ze jmeno a heslo ctes jako
$_POST["jmeno"]
iduzivatele($_POST["jmeno"], $_POST["heslo"], $link);
---> "SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'" // to tam davas primo z post
$jmeno = " ' OR ' '=' "; // pokud zadam tohle do policka pro jmeno, s temi apostrofy...
$heslo = " ' OR ' '=' ";
SELECT id FROM Users WHERE jmeno='".$jmeno."' and heslo='".$heslo."'
SELECT id FROM Users WHERE jmeno=' ' OR ' '=' ' and heslo=' ' OR ' '=' ' -- a to je totez jako
SELECT id FROM Users WHERE false OR (true AND false) OR true
SELECT id FROM Users WHERE false OR false OR true
SELECT id FROM Users WHERE true -- a to ti vrati prvniho uzivatele a pokud je admin... :)
$jmeno = $heslo = " ' OR 1=1 AND id=5 OR 1='";
SELECT id FROM Users WHERE jmeno=' ' OR 1=1 AND id=5 OR 1='' and heslo=' ' OR 1=1 AND id=5 OR 1='' -- a to je totez jako
SELECT id FROM Users WHERE false OR true AND id=5 OR false AND false OR true AND id=5 OR false
SELECT id FROM Users WHERE true AND id=5 OR false OR true AND id=5
SELECT id FROM Users WHERE true AND id=5
SELECT id FROM Users WHERE id=5 -- takze se muze nalogovat na jakehokoliv uzivatele
Nesmis zkratka do sql dotazu cpat promene bez osetreni.
Ja vim, v dokumentaci se to neresi, ale ta je taky stara 20 let. Vsude jinde,
googlem, bys nasel priklady, kde na to upozornuji a pouzivaji str_replace.
$a = str_replace("'", "\'" $a); // nahradi apostrof ' za \' ... nebo
$a = mysqli_real_escape_string($a);
https://www.php.net/…e-string.php
google = mysqli escape value for query
Díky za postřehy, to s tím nezabezpečeným logováním, toho jsem si
vědom. Měl jsem právě nějaký starší kód a zatim si právě hraju s tím
rozdílným menu a na to zabezpečení se chystám potom (možná špatný
postup, ale snažim se nejprve vyladit jednu věc a pak jdu na další )
Jinak k tomu: "pis php kod pred html kodem" - to se vztahuje i na ten switch()
?
Pokud to bylo na ty funkce, tak ty mam v separátnim souboru a jenom jsem je
nešikovně přidal na konec.
Jako, pis si to, jak chces, ale ja to pisi na jedno misto. Vyrobim vystupy a
ty pak zobrazuji uz hotove. Bude to pak pekne oddelene, program a html kod.
S temi strankami ti to nefungovalo, tak jsi mohl resit to ostatni, mezitim
Zobrazeno 10 zpráv z 10.