[php] generowanie linkow w zaleznosci od uprawnien usera

Odpowiedz Nowy wątek
2006-07-20 14:25
0

tworze sobie prywatnego homepage w php. zalozmy, ze mam na serwerze pliki A, B, C, chce aby jeden uzytkownik mial dostep tylko do pliku A inny do pliku A i B ale nie C itd.

mam juz zarzadzanie kontami oparte na mysqlu. ale jak generowac stronke z linkami w zaleznosci od uprawnien uzytkownika? hardcorowo: sztywna lista z plikami recznie uaktualniana? dla kazdego pliku tabela w mysqlu z lista dopuszczonych uzytkownikow?

ewentualne rozwiaznie w jscript odpada.


Pozostało 580 znaków

2006-07-20 14:32
0

A nie lepiej na poczatku każdej strony sprawdzać w bazie uprawnienia i w zależności od nich wyświetlać odpowiednie pliki? Przechowywanie tego w sesji nie jest zabezpieczne. Wtedy do każdego pliku dorzucasz tylko jakie są uprawnienia potrzebne.


"Zdrowy rozsądek to zbiór uprzedzeń nabytych do osiemnastego roku życia." - Albert Einstein
!user image

Pozostało 580 znaków

2006-07-20 19:37
0

no np tak, bierzesz sobie nowy plik i includujesz go wszędzie po wyjęciu danych sesji:

<?php
 
define('MOZE_PIERWSZA_STRONE', 1); // pow(2, 0)
define('MOZE_DRUGA_STRONE', 2); // pow(2, 1)
define('MOVE_TRZECIA_I_CZWARTA_STRONE', 4); // pow(2, 2);
 
$page_min_prvs = Array(
  '/strona1.php' => MOZE_PIERWSZA_STRONE,
  '/strona2.php' => MOZE_DRUGA_STRONE,
  '/strona3.php' => MOVE_TRZECIA_I_CZWARTA_STRONE,
  '/strona4.php' => MOVE_TRZECIA_I_CZWARTA_STRONE
);
 
// to powyżej np wyciągnąć z mysqla (zamiast stałych od razu rypać w bazie wielokrotność potęgi 2)
 
define('this_page', strtolower($_SERVER['SCRIPT_NAME']));
 
function can_access($page){
  $page = strtolower($page); // case insensitive
 
  $have = is_empty($_SESSION['privileges']) ? 0 : intval($_SESSION['privileges'];
  $need = in_array($page, $page_min_prvs) ? $page_min_prvs[$page] : 0;
 
  return ($have & $need) == $need;
}
 
if(!can_access(this_page){
  Header('Status: 403 Forbidden');
  Die();
}
 
?>

przy logowaniu pobrać wartość pola z bazy do $_SESSION['privileges'] (najlepiej na każdej podstronie)

na stronie przy generowaniu linków:

<?php
 
function linkto($page, $an){
  return can_access($page) ? '<a href="' . $page . '">' . $an . '</a><br />' : '';
}
 
?>
<?= linkto('/strona1.php', 'Link do pierwszej strony') ?>
<?= linkto('/strona2.php', 'Link do drugiej strony') ?>
<?= linkto('/strona3.php', 'Link do trzeciej strony') ?>
<?= linkto('/strona4.php', 'Link do czwartej strony') ?>
<?php
  if(can_access('/fotka.jpg'))
    echo '<img src="fotka.jpg" />'; // tajne foto <lol>
?>

a panel admina przy przypisywaniu mógłby wyglądać np tak:

<?php
$prvls = Array();
 
foreach($page_min_prvs as $strona => $prvl)
  $prvls[$prvl][] = $strona;
 
foreach($prvls as $prvl){
  ?>
  <label><input name="przywilej[]" value="<?= $prvl ?>" type="checkbox"><?php
 
  foreach($prvl as $strona)
    echo $strona . '; ';
 
  ?></label><br /><?php
}
?>

a zapisanie:

<?php
 
$new_prvls = 0;
 
foreach($_POST['przywilej'] as $prvl)
  $new_prvls |= intval($prvl);
 
mysql_query('UPDATE usery SET przywileje = ' . $new_prvls . ' WHERE id = ' . $id);
 
?>

to jest wszystko taki pseudokodowy zarys a poza tym przy liczbie 32 bitowej może zabezpieczyć tylko 32 strony ;P ale gdyby przetrzymywać uprawnienia każdemu w większej liczbie albo np w kilku liczbach to by było więcej, albo jako tekst i już nie ma problemu

pisałeś że sztywna lista plików ręcznie uaktalniana to hardcorowe rozwiązanie więc możesz trochę przerobić i na początku pliku każdego napisać jaki przywilej mu jest potrzebny ale wtedy w innych plikach byś musiał otwierać ten plik i odczytać te dane, bo inaczej nie wiadomo czy wyświetlić do tego pliku linka - poza tym musisz pamiętać ostatnią liczbę uprawnień żeby nie nadać tego samego więc po długim czasie jakbyś zapomniał i chciał dodać nowy plik to byś musiał przejrzeć wszystkie pliki jakie miały już uprawnienia - dla mnie to jest bardziej hardcorowe rozwiązanie

czemu w sesji niebezpiecznie ? nieuprawniony user może zmienić dane w sesji tak samo jak w bazie danych czyli jeśli ani w skrypcie ani w serwerze nie ma dziury to nijak

// a jak userów "uprawnionych" jest bardzo mało to możesz zrobić tabelke

page_id | user_id

i dodawać tak parami


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-07-21 08:41
0

Ja byłbym za rozwiązaniem z regułami.
Tworzysz tabele np tbl_rules z polami file, rule, id.
Potem dodajesz reguły (nowe rekordy w tej tabeli) dla każdego pliku wg zasady:

RULE  | ID   | Opis
------+------+-----------------
ALLOW | NULL | Plik dostępny dla wszystkich
ALLOW |  nr  | Plik dostępny dla użytkownika nr
DENY  | NULL | Plik niedostępny dla wszystkich
DENY  |  nr  | Plik niedostępny dla użytkownika nr
  • pole file może zawierać nazwę pliku lub jego ID (z innej tabeli np. tbl_files)
  • pole id może odnosić się do użytkownika lub grupy (lepiej to drugie). Zawsze można podać kilka ID w stylu "ID1|ID2|ID3" i rozdzielić explodem.
  • przy dodawaniu nowego pliku, od razu można zrobić combo box + edit do ustalenia reguł.

Pozostało 580 znaków

2006-07-23 11:26
0

Można też użyć zasad stosowanych natywnie w systemach unixowych - prawa dla właściciela, grupy i wszystkich, oraz przynależność użytkowników do grup i własność każdego pliku. Wszystko zależy od tego, jakiego typu uprawnienia potrzebujesz. Jest jeszcze opcja, że stosujesz prawa podobne do tych windowsowych. Każdy plik połączony z każdym użytkownikiem rekordem tabeli pośredniej określającej uprawnienia.


Grunt to uziemienie...

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0