Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Bezpieczeństwo tego skryptu
Forum PHP.pl > Forum > Przedszkole
julek12
Witam,
Mam pytanie czy skrypt jest w miarę bezpieczny? To moja pierwsza przygoda z sessions więc się pytam oto skrypt:

  1. <?php
  2. header('Content-Type: text/html; charset="utf-8"');
  3. ?>
  4. <<?php ?>?xml version="1.0" encoding="utf-8"?<?php ?>>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  6. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
  7. <head>
  8. <meta http-equiv="Content-Language" content="pl" />
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  10. <meta http-equiv="Reply-To" content="julek12@tibiaserv.pl" />
  11. <title>TibiaServ.PL - Sonda</title>
  12. <meta name="verify-v1" content="OzJlYgcY2J+e78CLZ67a5VBn3nupIh+B0BCyp5crrSg=" />
  13. <meta name="keywords" content="tibia, ots, open tibia server, otserv, lua, xml, server, otfans, iots, acc maker, skrypty, php, silniki, mapy, klienty, cheaty, tutoriale, otmapeditor, lista serwerow, forum" />
  14. <meta name="description" content="Polski Support Open Tibia Serwer (OTS). Forum, download, skrypty, tutoriale, lista OTS, otserv, iots, otfans, otsy, silniki, mapy" />
  15. <meta name="Robots" content="all, index, follow" />
  16. <meta name="Author" content="Juliusz Marciniak" />
  17. </head>
  18. <body>
  19. <form method='post' action='login.php'>
  20. <b>Nazwa użytkownika:</b> <input type='text' name='nick'><br />
  21. <b>Hasło:</b> <input type='password' name='password'><br />
  22. <input type='submit' value='Wyślij' name='submit'>
  23. </form>
  24. <?php
  25. try
  26. {
  27. $nick = trim(strip_tags($_POST['nick']));
  28. $password = md5(md5(trim(strip_tags($_POST['password']))));
  29.  
  30. if(isset($_SESSION['login']))
  31. {
  32. echo "Witaj, ".$_SESSION['nick'];
  33. }
  34. else
  35. {
  36. if (isset($_POST['submit']))
  37. {
  38. $pdo = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  39. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  40. $sql = $pdo->prepare('SELECT `nick`, `password` FROM `admins` WHERE `nick` = :nick AND `password` = :password');
  41. $sql->bindValue(':nick', $nick, PDO::PARAM_STR);
  42. $sql->bindValue(':password', $password, PDO::PARAM_STR);
  43. $sql->execute();
  44. $dane = $sql->fetch();
  45. if ($dane)
  46. {
  47. $_SESSION['login'] = true;
  48. $_SESSION['nick'] = $nick;
  49. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  50. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
  51. {
  52. die('Proba przejecia sesji udaremniona!');
  53. }
  54. echo 'Zostałeś zalogowany.';
  55. }
  56. else
  57. {
  58. echo "Złe hasło lub login, proszę spróbować ponownie";
  59. }
  60. }
  61. }
  62. }
  63. catch(Exception $e)
  64. {
  65. echo $e->getMessage();
  66. }
  67. ?>
  68. </body>
  69. </html>
erix
A czy Waść czytał przyklejone wątki? Audyt, to normalna usługa.
julek12
Czytałem ale o sesjach nie znalazłem mógłbyś pokazać palcem?
Fifi209
  1. $dane = $sql->fetch();
  2. if ($dane)


Ja bym dał:
  1.  
  2. if ($sql->rowCount() == 1) {
  3.  
  4. }


To:
  1. $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
  2. if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
  3. {
  4. die('Proba przejecia sesji udaremniona!');
  5. }


Jest bez sensu...
Mogłeś równie dobrze napisać:
  1. if (true !== true) {
  2. // warunek nigdy nie spełniony
  3. }


Mam nadzieję, że rozumiesz.

P.S. PDO nie ma własnych wyjątków?
PDOException
julek12
to wziąłem stąd http://forum.php.pl/index.php?showtopic=30...mp;#entry455375

A tak poza tym skrypt bezpieczny?

A jak robię throw new Exception('') to mi te wyjątki z PDO chyba nie zadziałają czy się mylę?
Fifi209
Nie, bo PDO wyrzuci Ci wyjątek kiedyś, że nie może połączyć się z bazą, jak go nie złapiesz to ktoś będzie miał Twoje dane do serwera mysql.

  1. $password = md5(md5(trim(strip_tags($_POST['password']))));

Wystarczy:
  1. $password = md5($_POST['password']);


Double md5 nie ma sensu, było o tym na forum. Poza tym lepiej używać sha1.

A przed kradzieżą sesji ten skrypt Cię nie zabezpiecza. winksmiley.jpg
nospor
Cytat
to wziąłem stąd
Przeciez wziales tylko czesc stamtad i powycianales losowo pare linijek i myslisz ze bedzie to samo blinksmiley.gif przeciez tą wycinka zmieniles zupelnie zasade dzialania tamtego kodu.
julek12
a co zrobić żeby zabezpieczał?
nospor
musisz poprawnie skopiowac tamten kod, z ktorego wyciales wiekszosc linijek tongue.gif
Fifi209
Cytat(julek12 @ 19.08.2009, 12:05:04 ) *
a co zrobić żeby zabezpieczał?

Wstawić kod, który zabrałeś z innego tematu w odpowiednim miejscu.
(Czyli wszędzie gdzie trzeba być zalogowanym, ale nie w skrypcie obsługującym logowanie)
julek12
Ok a to gdzie wstawić?
session_regenerate_id();
Fifi209
Cytat(julek12 @ 19.08.2009, 12:10:11 ) *
Ok a to gdzie wstawić?
session_regenerate_id();

Napisałem Ci dokładnie gdzie masz to wstawić. (razem z resztą obcego kodu)

WSZĘDZIE GDZIE SKRYPT WYMAGA LOGOWANIA...ale nie podczas logowania
julek12
ok rozumiem Cię, a reszta kodu jest już ok?
Fifi209
Jest prawie ok...
Wyjątki musisz łapać od PDOException jak już pisałem...

Przerób skrypt i wstaw cały.
julek12
Nie wiem czy działa bo mi coś się z serwerem stało, ale wyszło mi tak:

  1. <?php
  2. header('Content-Type: text/html; charset="utf-8"');
  3. ?>
  4. <<?php ?>?xml version="1.0" encoding="utf-8"?<?php ?>>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  6. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
  7. <head>
  8. <meta http-equiv="Content-Language" content="pl" />
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  10. <meta http-equiv="Reply-To" content="julek12@tibiaserv.pl" />
  11. <title>TibiaServ.PL - Sonda</title>
  12. <meta name="verify-v1" content="OzJlYgcY2J+e78CLZ67a5VBn3nupIh+B0BCyp5crrSg=" />
  13. <meta name="keywords" content="tibia, ots, open tibia server, otserv, lua, xml, server, otfans, iots, acc maker, skrypty, php, silniki, mapy, klienty, cheaty, tutoriale, otmapeditor, lista serwerow, forum" />
  14. <meta name="description" content="Polski Support Open Tibia Serwer (OTS). Forum, download, skrypty, tutoriale, lista OTS, otserv, iots, otfans, otsy, silniki, mapy" />
  15. <meta name="Robots" content="all, index, follow" />
  16. <meta name="Author" content="Juliusz Marciniak" />
  17. </head>
  18. <body>
  19. <form method='post' action='login.php'>
  20. <b>Nazwa użytkownika:</b> <input type='text' name='nick'><br />
  21. <b>Hasło:</b> <input type='password' name='password'><br />
  22. <input type='submit' value='Wyślij' name='submit'>
  23. </form>
  24. <?php
  25. try
  26. {
  27. $nick = trim(strip_tags($_POST['nick']));
  28. $password = sha1($_POST['password'].'Ds.dAjsD3jnM32dkja343n');
  29.  
  30. if(isset($_SESSION['login']))
  31. {
  32. echo "Witaj, ".$_SESSION['nick'];
  33. }
  34. else
  35. {
  36. if (isset($_POST['submit']))
  37. {
  38. $pdo = new PDO('mysql:host=localhost;dbname=xxxx', 'xxxx', 'xxxxxxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  39. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  40. $sql = $pdo->prepare('SELECT `nick`, `password` FROM `admins` WHERE `nick` = :nick AND `password` = :password');
  41. $sql->bindValue(':nick', $nick, PDO::PARAM_STR);
  42. $sql->bindValue(':password', $password, PDO::PARAM_STR);
  43. $sql->execute();
  44. if ($sql->rowCount() == 1)
  45. {
  46. $_SESSION['login'] = true;
  47. $_SESSION['nick'] = $nick;
  48. echo 'Zostałeś zalogowany.';
  49. }
  50. else
  51. {
  52. echo "Złe hasło lub login, proszę spróbować ponownie";
  53. }
  54. }
  55. }
  56. }
  57. catch(PDOException $e)
  58. {
  59. echo 'Połączenie nie mogło zostać utworzone: '.$e->getMessage();
  60. }
  61. ?>
  62. </body>
  63. </html>
Fifi209
Powinno działać tylko czy przy rejestracji też masz tą sól:
  1. $password = sha1($_POST['password'].'Ds.dAjsD3jnM32dkja343n');

?
julek12
To jest logowanie tylko do konta admina:) rejestracji nie mam konto sobie robię w PMA. Piszę skrypt na sondę i logowanie do panelu admina musiałem zrobić, a z sesjami pierwszy kontakt. I tak offtop jak zrobić procenty czyli mam ileś głosów i jaki jest procent na daną odpowiedź ja wymyśliłem tak:
wszystkie_odpowiedzi / odpowiedzi_danej_opcji
100 / wynik
nospor
Cytat
I tak offtop jak zrobić procenty czyli mam ileś głosów i jaki jest procent na daną odpowiedź ja wymyśliłem tak:
wszystkie_odpowiedzi / odpowiedzi_danej_opcji
100 / wynik

Ale tu nie ma co wymyslac, to jest podstawa matematyki:
(ilosc/ilosc_wszystkich)*100
Fifi209
Zawsze wyliczasz z proporcji:

Wszystko - 100%
Coś - x%

coś * 100 / wszystko

I tym sposobem obliczysz ile % ze wszystkiego jest coś.

haha.gif
julek12
Aha dzięki:P
Kiedyś miałem to na matmie ale nie pamiętałem haha.gif

O ja zapomniałem o proporcji chyba dlatego, że wakacje są i nie pamiętam o szkole :|
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.