[php][mysql]skrypt logowanie - czy jest poprawny?

Języki, których efekty są wykonywane po stronie serwera. PHP, ASP czy CGI w połączeniu z bazami danych SQL dają niezwykłe możliwości budowy i zarządzania stron WWW. Tu zadajemy pytania oraz demonstrujemy kod, z którym mamy problem.
No_Name
Posty: 1
Rejestracja: pt sie 29, 2008 8:32 am

[php][mysql]skrypt logowanie - czy jest poprawny?

Post autor: No_Name »

Stworzyłem skrypt logowania składający się z 4 stron.
Oto one:

index.php

Kod: Zaznacz cały

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<TITLE>Formularz logoawnia</TITLE>
</HEAD>
<BODY>
<form action="login.php" method="post">
  Login: <input type="text" name="login" /><br>
  Hasło: <input type="password" name="haslo" /><br>
  <input type="submit" value="Loguj" />
</form>Tutaj wpisz treść dokumentu
</BODY>
</HTML>
login.php

Kod: Zaznacz cały

<?php
session_start();
$login = strip_tags($_POST['$login']);
$haslo = strip_tags($_POST['$haslo']);
$login = trim($login);
$haslo = trim($haslo);
$login = addslashes($login);
$haslo = addslashes($haslo);
$pol = mysql_connect("localhost","root","krasnal");
  if (!$pol) {
    echo "nie można się połączyć z bazą danych!";
    exit;
  }
$wyb = mysql_select_db("mojabaza");
  if (!$wyb) {
    echo "nie można wybrać bazy danych!";
    exit;
  };
$zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
$wyn = mysql_query($zap);
print mysql_error();
$ile = mysql_num_rows($wyn);
  if ($ile=="1") {
    $tekst = "Logowanie powiodło się!";
    $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
    $_SESSION['login'] = $login;
    $_SESSION['haslo'] = $haslo;
  }else{
    $tekst = "Logowanie nie powiodło się!";
    $przenies = "<meta http-equiv=\"Refresh\" content=\"1; index.php\">";
  };
@mysql_close($pol);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  <?php
    echo $przenies;
  ?>
<TITLE></TITLE>
</HEAD>
<BODY>
  <?php
    echo $tekst;
  ?>
</BODY>
</HTML>
strona.php

Kod: Zaznacz cały

<?php
session_start();
$login = $_SESSION['login'];
$haslo = $_SESSION['haslo'];
  if (empty($_POST['login']) && empty($_POST['haslo'])) {
    exit;
  }
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<TITLE>Jakiś tytuł</TITLE>
</HEAD>
<BODY>
<a href="logout.php">Wyloguj się</a><br>
jakaś treść jakaś treść jakaś treść jakaś treść
jakaś treść jakaś treść jakaś treść jakaś treść
jakaś treść jakaś treść jakaś treść jakaś treść
</BODY>
</HTML>
logout.php

Kod: Zaznacz cały

<?php
session_start();
session_destroy();
$_SESSION = array();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<TITLE></TITLE>
</HEAD>
<BODY>
Zostałeś pomyślnie wylogowany<br>
<a href="index.php">Strona logowania</a>
</BODY>
</HTML>
Chciałem zapytać Was czy powyższy skrypt jest bezpieczny i, jeżeli nie, jak go naprawić? Za wszystkie odpowiedzi z góry dziękuje!
Gnusmas
Posty: 11
Rejestracja: śr lip 02, 2008 5:09 pm

Re: [php][mysql]skrypt logowanie - czy jest poprawny?

Post autor: Gnusmas »

Nie jest dostatecznie bezpieczny z prostego powodu: nie masz szyfrowania hasła :wink: Poza tym skrypt jest zbudowany strasznie chaotycznie. NIe rozumiem po co wywołujesz funkcje strip_tags() na loginie i haśle? Jeśli nie chcesz aby login zawierał w sobie jakieś tam zanczki to zastosuj wyrażenia regularne. Zanim zastosujesz funkcje addslashes() warto byłoby sprawdzić czy dyrektywa magic_quotes_gpc jest włączona (get_magic_quotes_gpc()), żeby to było ładne i estetyczne można to zrobić tak:

get_magic_quotes_gpc() ? bez : dodać;

Jeśli masz dostęp do najnowszej wersji PHP warto byłoby zastosować bardziej elegancką obsługę błędów(try... throw... catch), aniżeli zwykły blok if. Warto byłoby się też zastanowić czy nie lepiej zrobić krok do przyszłości i zacząć stosować podejście obiektowe do obsługi bazy danych i bibliotekę mysqli.

Poza tym plik logout.php nie potrafi obsłużyć użytkowników niezalogowanych ;)
ODPOWIEDZ