Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php+mysql] sonda do sprawdzenia
Forum PHP.pl > Inne > Oceny
rooki
Chciałbym prosić o sprawdzenie sondy, którą napisałem pod względem poprawności gdyż jeśli idzie o PHP to jestem początkujący. Moim zamiarem było, żeby przy zmianie opcji / dodaniu lub usunięciu opcji tylko minimalnie zmodyfikować kod - czyli u mnie przy zmianie opcji nalezy zmodyfikować tabelę w bazie danych, kod html odpowiedzialny za wyświetlenie formularza oraz kod PHP ten: "$tekst_odp[0]="tak"; $tekst_odp[1]="nie"; " - to wszystko.

  1. <?php
  2. //MAMY TABELĘ "GLOSOWANIE1" Z POLAMI: ID(KLUCZ PODSTAWOWY, AUTOINKREMENTACJA); TAK; NIE.
  3.  
  4. if(isset($_POST['button'])) //jeśli naciśnięto na "button"
  5. {
  6.  
  7. setcookie("sonda", "2", time()+20); //posyłamy ciastko ważne 20 sekund
  8.  
  9. $opcja=$_POST["opcja"]; 
  10.  
  11.  $uchwyt_polaczenia = mysql_connect("localhost", "xxxx", "xxxxxxx") or die ("Nie można połączyć się z MySQL");
  12.  mysql_select_db ("xxxxxx") or die ("Nie można połączyć się z bazą.");
  13.  $wynik=mysql_query("SELECT * FROM glosowanie1 WHERE id=1;");
  14.  
  15.  
  16. $rekord = mysql_fetch_assoc ($wynik);
  17. $liczba=$rekord["$opcja"];
  18.  
  19. $liczba++;
  20.  
  21.  
  22. mysql_query("UPDATE glosowanie1 SET $opcja=$liczba WHERE id=1;");
  23. mysql_close($uchwyt_polaczenia);
  24.  
  25.  
  26.  
  27. header("Location: sonda.php"); 
  28. exit; 
  29. }
  30.  
  31.  
  32.  
  33. elseif(isset($_POST['button2'])||$_COOKIE['sonda']=="2")
  34. {
  35. $tekst_odp[0]="tak";
  36. $tekst_odp[1]="nie";
  37.  
  38.  
  39.  
  40. $rozmiar=sizeof($tekst_odp); 
  41.  
  42.  
  43.  $uchwyt_polaczenia = mysql_connect("localhost", "xxxx", "xxxxx") or die ("Nie można połączyć się z MySQL");
  44.  mysql_select_db ("xxxxxxx") or die ("Nie można połączyć się z bazą.");
  45.  $wynik=mysql_query("SELECT * FROM glosowanie1 WHERE id=1;");
  46.  $rekord = mysql_fetch_assoc ($wynik);
  47.  
  48.  $suma_glosow=0;
  49.  
  50.  for ($odp=0;$odp<$rozmiar;$odp++)
  51.  {
  52.  $suma_glosow=$suma_glosow+$rekord["$tekst_odp[$odp]"];
  53.  }
  54.  
  55.  if($suma_glosow==0) //aby uniknąć dzielenia przez zero
  56.  {
  57. for ($odp=0;$odp<$rozmiar;$odp++)
  58. {
  59. $procent[$odp]=0; 
  60. }
  61.  }
  62.  
  63. else
  64. {
  65. for ($odp=0;$odp<$rozmiar;$odp++)
  66. {
  67. $procent[$odp]=round(($rekord["$tekst_odp[$odp]"]/$suma_glosow)*100); //"round"-zaokrąglenie
  68. }
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  mysql_close($uchwyt_polaczenia);
  75.  
  76.  for ($odp=0;$odp<$rozmiar;$odp++)
  77. {
  78.  print "<IMG SRC='1.gif' WIDTH=$procent[$odp] HEIGHT=10/>";
  79. print " $tekst_odp[$odp] $procent[$odp] %<br/>";
  80.  }
  81. }
  82.  
  83.  
  84. ?>
  85.  
  86.  
  87.  
  88.  
  89.  
  90. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  91. <html xmlns="http://www.w3.org/1999/xhtml">
  92. <head>
  93. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  94. <title>Untitled Document</title>
  95. </head>
  96.  
  97. <body>
  98.  
  99. <?php
  100.  
  101. if($_COOKIE['sonda']!="2") //jeśli wartość ciastka jest różna od "2" (nie głosowano) to wyświetl formularz
  102. {
  103. ?>
  104. <form name="form1" method="post">
  105. <p>Czy lubisz koty?</p>
  106. <p>
  107. <input type="radio" name="opcja" value="tak" checked/>tak<br />
  108. <input type="radio" name="opcja" value="nie"/>nie<br />
  109. <input type="submit" name="button" value="Wyślij" />
  110. <input type="submit" name="button2" value="Wynik" />
  111. </p>
  112. </form>
  113.  
  114. <?php
  115. }
  116. ?>
  117.  
  118.  
  119.  
  120.  
  121.  
  122. </body>
  123. </html>



Powinienem coś w tym kodzie zmienić czy jest ok ? Bo cały wczorajszy dzień nad tym siedziałem, żeby przy dodaniu/usuwaniu/zmienianiu opcji tylko minimalnie wszystko modyfikować smile.gif.

Tu można przetestować: http://misiekmisiek.lua.pl/sonda.php
qqrq
Powinieneś ten post dać do "Oceny".
nospor
ten kod:
  1. <?php
  2. $wynik=mysql_query("SELECT * FROM glosowanie1 WHERE id=1;");
  3.  
  4.  
  5. $rekord = mysql_fetch_assoc ($wynik);
  6. $liczba=$rekord["$opcja"];
  7.  
  8. $liczba++;
  9.  
  10.  
  11. mysql_query("UPDATE glosowanie1 SET $opcja=$liczba WHERE id=1;");
  12. ?>

zastepuje sie tym:
  1. <?php
  2. mysql_query("UPDATE glosowanie1 SET $opcja=$opcja+1 WHERE id=1;");
  3. ?>


Ty to testowales? Bo ta twoja blokada z ciachem cos nie dziala.

pozatym przenosze


edit:
Twoj kod wogole nie jest zabezpieczony przed atakami Sql Injection
http://forum.php.pl/index.php?showtopic=23...t=0&start=0

edit: na dowod ze taki atak moge przeprowadzic, to dla opcji tak wpisalem 20000 smile.gif
rooki
Nospor wielkie dzięki, ustawiłem ważność ciastka na 20 sekund dlatego pewnie można oddawać głos po głosowaniu prawie natychmiast.

Ale kurcze jak żeś to zrobił, że mam w bazie w tabeli na tak ponad 20 000 głosów ? party.gif blinksmiley.gif
Ja myślałęm, że ataki SQL Injection to można przeprowadzić wtedy gdy jest pole w które coś trzeba coś wpisać, a u mnie przecież tylko się zaznacza opcję smile.gif.
Czytam to z tego linku co podałeś, ale narazie jeszcze nie doszedłęm jak Ty to mogłeś zrobić smile.gif.
nospor
Cytat
Nospor wielkie dzięki, ustawiłem ważność ciastka na 20 sekund dlatego pewnie można oddawać głos po głosowaniu prawie natychmiast.
Slepy nie jestem i widze ze jest 20 sekund. Glosowalem szybciej niz 20 sekund. Ale pod inna przegladarka dzialalo zabezpieczenie. Dodam ze obydwie przegladarki obsluguja ciacha.

Cytat
Ja myślałęm, że ataki SQL Injection to można przeprowadzić wtedy gdy jest pole w które coś trzeba coś wpisać, a u mnie przecież tylko się zaznacza opcję
No nie dokonca. Ty wysylasz formularzem pole o nazwie "opcja" i wartosci tak lub nie. To, ze ja tam nie moge wstawic value z poziomu ogolnego, to nie znaczy ze ja nie moge grzebac w twoim htmlu winksmiley.jpg
Pozatym ządania do Twojej strony nie muszą isc z przeglądarki.

Cytat
Czytam to z tego linku co podałeś, ale narazie jeszcze nie doszedłęm jak Ty to mogłeś zrobić
Value zamiast "tak" dalem :
"tak=20000 /*"
rooki
Coś chyba jest nie tak z tym serwerem, bo u mnie na postawionym serwerze lokalnym zarówno w FF jak i IE7 nie można głosować po oddaniu głosu przez 20 sekund.
A co do tych 20000 Twoich głosów to je usunąłem i wprowadziłęm w kodzie PHP:
  1. <?php
  2. $opcja=addslashes($_POST["opcja"]);
  3. ?>


Teraz już chyba 20000 razy nie zagłosujesz smile.gif.
nospor
Cytat
Teraz już chyba 20000 razy nie zagłosujesz
ech.... kiepsko czytales tamten topic. A ja ci nawet podalem co wpisalem....
No to sobie teraz zajrzyj do bazy... 20 000 jak marzenie tongue.gif
rooki
To ja już nie wiem - mysql_real_escape_string()-nie; addslashes()-nie; to jak można się przed tym atakiem zabezpieczyć jeśli mógłbyś napisać smile.gif.
nospor
Cytat
o jak można się przed tym atakiem zabezpieczyć jeśli mógłbyś napisać
Spojrz w moj podpis:
Myśl, myśl..... winksmiley.jpg
Skoro option ma zawierac "tak" lub "nie" to sprawdzaj czy to zawiera a jak nie to odeslij hakera z kwitkiem
rooki
ok zrobione wstydnis.gif smile.gif Dzięki ! smile.gif
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.