Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> System logowania opary o MySQL
Strarus
post 6.01.2009, 17:00:48
Post #1





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


cześć:)
Chciałbym napisać system logowania oparty o mysql i sesje. Chciałbym się dowiedzieć na co muszę zwrócić uwagę podczas pisania takowego skryptu aby dany system był jak najbezpieczniejszy. Moja teoria napisania skryptu:
*login.php
- Sprawdza czy zostały przesłane dane (login i hasło). Jeśli tak: łączy się z bazą, wyciąga hasło z tabeli users gdzie login jest taki jak ten z POSTu. Jeśli wszystko się zgadza daję do sesji zmienną zalogowany, następnie przekierowuję na index.php (zabezpieczony przed wejściem bez sesji zalogowany). Jeśli nie są przesłane login i hasło pokazuje formularz z hasłem i loginem.
*logout.php
- Niszczę sesję zalogowany i przekierowuję na index.php
*index.php
- Sprawdzam czy jest sesja zalogowany jeśli tak - wyświetlam zawartość (u mnie będzie to system newsów) jeśli nie pokazuję link zaloguj i inne szczegóły strony.

Wszystko dobrze?? smile.gif Teraz jakich funkcji i gdzie ich użyć aby mój skrypt byłbezpieczny smile.gifquestionmark.gif
Go to the top of the page
+Quote Post
kyku
post 6.01.2009, 17:03:36
Post #2





Grupa: Zarejestrowani
Postów: 116
Pomógł: 8
Dołączył: 21.11.2008

Ostrzeżenie: (0%)
-----


moze to poczytaj winksmiley.jpg

Temat: Bezpieczenstwo_skryptow_PHP
Temat: SQL_Injection_Insertion
Temat: podwojne_hashowanie_hasel


--------------------
eArena.pl - hosting serwerów gier multiplayer
Go to the top of the page
+Quote Post
Strarus
post 6.01.2009, 17:46:09
Post #3





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


Dzięki smile.gif Zaraz coś naskrobię to dam na forum, żebyście powiedzieli co jest źle haha.gif

napotkałem na dylemat: chcę zarejestrować sesję ale w maualu jest napisane, że:
  1. <?php
  2. // Nie powinno się już używać session_register()
  3. $barney = "Duży fioletowy dinozaur.";
  4. session_register("barney");
  5.  
  6. // Od PHP 4.1.0 Preferowane jest użycie $_SESSION
  7. $_SESSION["zim"] = "Najeźdźca z innej planety.";
  8.  
  9. // Stara metoda opiera się o $HTTP_SESSION_VARS
  10. $HTTP_SESSION_VARS["spongebob"] = "Ma kwadratowe spodnie.";
  11. ?>


I teraz czego mam użyć haha.gif?? Znaczy $_SESSION['zalogowany']; czy session_register("zalogowany"); questionmark.gif
Go to the top of the page
+Quote Post
Mlodycompany
post 6.01.2009, 18:06:09
Post #4





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


użyj poprostu sesji biggrin.gif

  1. <?php
  2.  
  3.  
  4. reszta strony.
  5.  
  6. ?>


Rozpoczecie sesji musi być na samym początku kodu. Nie może być przed tym nawet spacji. Potem dodajesz sobie do tablicy $_SESSION odpowiednie dane jakie chcesz i działasz dalej.
Go to the top of the page
+Quote Post
Strarus
post 6.01.2009, 18:22:25
Post #5





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


Teraz proszę o ocenę tego systemu. Chodzi mi o bezpieczeństwo smile.gif

http://strarus.cba.pl/testy/login.php

Jeśli coś jest źle, to proszę także napisać co muszę zrobić aby to naprawić.

aha:
login: test
hasło: pass

Ten post edytował Strarus 6.01.2009, 18:22:55
Go to the top of the page
+Quote Post
Mlodycompany
post 6.01.2009, 18:30:52
Post #6





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Jak na 1 rzut okiem jest ok. Daj kod to zobaczymy czy w kodzie nie ma jakiś luk.
Go to the top of the page
+Quote Post
Strarus
post 6.01.2009, 18:34:24
Post #7





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


login.php
  1. <?php session_start(); ?>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  4. <head>
  5.      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  6.      <meta name="robots" content="index" />
  7.      <meta name="Author" content="Strarus" />
  8.      <meta name="description" content="Tytuł strony" />
  9.      <meta name="keywords" content="Słowa kluczowe" />
  10.      <meta name="copyright" content="Copyright" />
  11.      <link rel="shortcut icon" href="favicon.ico" />
  12.      <link rel="stylesheet" type="text/css" href="style.css" />
  13.      <title>Untitled</title>
  14. </head>
  15.  
  16. <body>
  17. <?php
  18. include ('db_connect.inc.php');
  19. if(!isset($_SESSION['zalogowany'])) {
  20.  
  21.  
  22. if(isset($_POST['login']) && !empty ($_POST['login']) && isset($_POST['password']) && !empty ($_POST['password'])) {
  23.   $login_post = strip_tags($_POST['login']);
  24.   $pass_post = strip_tags($_POST['password']);
  25.   $dane = @mysql_query("SELECT * FROM users WHERE login='$login_post'");
  26.  if (!$dane) {
  27.    exit('Bład podczas wykonywania zapytania: ' . mysql_error() . '.');
  28.  } else {
  29.    while ($row = mysql_fetch_array($dane)) {
  30.    $v_password = $row['password'];
  31.  }
  32. }
  33.  if($pass_post == $v_password) {
  34.    $_SESSION["zalogowany"] = true;
  35.    echo 'Zalogowany! <a href="main.php">Strona główna</a>';
  36.  } else {
  37.    echo 'Złe hasło!';
  38.  }
  39. } else {
  40.   echo '<form action="login.php" method="post">
  41. <table border="0">
  42. <tr>
  43.  <td>Login:</td>
  44.  <td><input type="text" name="login" maxlength="12"/></td>
  45. </tr>
  46. <tr>
  47.  <td>Hasło:</td>
  48.  <td><input type="password" name="password" maxlength="12"/></td>
  49. </tr>
  50. </table>
  51. <input type="submit" value="Zaloguj!" />
  52. </form>';
  53. }
  54. } else {
  55.  echo 'Już jesteś zalogowany.<a href="main.php">Strona główna</a>';
  56. }
  57. ?>
  58. </body>
  59. </html>

main.php
  1. <?php session_start(); ?>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  4. <head>
  5.      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  6.      <meta name="robots" content="index" />
  7.      <meta name="Author" content="Strarus" />
  8.      <meta name="description" content="Tytuł strony" />
  9.      <meta name="keywords" content="Słowa kluczowe" />
  10.      <meta name="copyright" content="Copyright" />
  11.      <link rel="shortcut icon" href="favicon.ico" />
  12.      <link rel="stylesheet" type="text/css" href="style.css" />
  13.      <title>Untitled</title>
  14. </head>
  15. <body>
  16. <?
  17.  
  18.  if(isset($_SESSION['zalogowany'])) {
  19. echo 'Strona gdy jestem zalogowany. <a href="logout.php">Wyloguj!</a>';
  20. } else {
  21.  echo 'Strona gdy <b>nie</b> jestem zalogowany';
  22. }
  23. ?>
  24. </body>
  25. </html>

logout.php
  1. <?php session_start(); ?>
  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
  4. <head>
  5.      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />
  6.      <meta name="robots" content="index" />
  7.      <meta name="Author" content="Strarus" />
  8.      <meta name="description" content="Tytuł strony" />
  9.      <meta name="keywords" content="Słowa kluczowe" />
  10.      <meta name="copyright" content="Copyright" />
  11.      <link rel="shortcut icon" href="favicon.ico" />
  12.      <link rel="stylesheet" type="text/css" href="style.css" />
  13.      <title>Untitled</title>
  14. </head>
  15. <body>
  16. <?
  17.  
  18.  if(isset($_SESSION['zalogowany'])) {
  19. unset($_SESSION['zalogowany']);
  20. echo 'Do zobaczenia! <a href="login.php">Zaloguj ponownie!</a>';
  21. } else {
  22.  echo '<a href="login.php">Zaloguj!</a>';
  23. }
  24. ?>
  25. </body>
  26. </html>

I jeszcze plik db_connect.inc.php ale jego chyba nie trzeba winksmiley.jpg
Go to the top of the page
+Quote Post
Mlodycompany
post 6.01.2009, 18:51:56
Post #8





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Proponuje Ci zrobić takie zapytanie

  1. SELECT * FROM `users` WHERE `login` = '".$login."' AND `haslo` = '".$haslo."'


To zapytanie sprawdza czy w bazie jest rekord gdzie login = login a haslo = haslo i zwraca rekord. Możesz sobie zabezpieczyć dodatkowo przed atakiem dodając: 

  1. <?php
  2. $query = mysql_query(zapytanie w/w);
  3.  
  4. $row = mysql_fetch_row($query);
  5.  
  6. if($row['login'] == $login AND $row['haslo'] == $haslo){
  7.  
  8. $zalogowany = true;
  9.  
  10. }
  11. ?>


i przy zmianie nazwy zmiennych posta dodać funkcję jeszcze addslashes();



Jak na mój gust logowanie będzie dosyć bezpieczne i funkcjonalne. Ja tak robię zawsze i działa wszystko biggrin.gif
Go to the top of the page
+Quote Post
Strarus
post 6.01.2009, 19:05:06
Post #9





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


Dzięki wielkie smile.gif A na jaki typ ataku był podatny mój skrypt? W jaki sposób można było przeprowadzić atak? Sprawdzałem tylko
Kod
'or 1=1
i % ale nie działały.
Go to the top of the page
+Quote Post
Mlodycompany
post 6.01.2009, 19:13:32
Post #10





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


na SQL inject. % działają jeżeli w zapytaniu mamy LIKE. Jest to stosowane do wyszukiwarek. A i jeszcze jedno. Koduj sobie hasła w md5(); Jest mniejsze ryzyko włamania się na czyjeś konto.
Go to the top of the page
+Quote Post
Strarus
post 6.01.2009, 19:22:46
Post #11





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


Nadal nie działa haha.gif
  1. <?php
  2. if(isset($_POST['login']) && !empty ($_POST['login']) && isset($_POST['password']) && !empty ($_POST['password'])) {
  3. $login_post = addslashes(strip_tags($_POST['login']));
  4. $pass_post = addslashes(strip_tags($_POST['password']));
  5. $dane = mysql_query("select * from `users` where `login` = '" . $login_post . "' and `password` = '" . $pass_post . "'");
  6. $row = mysql_fetch_row($dane);
  7. if($row['login'] == $login_post AND $row['password'] == $pass_post) {
  8. $_SESSION["zalogowany"] = true;
  9.    echo 'Zalogowany! <a href="main.php">Strona główna</a>';
  10. } else {
  11.    echo 'Złe hasło!';
  12.  }
  13. ?>
. Jak wpisuje poprawne dane to i tak pokazuje złe hasło...I jeszcze pytanie: czy mogę dać w sesji np. $_SESSION["zalogowany"] = $row['login']; aby móc potem weryfikować z sesji nazwę użytkownika przy zmianie hasła?

Ten post edytował Strarus 6.01.2009, 19:39:41
Go to the top of the page
+Quote Post
Mlodycompany
post 6.01.2009, 20:12:04
Post #12





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Usuń spację w `login` = '".$login."'

Daj pod $row = mysql_fetch_row($dane); print_r($row); i daj to co ci wyprintuje

Możesz tak zrobić, ale lepiej będzie jak zrobisz $_SESSION['login'] = $login; oprócz $_SESSION['zalogowany'] = true;
Go to the top of the page
+Quote Post
Strarus
post 7.01.2009, 08:23:22
Post #13





Grupa: Zarejestrowani
Postów: 339
Pomógł: 12
Dołączył: 22.11.2008

Ostrzeżenie: (20%)
X----


daje mi wtedy
Kod
Array (     [0] => test     [1] => pass ) Złe hasło!
... I nadal nie działa... może powrócę do starej wersji?? winksmiley.jpg
Go to the top of the page
+Quote Post
Mlodycompany
post 7.01.2009, 16:31:48
Post #14





Grupa: Zarejestrowani
Postów: 910
Pomógł: 44
Dołączył: 20.02.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


wyprintuj taki sposobem tablice $_POST i porównaj dane.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 05:25