Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Problem z wyświetlaniem komunikatu o złych danych
Forum PHP.pl > Forum > Przedszkole
Flapper
Ten kod powinien w wypadku wpisania złego hasła wyświetlić nad formularzem "Podano złe dane!!!" Ale nie wyświetla absolutnie nic. Przy podaniu dobrego loginu i hasła jedynie loguje. Co jest nie tak? sad.gif
  1. <?php ob_start(); ?>
  2. <?php
  3. session_register("zalogowany");
  4.  
  5. if(empty($_SESSION["zalogowany"]))$_SESSION["zalogowany"]=0;
  6.  
  7. require "connection.php";
  8. connection();
  9.  
  10. function ShowLogin($komunikat=""){
  11. if($_SESSION["zalogowany"] == 0)
  12. {
  13. echo "$komunikat<br>";
  14. echo "<form action='index.php' method=post>";
  15. echo "Login: <input type=text name=login><br>";
  16. echo "Hasło: <input type=text name=haslo><br>";
  17. echo "<input type=submit value='Zaloguj!'>";
  18. echo "</form>";
  19. echo "Jeśli nie jesteś zarejestrowany, <a href='index.php?site=register'>zarejestruj się tutaj.</a>";
  20. }
  21. else
  22. { 
  23. $id_gracza = $_SESSION["zalogowany"];
  24. $imie = mysql_query("SELECT name from `char` where ID LIKE '$id_gracza'");
  25. echo "Zalogowany jako $id_gracza";
  26. echo "<a href='index.php?wyloguj=tak'>wyloguj się</a>";
  27. }
  28. }
  29.  
  30. ?>
  31. <html>
  32. <head>
  33. <title>Olimpus MMORPG</title>
  34. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
  35. <link rel="Stylesheet" type="text/css" href="style.css" />
  36. </head>
  37. <body>
  38. <center>
  39. <div id="top">
  40. <div id="NAGLOWEK">
  41. <img src='left.jpg'><img src='banner.jpg'><img src='right.jpg'>
  42. </div>
  43. <div id="top2">
  44. <div id="LOGIN">
  45. <?
  46. if($_GET["wyloguj"]=="tak")
  47. {
  48. $_SESSION["zalogowany"]=0;echo "Zostałeś wylogowany z serwisu";
  49. }
  50. if(!empty($_POST["login"]) && !empty($_POST["haslo"]))
  51. {
  52. $loginn = $_POST['login'];
  53. $hasloo = $_POST['haslo'];
  54. $hasloo2 = md5($hasloo);
  55. if(mysql_query("SELECT * from `char` where name = '$loginn' AND pass = '$hasloo2'") == TRUE)
  56. {
  57. echo "Zalogowano poprawnie. <a href='index.php'>PrzejdĽ na stronę główną</a>";
  58.  
  59. $wynik = mysql_query("SELECT * FROM `char` WHERE name = '$loginn'");
  60.  
  61. while($wynik and $pola = mysql_fetch_array($wynik))
  62. {
  63. $_SESSION["zalogowany"]=$pola["ID"];
  64. }
  65. }
  66. else ShowLogin("Podano złe dane!!!");
  67. }
  68. else ShowLogin();
  69. ?>
  70. </div>
  71. <div id="MENU">
  72. <a href='index.php'>-Strona główna</a>
  73. </div>
  74. <div id="TRESC">
  75. <pre><?php
  76. if($_GET[site] != '')
  77. {
  78. include(''.$_GET[site].'.htm');
  79. }
  80. else
  81. {
  82. header("location: index.php?site=main");
  83. }
  84. ?>
  85. </div>
  86. </div>
  87. <div id="STOPKA">
  88. <?
  89. include('Stopka.txt');
  90. ?>
  91. </div>
  92. </div>
  93. </center>
  94. </body>
  95. </html>
ocochodzi
Stosuj wcięcia. Newralgiczny kawalek kodu masz nieczytelnie sformatowany.

Sprawdzanie poprawności sprawdziłeś do sprawdzenia czy zmienne w $_POST są ustawione czy nie. Zatem wpisanie nieistniejacego loginu i hasła nie pociągnie wykonania linii 67. Co gorsza, mozna jako dane wpisać typowe złosliwości typu SQL injection:

loginn: a' OR name <> ' aaevil.gif
hasloo2: a' OR pass <> ' aaevil.gif

wtedy PHP mając

"SELECT * from `char` where name = '$loginn' AND pass = '$hasloo2'"

złoży zapytanie:

SELECT * from `char` where name = 'a' OR name <> '' AND pass = 'a' OR pass <> ''

AND ma wyższy priorytet niz OR, wiec wyrazenie logiczne obliczy się jakby były nawiasy:
a OR b AND c OR d jest tożsame z a OR (b AND c) OR d
Zdanie d w naszym zapytaniu jest zawsze prawdziwe, wiec całe wyrazenie logiczne bedzie prawdzwe dla kazdego rekordu. Sprowadza się zatem do żadania pokazania uzytkownikow z loginem a lub niepustym haslem. Zasadniczo wszytkich, choć w zamysłe pewnie miało zwrócić tego jednego jedynego.

A co jeśli nie ma ataku SQL injection tylko nieistniejace login i hasło (czyli sytuacja o jaką pytałeś)? System zaloguje a funkcja ShowLogin w wierszu 25 nie znajdzie odpowiedniego rekordu. Poza tym mała uwaga wydajnościowa. Jesli już masz wiersz z danymi, to go nie puszczaj tak łatwo. Ten drugi SELECT jest niepotrzebny.
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.