Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Prośba o sprawdzenie bezpieczeństwa logowania
kaznodzieja
post
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


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);
Go to the top of the page
+Quote Post
gothye
post
Post #2





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


zamiast mysql_escape_string skorzystaj mysql_real_escape_string
załóż klucze w tabeli SQL na login i passwd
Go to the top of the page
+Quote Post
kaznodzieja
post
Post #3





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


chodzi o Primary Key?
Go to the top of the page
+Quote Post
gothye
post
Post #4





Grupa: Zarejestrowani
Postów: 702
Pomógł: 65
Dołączył: 16.03.2009

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


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
Go to the top of the page
+Quote Post
kaznodzieja
post
Post #5





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


no dobra dzięki, już prowadzam zmiany! A może jakieś inne uwagi na temat samego bezpieczeństwa
Go to the top of the page
+Quote Post
Niktoś
post
Post #6





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

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


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.

Ten post edytował Niktoś 5.03.2012, 10:35:14
Go to the top of the page
+Quote Post
kaznodzieja
post
Post #7





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


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.
Go to the top of the page
+Quote Post
Niktoś
post
Post #8





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

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


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.

Ten post edytował Niktoś 5.03.2012, 10:48:55
Go to the top of the page
+Quote Post
kaznodzieja
post
Post #9





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


ok, dzięki za informacje. Popołudniu naniosę poprawki.
Go to the top of the page
+Quote Post
Niktoś
post
Post #10





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

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


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.

Ten post edytował Niktoś 5.03.2012, 11:04:00
Go to the top of the page
+Quote Post
kaznodzieja
post
Post #11





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


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?
Go to the top of the page
+Quote Post
Niktoś
post
Post #12





Grupa: Zarejestrowani
Postów: 1 195
Pomógł: 109
Dołączył: 3.11.2011

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


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.

Ten post edytował Niktoś 5.03.2012, 11:24:42
Go to the top of the page
+Quote Post
kaznodzieja
post
Post #13





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 28.01.2007

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


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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 3.10.2025 - 15:35