Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pro¶ba o sprawdzenie bezpieczeństwa logowania
Forum PHP.pl > Forum > Przedszkole
kaznodzieja
Witam!
Mam pro¶bę o sprawdzenie bezpieczeństwa skryptu logowania z różnymi uprawnieniami, wszelkie uwagi sugestie mile widziane. Dodatkowo prosiłbym o jaki¶ pomysł na zabezpieczenie pliku baza.php
Login w przykładzie asd@asd.pl hasło admin.

Pliki do pobrania z http://vlaho.pl/test.7z

plik: logowanie.php
  1. <?php
  2. include ("baza.php");
  3.  
  4. $akcja = $_REQUEST['akcja'];
  5.  
  6.  
  7. switch($akcja) {
  8.  
  9.  
  10.  
  11.  
  12. // --------------------------------default------------------------------------
  13.  
  14. default:
  15. if (isset($_SESSION['prawa']) and isset($_SESSION['login']) and isset($_SESSION['password'])){
  16.  
  17. echo "<br /><center>Jestes zalogowany jako: <br /> <a href=logowanie.php?akcja=przerzut target='_parent'>".$_SESSION['login']."</a><br /><a href=logowanie.php?akcja=przerzut&login=logout target='_parent'>Wyloguj</a></center>";
  18. }else{
  19.  
  20. echo'<form action="logowanie.php?akcja=logowanie" target="_parent" method="post">
  21. <table width="25%" border="0" align="center">
  22. <tr>
  23. <td><div class="text2">Login:</div></td>
  24. <td><input type="text" name="login" size="15" /></td>
  25. </tr>
  26. <tr>
  27. <td><div class="text2">Haslo:</div></td>
  28. <td><input type="password" name="password" size="15"/></td>
  29. </tr>
  30. <tr>
  31. <td></td>
  32. <td><input type="submit" name="submit" value="Zaloguj" /></td>
  33. </tr>
  34. </table>
  35. </form>';
  36. }
  37.  
  38.  
  39. break;
  40.  
  41. //---------------------SPRAWDZENIE JAKIE MASZ PRAWA----------------------------
  42. case "przerzut":
  43.  
  44. if($_GET['login']<>"logout"){
  45.  
  46. if (isset($_SESSION['login']) and isset($_SESSION['password']) and isset($_SESSION['losowy_kod'])){
  47.  
  48. $login=$_SESSION['login'];
  49. $pass=$_SESSION['password'];
  50.  
  51. $wyk = mysql_query('SELECT login, password, prawa, stan FROM '.$prefiks.'admins WHERE email=\''.$login.'\' AND password=\''.$pass.'\'');
  52. $ile = mysql_num_rows($wyk);
  53. if ($ile>0){
  54. $w = mysql_fetch_array($wyk);
  55. $prawa=$w['prawa'];
  56. $stan=$w['stan'];
  57. if ($stan==0){
  58. if ($prawa==1){
  59. //header("Location: logowanie.php?akcja=panel_a");
  60. echo "panel administratora";
  61. }
  62. if ($prawa==2){
  63. // header("Location: logowanie.php?akcja=panel_u");
  64. echo "panel uzytkownika";
  65. }
  66. }else{
  67. header("Location: index.php");
  68. }
  69.  
  70. }else{
  71. header("Location: index.php");
  72. }
  73. }else{
  74. // cosik();
  75. header("Location: index.php");
  76. }
  77. }else{
  78. header("Location: index.php");
  79. }
  80.  
  81.  
  82. break;
  83.  
  84. // --------------------------------LOGOWANIE------------------------------------
  85.  
  86. case "logowanie":
  87. //session_start();
  88.  
  89.  
  90. include_once('baza.php');
  91.  
  92. if ( $_POST['login'] && $_POST['password'] ){
  93. $login=mysql_escape_string(strip_tags($_POST['login']));
  94. $pass=mysql_escape_string(strip_tags($_POST['password']));
  95.  
  96. $wyk = mysql_query('SELECT * FROM '.$prefiks.'admins WHERE email=\''.$login.'\'');
  97. $ile = mysql_num_rows($wyk);
  98. if ($ile>0){
  99.  
  100. $wyk = mysql_query('SELECT * FROM '.$prefiks.'admins WHERE email=\''.$login.'\' AND password=\''.md5($pass).'\'');
  101. $ile = mysql_num_rows($wyk);
  102. if ($ile>0){
  103. $w = mysql_fetch_array($wyk);
  104. $prawa=$w['prawa'];
  105. $stan=$w['stan'];
  106. $ost_log=$w['ost_log_tmp'];
  107. $id_uzyt=$w['id'];
  108. if ($stan==0){
  109. $_SESSION['login'] = $_POST['login'];
  110. $_SESSION['password'] = md5($_POST['password']);
  111. $_SESSION['prawa']= $prawa;
  112. $_SESSION['losowy_kod']='k3Dc6a^s';
  113. $ost_log_tmp=date("Y-m-d G:i:s",time());
  114. $_SESSION['ost_log']=$ost_log;
  115. mysql_query("UPDATE ".$prefiks."admins SET ost_log = '$ost_log', ost_log_tmp='$ost_log_tmp' WHERE id ='$id_uzyt';");
  116. if($prawa==1 or $prawa==2){
  117. if ($prawa==1){
  118. // header("Location: logowanie.php?akcja=panel_a");
  119. echo "panel administratora";
  120. }
  121. if ($prawa==2){
  122. // header("Location: logowanie.php?akcja=panel_u");
  123. echo "panel uzytkownika";
  124. }
  125.  
  126. }else{
  127. echo"nie posiada odpowiednich uprawnien";
  128. }
  129.  
  130. }else{
  131. echo"uzytkownik został zablokwany";
  132. }
  133. }else{
  134. echo"Nie prawidłowy login lub hasło";
  135. }
  136. }else{
  137. echo"Uzytkownik nie istnieje";
  138. }
  139. }else{
  140. echo"Uzupelnij pola formularza";
  141. }
  142.  
  143. break;
  144.  
  145.  
  146. // -------------------------ŁADOWANIE PANELU ADMINISTRATORA----------------------
  147. case "panel_a":
  148.  
  149. if (isset($_SESSION['login']) and isset($_SESSION['password']) and isset($_SESSION['losowy_kod'])){
  150.  
  151. $login=$_SESSION['login'];
  152. $pass=$_SESSION['password'];
  153.  
  154. $wyk = mysql_query('SELECT login, password, prawa, stan FROM '.$prefiks.'admins WHERE email=\''.$login.'\' AND password=\''.$pass.'\'');
  155. $ile = mysql_num_rows($wyk);
  156. if ($ile>0){
  157. $w = mysql_fetch_array($wyk);
  158. $prawa=$w['prawa'];
  159. $stan=$w['stan'];
  160. if ($stan==0){
  161. if ($prawa==1){
  162. echo "panel administratora";
  163. }
  164. }else{
  165. header("Location: index.php");
  166. }
  167.  
  168. }else{
  169. header("Location: index.php");
  170. }
  171.  
  172. // cosik();
  173. header("Location: index.php");
  174. }
  175.  
  176.  
  177. break;
  178.  
  179.  
  180. }?>


plik: baza.php
  1. <?
  2. $host = "localhost";
  3. $user = "root";
  4. $pass = "";
  5. $base = "test";
  6. $prefiks="sb_";
  7. $link_mysql=mysql_connect($host, $user, $pass) or die('Nie można nawiązać połączenia z MySQL-em');
  8. mysql_selectdb($base) or die ('Nie można nawiązać połączenia z bazą danych');
  9.  
  10. ?>


  1. CREATE TABLE IF NOT EXISTS `sb_admins` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  4. `login` varchar(255) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  5. `password` varchar(32) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  6. `imie` varchar(15) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  7. `nazwisko` varchar(20) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  8. `kod` varchar(6) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  9. `email` varchar(255) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL DEFAULT '',
  10. `prawa` int(1) NOT NULL DEFAULT '0',
  11. `urodz` date NOT NULL,
  12. `stan` int(1) NOT NULL,
  13. `ost_log` datetime NOT NULL,
  14. `ost_log_tmp` datetime NOT NULL,
  15. `reg` int(1) NOT NULL,
  16. PRIMARY KEY (`id`)
  17. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=49 ;
  18.  
  19.  
  20. INSERT INTO `sb_admins` (`id`, `date`, `login`, `password`, `imie`, `nazwisko`, `kod`, `email`, `prawa`, `urodz`, `stan`, `ost_log`, `ost_log_tmp`, `reg`) VALUES
  21. (1, '2006-11-20 00:18:36', 'asd@asd.pl', '21232f297a57a5a743894a0e4a801fc3', 'Jan', 'Kowalski', '', 'asd@asd.pl', 2, '1980-01-01', 0, '2012-02-28 18:18:25', '2012-02-28 19:11:03', 0);
gothye
zamiast mysql_escape_string skorzystaj mysql_real_escape_string
załóż klucze w tabeli SQL na login i passwd
kaznodzieja
chodzi o Primary Key?
gothye
lepiej INDEX
po za tym klucze na polach VARCHAR to zło ,dlatego stosuje się konwersje string => int aby przyspieszyć wyszukiwanie po indwidualnych stringach w tabeli ,
swoj± drog± ,patrz±c na ten kod można go bardziej upro¶cić ,po co 2 razy sprawdzać mail w tabeli admins ? jak można raz ,razem z hasłem
kaznodzieja
no dobra dzięki, już prowadzam zmiany! A może jakie¶ inne uwagi na temat samego bezpieczeństwa
Nikto¶
Na pewno nie jest bezpieczne przechowywać hasła i kody w sesjach.Ja bym radził zapisywać id w sesji i odwoływać się po nim do pola z hasłem lub aktualnym kodem w twojej bazie danych.
kaznodzieja
Rozumiem że id użytkownika? Dzięki za uwagę. My¶lałem że skoro hasło jest w md5 to jest w miarę bezpieczne, oczywi¶cie je¶li mowa o normalnych hasłach a nie jaki¶ banalnych.
Nikto¶
W md5 bezpieczne??Raczej nie powiedziałbym.Ja bym raczej użył sha1+sol lub sha2.Jak już powiedziałem nie należy przechowywać ważnych danych w sesjach,co najwyżej id lub ewentualnie login usera.
kaznodzieja
ok, dzięki za informacje. Popołudniu naniosę poprawki.
Nikto¶
Odno¶nie bezpieczeń¶twa ,a gdzie masz walidacje pól formularza? Zabezpiecz zapytania SQL przed sql injection.Przydało by się jak±¶ recaptche zaimplikować na formularze rejestracji jak to ma być super bezpieczne.Nie chciałby¶ aby jaki¶ bot napierniczał ci ¶miecie do bazy danych.Troszeczkę roboty jeszcze Ciebie czeka.
kaznodzieja
Mam walidacje loginu czyli e-maila zrobiona w jQuery plugin Validation oraz antyspam za pomoc± SBLAM.

mam co¶ takiego dodane po uwagach gothye
$login=mysql_real_escape_string(strip_tags($_POST['login']));
$pass=mysql_real_escape_string(strip_tags($_POST['password']));
Muszę jeszcze w paru miejscach zmamienić $_POST['login'] na $login po filtracji

A jaki sposób można się jeszcze zabezpieczyć przed sql injection?
Nikto¶
Czyli masz walidacje po stronie klienta , a gdzie walidacja po stronie serwera.Ta walidacja będzie pięknie ładnie działać z wł±czon± obsług± js ,a co je¶li kto¶ to wył±czy w opcjach swojej przegl±darki-wtedy będzie sobie mógł wpisać w pola formularza wszystko co będzie chciał wł±cznie z metodami ataku xss.Zrób walidacje także po stronie serwera używaj±c wyrażeń regularnych.
kaznodzieja
Dzięki za odpowiedzi i podpowiedzi. Mam jeszcze jedno pytanie. W jaki sposób najlepiej przechowywać dane do logowanie do bazy danych? np plik baza.php w którym mam zapisany login,hasło, nazwę bazy i konektor(mysql_connect) zabezpieczony sposobem z atrykułu
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.