Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]logowanie - czy ten skrypt jest poprawny?
Forum PHP.pl > Forum > PHP
No_Name
Stworzyłem skrypt logowania składający się z 4 stron.
Oto one:
index.php
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  2. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  3. <TITLE>Formularz logowania</TITLE>
  4. </HEAD>
  5. <form action="login.php" method="get">
  6. Login: <input type="text" name="login" /><br>
  7. Hasło: <input type="password" name="haslo" /><br>
  8. <input type="submit" value="Loguj" />
  9. </form>Tutaj wpisz treść dokumentu
  10. </BODY>
  11. </HTML>


login.php
  1. <?php session_start();
  2. $pol = mysql_connect("localhost","root","krasnal");
  3. if (!$pol) {
  4. echo "nie można się połączyć z bazą danych!";
  5. exit;
  6. }
  7. $wyb = mysql_select_db("mojabaza");
  8. if (!$wyb) {
  9. echo "nie można wybrać bazy danych!";
  10. exit;
  11. };
  12. $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
  13. $wyn = mysql_query($zap);
  14. print mysql_error();
  15. $ile = mysql_num_rows($wyn);
  16. if ($ile=="1") {
  17. $tekst = "Logowanie powiodło się!";
  18. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
  19. $_SESSION['login'] = $login;
  20. $_SESSION['haslo'] = $haslo;
  21. }else{
  22. $tekst = "Logowanie nie powiodło się!";
  23. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; index.php\">";
  24. };
  25. @mysql_close($pol);
  26. ?>
  27. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  28. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  29. <?php
  30. echo $przenies;
  31. ?>
  32. </HEAD>
  33. <?php
  34. echo $tekst;
  35. ?>
  36. </BODY>
  37. </HTML>


strona.php
  1. <?php session_start();
  2. $login = $_SESSION['login'];
  3. $haslo = $_SESSION['haslo'];
  4. if (!$login AND !$haslo) {
  5. exit;
  6. }
  7. ?>
  8.  
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  10. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  11. <TITLE>Jakiś tytuł</TITLE>
  12. </HEAD>
  13. <a href="logout.php">Wyloguj się</a><br>
  14. jakaś treść jakaś treść jakaś treść jakaś treść
  15. jakaś treść jakaś treść jakaś treść jakaś treść
  16. jakaś treść jakaś treść jakaś treść jakaś treść
  17. </BODY>
  18. </HTML>


logout.php
  1. <?php session_start();
  2. session_destroy();
  3. $_SESSION = array();
  4. ?>
  5. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  7. </HEAD>
  8. Zostałeś pomyślnie wylogowany<br>
  9. <a href="index.php">Strona logowania</a>
  10. </BODY>
  11. </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!
Bajki
ja bym wysyłał formularz metodą POST winksmiley.jpg

a ten fragment :
  1. <?php
  2. $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
  3. $wyn = mysql_query($zap);
  4. $ile = mysql_num_rows($wyn);
  5. if ($ile=="1") {
  6. $tekst = "Logowanie powiodło się!";
  7. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
  8. $_SESSION['login'] = $login;
  9. $_SESSION['haslo'] = $haslo;
  10. }else{
  11. $tekst = "Logowanie nie powiodło się!";
  12. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; index.php\">";
  13. };
  14. @mysql_close($pol);
  15. ?>
obudował bym w
  1. <?php
  2. if (!empty($_POST['login']) && !empty($_POST['haslo'])) {
  3. (...)
  4. }
  5. ?>


mało tego ! jeszcze wcześniej sprawdził bym login i hasło przy pomocy funkcji
htmlspecialchars()" title="Zobacz w manualu PHP" target="_manual i strip_tags()" title="Zobacz w manualu PHP" target="_manual
nexis
Cytat(No_Name @ 28.08.2008, 19:46:36 ) *
  1. <?php
  2. ...
  3. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; index.php\">";
  4. ...
  5. ?>


Może jednak header" title="Zobacz w manualu PHP" target="_manual?

  1. <?php
  2. header('location:index.php');
  3. ?>


Ponadto:

  1. <?php
  2. // Hasło w bazie danych radzę trzymać zakodowane - np. poprzez md5
  3. $query = sprintf
  4.  (
  5. "SELECT COUNT(*) FROM `uzytkownicy` WHERE `login`='%s' AND `haslo`='%s'",
  6. mysql_real_escape_string($_POST['login']),
  7. md5($_POST['haslo'])
  8.  );
  9. $query = mysql_query($query) or exit(mysql_error());
  10. $count = mysql_fetch_row($query);
  11. if (!= $count[0]) {
  12.  exit('Komunikat błędu!');
  13. }
  14. $_SESSION['login'] = $_POST['login'];
  15. $_SESSION['haslo'] = md5($_POST['haslo']);
  16. ?>
pyro
skrypt nie jest ani poprawny (chyba, że masz włączone register_globals), ani bezpieczny (nie filtrujesz danych w zaden sposob)
No_Name
co sugerujesz zmienić?
Bajki
podepne sie : wszystkie $login i $haslo musisz zamienic na $_POST['login'] $_POST['haslo'] albo $_GET[] jak tam wolisz ;p
pyro
nic zmienic, a filtrowac dane, i pobierac dane z $_POST, jesli masz wylaczone register_globals
No_Name
Teraz pliki po zmianie wyglądają tak:

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


login.php
  1. <?php session_start();
  2. $login = strip_tags($_POST['$login']);
  3. $haslo = strip_tags($_POST['$haslo']);
  4. $login = trim($login);
  5. $haslo = trim($haslo);
  6. $pol = mysql_connect("localhost","root","krasnal");
  7. if (!$pol) {
  8. echo "nie można się połączyć z bazą danych!";
  9. exit;
  10. }
  11. $wyb = mysql_select_db("mojabaza");
  12. if (!$wyb) {
  13. echo "nie można wybrać bazy danych!";
  14. exit;
  15. };
  16. $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
  17. $wyn = mysql_query($zap);
  18. print mysql_error();
  19. $ile = mysql_num_rows($wyn);
  20. if ($ile=="1") {
  21. $tekst = "Logowanie powiodło się!";
  22. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
  23. $_SESSION['login'] = $login;
  24. $_SESSION['haslo'] = $haslo;
  25. }else{
  26. $tekst = "Logowanie nie powiodło się!";
  27. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; index.php\">";
  28. };
  29. @mysql_close($pol);
  30. ?>
  31. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  32. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  33. <?php
  34. echo $przenies;
  35. ?>
  36. </HEAD>
  37. <?php
  38. echo $tekst;
  39. ?>
  40. </BODY>
  41. </HTML>


strona.php
  1. <?php session_start();
  2. $login = $_SESSION['login'];
  3. $haslo = $_SESSION['haslo'];
  4. if (empty($_POST['login']) && empty($_POST['haslo'])) {
  5. exit;
  6. }
  7. ?>
  8.  
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  10. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  11. <TITLE>Jakiś tytuł</TITLE>
  12. </HEAD>
  13. <a href="logout.php">Wyloguj się</a><br>
  14. jakaś treść jakaś treść jakaś treść jakaś treść
  15. jakaś treść jakaś treść jakaś treść jakaś treść
  16. jakaś treść jakaś treść jakaś treść jakaś treść
  17. </BODY>
  18. </HTML>


Jeżeli umieszczę takie pliki na serwerze to będzie wszystko ok?
pyro
nie.

  1. <?php
  2. $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
  3. ?>


admin'/*

// ADD

użyj mysql_real_escape_string() lub addslashes()
No_Name
po zmianie plik login.php wygląda tak:
  1. <?php session_start();
  2. $login = strip_tags($_POST['$login']);
  3. $haslo = strip_tags($_POST['$haslo']);
  4. $login = trim($login);
  5. $haslo = trim($haslo);
  6. $login = addslashes($login);
  7. $haslo = addslashes($haslo);
  8. $pol = mysql_connect("localhost","root","krasnal");
  9. if (!$pol) {
  10. echo "nie można się połączyć z bazą danych!";
  11. exit;
  12. }
  13. $wyb = mysql_select_db("mojabaza");
  14. if (!$wyb) {
  15. echo "nie można wybrać bazy danych!";
  16. exit;
  17. };
  18. $zap = "SELECT * FROM `uzytkownicy` WHERE login='$login' AND haslo='$haslo'";
  19. $wyn = mysql_query($zap);
  20. print mysql_error();
  21. $ile = mysql_num_rows($wyn);
  22. if ($ile=="1") {
  23. $tekst = "Logowanie powiodło się!";
  24. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; strona.php\">";
  25. $_SESSION['login'] = $login;
  26. $_SESSION['haslo'] = $haslo;
  27. }else{
  28. $tekst = "Logowanie nie powiodło się!";
  29. $przenies = "<meta http-equiv=\"Refresh\" content=\"1; index.php\">";
  30. };
  31. @mysql_close($pol);
  32. ?>
  33. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
  34. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  35. <?php
  36. echo $przenies;
  37. ?>
  38. </HEAD>
  39. <?php
  40. echo $tekst;
  41. ?>
  42. </BODY>
  43. </HTML>

Mogę już te pliki umieścić na serwerze?
pyro
można by jeszcze zamiast tych tagów meta dawać header('Location: strona'); ale to da sie wyżyć, przed mysql_close nie musisz dawać znaku małpy, a poza tym już jest chyba ok
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.