Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Zabezpieczanie panelu admina
Forum PHP.pl > Forum > Przedszkole
krzysiek_raven
Witam. Jestem nowy na tym forum. Niedawno zacząłem uczyć sie php i im głębiej w to wchodze tym większe problemy napotykam:P
Zrobiłem prosty system artykułów i komentarzy do nich i panel do zarządznia tym systemem. Panel znajduje sie w oddzielnym folderze i składa sie z kilku plików .php. Chciałbym zabezpieczyć jakoś pliki w tym folderze albo najlepiej cały folder wraz z zawartością. Znalazłem już kilka rozwiązań np. coś takiego jak tu http://www.webdiary.pl/technologie+art.id+217.htm ale mój panel składa sie z kilku plików i zabezpieczanie każdego pliku z osobna oznaczało by, przy przejściu na podstrone, konieczność ponownego podania hasła:/ Oznacza to że trzeba tak zrobić panel aby wszystko zawierało się np. w stronie index.php? Czy może da rade jakoś zabezpieczyć cały folder z zawartością?
Link do stronki: http://www.testyphpsql.yoyo.pl/index.php
Link do panelu: http://www.testyphpsql.yoyo.pl/admin_panel/
kossa
Na sam początek zacznij od logowania opartego na sesjach - session" title="Zobacz w manualu PHP" target="_manual. W każdym pliku sprawdzaj czy wartość sesji jest OK, jeśli tak to wyświetlaj plik, jeśli nie to zrób przekierowanie na stronę logowania.

Łukasz
krzysiek_raven
Ok, dzieki. Spróbuje wykombinować coś z tymi sesjami. A może da rade iść na łatwiznę i jakoś dać hasło na cały folder?tongue.gif
TomASS
Hasło na cały katalog to przy pomocy pliku .htaccess.

Zrób tak jak kolega kossa radzi - sesje, proste jak .... strzyżenie psa tongue.gif

Nie należy jednak zapomnieć o bezpieczeństwu sessji
krzysiek_raven
Poczytałem troche już o sesjach i chodzi w tym mniej więcej o to że: pierwszą strone zabezpieczam hasłem i po poprawnym wpisaniu hasła otwieram sesje i tworze identyfikator, tak? A na pozostałych stronach sprawdzam czy sesja jest rozpoczęta i czy identyfikator jest prwidłowy, jeśli jest to można sie poruszac po stronach, a jeśli nie to daje linka do strony głównej z hasłem. A dla bezpieczeństwa ten identyfikator przekazuje sie w cookie (o którym też jeszcze nic nie wiem:P), czy o to w tym chodzi?
mike
Tak.
Teraz musisz to ogarnąć w praktyce smile.gif
krzysiek_raven
Czy takie coś powinno wystarczyć, aby przeciętnemu użytkownikowi nie udało sie nic namieszać w panelu administracjnym?

plik login.php
  1. <?php
  2.  
  3. // ---- LOGIN i HASŁO ----
  4. $login = "admin";
  5. $haslo = "f39bfe1e6901e9cc87ca44e435f5671b";
  6. // -----------------------
  7.  
  8. function formularz()
  9. {
  10.  echo '<FORM ACTION="login.php" METHOD="post">
  11.  Wpisz login i hasło<br />
  12.  Login: <INPUT TYPE="tekst" NAME="log"><br />
  13.  Hasło: <INPUT TYPE="tekst" NAME="has"><br />
  14.  <input type="submit" value="zaloguj">
  15. </FORM>';
  16. }
  17. function sprawdz($l, $h, $login, $haslo)
  18. {
  19.  if ($l == $login && md5($h) == $haslo){
  20. return TRUE;
  21.  }
  22.  else return FALSE;
  23. }
  24.  
  25.  
  26. // -- MAIN --
  27.  
  28. $l = $_POST['log'];
  29. $h = $_POST['has'];
  30.  
  31. if (sprawdz($l, $h, $login, $haslo)){
  32.  
  33.  // -- obsługa sesji --
  34.  
  35.  if (!isset($_SESSION['id'])){
  36. $_SESSION['id'] = $login;
  37. header("Location: index.php" . SID);
  38.  }
  39.  
  40. }
  41. else if ($l == TRUE || $h == TRUE){
  42.  echo('Dane niepoprawne - spróbuj jeszcze raz<br>');
  43.  formularz();
  44. }
  45. else formularz();
  46.  
  47. ?>


plik index.php i inne pliki panelu
  1. <?php
  2.  
  3.  if (!isset($_SESSION["id"])){
  4. header("Location: login.php" . SID);
  5. exit();
  6.  }
  7.  else{
  8. echo ('strona główna<br><br>');
  9. echo('<a href="logout.php">Wyloguj</a>');
  10.  }
  11.  
  12. ?>


plik logout.php
  1. <?php
  2.  
  3.  echo "Użytkownik " . $_SESSION["id"];
  4.  echo " został wylogowany.";
  5.  
  6. ?>


Nie używałem cookies bo jeszcze dokładnie nie wiem jak.
marcio
mam ten sam problem i sesje robie prawie tak samo jak ty ale gdy sie loguje to musze porownac login i haslo wpisane przez user'a z tym co jest w bazie??Bo mi sie zdaje ze tak jesli tak to jak mam je porownac o tak
Kod
$zapytanie = ("select * from shout where login='".$user_login."' and haslo='".sha1($user_pass)."'");
$zrob = mysql_query($zapytanie, $db) or die ('Polaczenie nie powiodlo sie');

if(mysql_num_rows($zrob) > 0) {

     echo ('Zalogowano');
     $_SESSION['user']=$user_login;
}

else {
     echo('Logowanie nie powiodlo sie');
  }
if($_SESSION['user']) {

     mysql_close($db);
     header("Location: user.php");
}

else {

     mysql_close($db);
     header("Location:nieuser.php");
}

to jak mam porownac dane z bazy tymi wpisanymi w formularzu?
cos takiego
if($user_login == $login && $user_pass == sha1($haslo)) {
//tu reszta kodu??
}
krzysiek_raven
Hasło w bazie jest zakodowane? Jeśli tak to po wyciągnięciu go z bazy w zakodowanej postaci można chyba porównać w ten sposób
  1. <?php
  2. $wynik = mysql_fetch_array($zrob, MYSQL_BOTH);
  3.  
  4. if ($user_login == $wynik['nazwa_kolumny_z_loginem'] && sha1($user_pass) == $wynik['nazwa_kolumny_z_haslem']) {
  5.  echo 'cos tam';
  6.  exit;
  7.  }
  8. ?>


Nie wiem czy dobrze zrozumiałem o co biega, ale coś takiego mi sie nasunęło;)
marcio
zrobilem identycznie tylko ze najpierw podalem zmienna z bazy a potem porownalem z ta z forma czyli zrobilem na odwrot ale chyba tez jest dobrze

Kod
<?php if($zrob) {

while($dane = mysql_fetch_assoc($zrob)) {

  if($zrob['login'] == $user_login && $zrob['haslo'] == sha1($user_pass)) {

     echo ('Zalogowano');
     $_SESSION['user'] = $user_login;
     $_SESSION['pass'] = $user_pass;
   }
}
}
?>
Grabarz
Cytat(marcio @ 28.09.2007, 22:57:05 ) *
<?php if($zrob) {

while($dane = mysql_fetch_assoc($zrob)) {

if($zrob['login'] == $user_login && $zrob['haslo'] == sha1($user_pass)) {

echo ('Zalogowano');
$_SESSION['user'] = $user_login;
$_SESSION['pass'] = $user_pass;
}
}
}
?>


coś pokręciłeś. jeżeli już to

while($dane = mysql_fetch_assoc($zrob)) {

if($dane['login'] == $user_login && $dane['haslo'] == sha1($user_pass)) {

echo ('Zalogowano');
$_SESSION['user'] = $user_login;
$_SESSION['pass'] = $user_pass;
}


I ja mam taką cichą nadzieję, że jak podajecie w zapytaniu SQL'a " WHER `login` = '$login_z_formularza' "
to linijke wcześniej stoi $login_z_formularza = addslashes($login_z_formularza);
Inaczej mozesz sobie pisac kod PHP, na sesjach z hashowanie w SHA1, a i tak SQL-injection da sie zrobić...
krzysiek_raven
Mam jeszcze jeden problem z tym zabezpieczeniem. Jak wpisuje adres http://www.testyphpsql.yoyo.pl/admin_panel/ to pokazuje mi że strona nie istnieje a do linku zostaje doczepione coś takiego
/login.phpPHPSESSID=f56dd27e5eca9821e0b44a485429380d. Główny plik w tym katalogu to index.php i gdy nie ma sesji to powinien przenieść do login.php i niby przenosi ale z tą końcówką w linku. O co chodzi? Czasami jest wszystko ok, a czasem sie to pojawia.
tiraeth
Ale w porządku robi. Przenosi do login.php. Jako dodatkowy parametr dodaje identyfikator sesji, który jest tworzony nawet, gdy użytkownik nie jest zalogowany (sesja uruchamia się przy wywołaniu funkcji session_start).

PHPSESSID jest dodawany do adresu tylko wtedy, gdy przeglądarka ma wyłączone cookies (ang. ciasteczka) lub, gdy konfiguracja php.ini zawiera wyłączone zapisywanie sesji do cookie.
marcio
Grabarz dzieki ale pisalem na szybko i bylo pozno wiec mi sie pokrecilo wielkie dzieki biggrin.gif a co do addslashes to one i tak nic nie pomoze jak ktos bedzie chcial zrobic sql injection to moze tylko uchrobnic przed sript kiddies ale ktos kto sie na tym zna to to objedzie do tego sie uzywa mysql_escape_real_string biggrin.gif
Grabarz
Też prawda:]
Ale ja dodatkowo sprawdzam funkcją ctype_alpha() - czy podany ciąg jest wyłącznie aklfabetyczny. (ew. wyrażeniami regularnymi - czy są TYLKO cyfry i litery - bez spacji, i innych znaków w loginie)

A co do problemu:

Jak user nie jest zalogowany to go przenosi do login.php
I przy okazji dokleja identyfikator SID:

<?php
session_start();
if (!isset($_SESSION["id"])){
header("Location: login.php" . SID);
exit();
} else {
echo ('strona główna<br><br>');
echo('<a href="logout.php">Wyloguj</a>');
}
?>


Popraw ta linię na header("Location: login.php?" . SID);

I już się nie będzie rypało. Jak wywołujesz plik *php, to parametr jest po "?" więc:
login.php?PHPSID=686868cośtam.
marcio
a jaka jest roznica jak ja zrobie bez SID??
Gość
Utwórz w katalogu z panelem administracyjny plik authpack.php , z taką zawartością:
  1. <?php
  2. $auth_haslo="jakieś hasło"; // tu hasło
  3. $auth_cookie_nazwa="admin_panel_user_data"; // nazwa cookie
  4. $auth_cookie_wartosc=md5($auth_haslo.date("dmY")); // zawartość cookie
  5.  
  6. if($_COOKIE[$auth_cookie_nazwa] != $auth_cookie_wartosc) { // sprawdza czy cookie jest ustawione
  7.  if(isSet($_POST['haslo'])) {
  8. if($_POST['haslo']==$auth_haslo) {
  9.  setcookie($auth_cookie_nazwa,$auth_cookie_wartosc); // wysyła cookie
  10. } else {
  11.  echo"<html>\n<head>\n<meta name=\"robots\" value=\"noindex\">
  12. <title>Nieprawidłowe hasło</title>\n</head>\n<body>\n<center>\nNieprawidłowe hasło<br>
  13. [<a href=\"".basename($_SERVER['PHP_SELF'])."\">Spróbój ponownie</a>]\n</center>\n</body>\n</html>";
  14.  exit; // blokuje dostęp
  15. }
  16.  } else {
  17. echo"<html>\n<head>\n<meta name=\"robots\" value=\"noindex\">
  18. <title>Podaj hasło</title>\n<body>\n<form method=\"post\">\n<center>
  19. Hasło: <input name=\"haslo\"><input type=\"submit\" value=\"OK\">
  20. </center>\n</form>\n</body>\n</html>";
  21. exit; // blokuje dostęp
  22.  }
  23. }
  24. ?>


A potem w plikach panelu administracyjnego umieść taki kod:
  1. <?php
  2. require("authpack.php");
  3. ?>
jarekjr
Witam mam podobną rzecz do zrobienia i mam jedno pytanko odnosnie sesji:
Kod
<?php
  session_start();

  echo '<h1>DLA ZOLOGOWANYCH</h1>';

  // sprawdzenie zmiennej sesji

  if(isset($_SESSION['prawid_uzyt']))
  {
    echo '<p>Użytkownik zalogowany jako '.$_SESSION['prawid_uzyt'].'</p>';
    echo '<p>tu wyswietla sie komunikat  dla zarejestrowanych</p>';
  }
  else
  {
    echo '<p>Użytkownik niezalogowany.</p>';
    echo '<p>Tylko zalogowani użytkownicy mogą oglądać tę stronę.</p>';
  }
    

?>

znalzłem gdzies taki skrypt odnosnie sesji uwierzytelniania, logowania itp... ale mam takie bardzo glupie pytanie i pewnie bedziecie mieli niezały ubaw ale trudno winksmiley.jpg.
w którym miejscu tego skryptu umieścić poprostu strone?! zeby nie bylo napisu "tu wyswietla sie komunikat dla zarejestrowanych " tylko było widac strone od znacznika <html> do znacznika </html>. Prosze was o odpowiedz i nie smiejcie sie za bardzo winksmiley.jpg
tiraeth
Przed znacznikiem <html> wstaw:
  1. <?php session_start();
  2. if ( !isset($_SESSION['prawid_uzyt']) ) header("Location: logowanie.php");
  3. ?>

Pod tym wrzuć normalnie stronę. Każdego niezalogowanego przekieruje z automatu do pliku logowanie.php, gdzie możesz np. umieścić formularz logowania.
jarekjr
Jeszcze jakby mi ktos wyjasnił o co chodzi z takim warningiem to był bym bardzo dźwieczny winksmiley.jpg:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\sesje\tylko_czlonkowie.php:3) in C:\wamp\www\sesje\tylko_czlonkowie.php on line 3
golaod
To oznacza, że wcześniej przed session_start wysyłasz już coś do przeglądarki (header,echo)
jarekjr
niestety to nie działa sad.gif.
Przed <html> wklejam to ale i tak moge wejsc bez logowaniana tą strone i jakos nie przekierowywuje na logowanie.php
i jeszcze wyskakuje
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\dfgfgvnhh\admin\admin.php:2) in C:\wamp\www\dfgfgvnhh\admin\admin.php on line 2
Lars
Nagłówki wysyłasz na początku, przed jakimkolwiek kodem.
golaod
Poczytaj o kodowaniu plików, możliwe, że masz źle zakodowany utf8 lub innny (zły edytor) który dodaje 2 znaki na samym początku pliku. Wszystko jest w FAQ w tym dziale wystarczy poczytać.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.