Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ocena Księgi gości
Forum PHP.pl > Inne > Oceny
danielBSTOK
Witam.
Przedstawiam link do moich wypocin.
Szkoliłem się trochę z mysql + php ...

Oto co mi się udało zrobić w między czasie:

http://eksperymentalni.pl/ksiega_gosci/

Proszę o komentarze.
Dla chętnych podeślę cały skrypt.

Login : admin
haslo: test
mat-bi
1. mogę dodać opis o 1 literze
2. popatrz, co ci z księgą narobiłem :]
danielBSTOK
Spoko smile.gif
hehe. Powiedz teraz jak mogę to zabezpieczyć i w jaki sposób szybko dodać wpisy?
mat-bi
Zabezpieczyć, to np. cookie, zapis w sesji, czy zapis w bazie danych ip.
danielBSTOK
Ok np.
W jaki sposób dokładnie to wykonać?
Fifi209
Hmm link nie działa, poza tym nie ma kodu - ciężko powiedzieć czego brakuje
danielBSTOK
http://eksperymentalni.pl/ksiega123/

Namieszła mi poprzedni użytkownik.
Nie mam pojecia jak zabezpieczyc strone, czytam ciagle rozne tutki i jakoś próbuje do tego dojsć.
Jak ktoś ma jakieś metody to będę wdzięczny.
pyro
Najpierw Ci podmieniłem, a potem rozszerzyłem nieco stronkę tongue.gif
danielBSTOK
hmmm teraz też dasz rade?
pyro
Cytat(danielBSTOK @ 30.06.2011, 21:25:54 ) *
hmmm teraz też dasz rade?


Myślałeś, że zwykłe maxlength mnie powstrzyma tongue.gif?
danielBSTOK
hehe smile.gif To powiedz mistrzu jak to zrobiłeś bym mógł godnie się bronić?
pyro
Autora ograniczyć do x znaków.

a w tekście rozbijać długie wyrazy albo ustawić odpowiedni overflow.

A tak w ogóle to ten kod jest... nienajlepszej jakości. Używany jest zdeprecjonowany znacznik font, tabelki itp.
danielBSTOK
Wiem. Nie stosowałem dla wszystkiego css.
Miałem podszkolić się w mysql i phpie.

Czy mógłbyś jaśniej wytłumaczyć w jaki sposób manipulujesz danymi?

Dobra z długością sobie poradziłem smile.gif Teraz java;)
Fifi209


Co do kodu, pisałeś że możesz dać a ja czekam ;]
danielBSTOK
Spoko smile.gif zaraz wrzucę.

Wiem co to java i co to javascript smile.gif
Spokojna głowa ... bardziej mnie martwi że nie umiem ani tego ani tamtego wink.gif


Tak jak pisałem - głównie szkoliłem się w php + mysql.
Nie zadbałem o style estetykę kodu, więc nie miejcie dla mnie za złe smile.gif

Mój pierwszy skrypt PHP + mysql
Fifi209
Skoro wiesz, to pisz JS ew. Javascript bo tam nie ma Javy ;]

Nadal czekam na kod. ;]
kujawska
Jeśli odczytujesz z bazy table jest uzasadnione.Font w css.
Podaję przykład ograniczeń w formularzu:
<?php
$opis = trim($_POST['opis']);
if (!empty($_POST['opis']) && (substr_count($opis, '<') <=0 )) //brak tagów html
if (!empty($_POST['opis']) && (substr_count($opis, ' ') >0 )) //jest spacja
{
....
Ograniczenia można oczywiście mnożyć wykluczając złośliwą formę wpisów.
danielBSTOK
Super : Dzięki wielkie.

Wezmę radę z css do siebie.
Nie wykluczyłem całkowicie css.

Wstawiłem kod jak ktoś chce sobie pobrać.

Login do panelu: admin
Hasło : 123
Fifi209
Brak doctype
Nie zamykasz tagu html

Masz dwa tagi body z czego jeden pusty a drugi niezamknięty.

Tutaj aż prosi się o szablony. ;]
danielBSTOK
Przeoczyłem Body a o doctype zapomniałem smile.gif
Fifi ... chciałem skupić się na kodzie a nie na wyglądzie kodu.
Mógłbym zastosować css dla całego skryptu.

Jak możesz to powiedz co byś jeszcze dodał?
Fifi209
Jedziemy dalej, logowanie wygląda tak:

  1. function pobierz_dane($User,$Pass) {
  2.  
  3. db_connect();
  4. $sprawdz = "SELECT * FROM logowanie WHERE login = '$User' AND haslo = '$Pass'";
  5. $query = mysql_query($sprawdz);
  6. $row = mysql_fetch_assoc($query);
  7.  
  8. return $row;
  9. }
  10.  
  11. $row = pobierz_dane($_POST['imie'],$_POST['nazwisko']);


Ratuje Cię chyba magic_quotes, bo inaczej wystarczy zwykły:
admin' /*

Błąd w walidacji:
  1. if ( empty($autor) | empty($opis))

Raczej || powinno być

Co do magic_quotes przy usuwaniu też Cię ratuje przed:
usun=del&id=' or 1=1 /*

Jednak mogę bez zalogowania się usuwać wpisy, coś jest nie tak.
Przy okazji pozwoliłem sobie wywalić wszystkie wpisy bo i tak zaśmiecały.
danielBSTOK
Jak zmieniłeś dla mnie czcionki w nagłówkach?
Fifi209
Nie zmieniałem, popraw błędy o których napisałem. ;]

Poza tym kody typu:
  1. <?php
  2.  
  3. echo "<table border=\"0\" width=\"1100\" align=\"center\" cellspacing=\"0\" cellpadding=\"0\">";
  4.  
  5. echo "<tr>";
  6. echo "<td width=\"1100\" height=\"203\" valign=\"middle\" align=\"center\" background=\"ksiega_01.png\"></td>";
  7. echo "</tr>";
  8.  
  9. echo "<tr>";
  10. echo "<td width=\"1100\" valign=\"top\" align=\"center\" background=\"ksiega_02.png\">";
  11.  
  12. echo "<form action=\"potwierdzenie.php\" method=\"post\">";
  13. echo "<table border=\"0\" width=\"900\" align=\"center\" cellspacing=\"5\" cellpadding=\"5\">";
  14.  
  15. echo "<tr background=\"he1.jpg\">";
  16. echo "<td width=\"200\" valign=\"middle\" align=\"left\"><b>Autor</b></td>";
  17. echo "<td width=\"700\" valign=\"middle\" align=\"left\"><b>Opis</b></td>";
  18. echo "</tr>";
  19.  
  20. echo "<tr>";
  21. echo "<td width=\"200\" valign=\"top\" align=\"left\"><input type=\"text\" maxlength=\"20\" name=\"autor\" id=\"pole1\"></td>";
  22. echo "<td width=\"700\" valign=\"top\" align=\"left\"><textarea id=\"pole2\" name=\"opis\"></textarea></td>";
  23. echo "</tr>";
  24.  
  25. echo "<tr>";
  26. echo "<td width=\"200\" valign=\"middle\" align=\"left\"></td>";
  27. echo "<td width=\"700\" valign=\"middle\" align=\"left\"><input type=\"submit\" name=\"dodaj\" value=\"Dodaj do księgi\"></form></td>";
  28. echo "</tr>";
  29.  
  30. echo "</table>";
  31.  
  32. echo "</td></tr>";
  33.  
  34. $data = date("Y-m-d");
  35. $godzina = date("H:i");
  36.  
  37. echo "<tr>";
  38. echo "<td width=\"1100\" height=\"71\" valign=\"middle\" align=\"center\" background=\"ksiega_03.png\"><font size=\"2\" color=\"gray\">Mamy dzisiaj: <b>".$data."</b> godzinę: <b>".$godzina."</b></font></td>";
  39. echo "</tr>";
  40. echo "</table>";
  41.  
  42. ?>

Możesz spokojnie zamienić na:
  1. <table border="0" width="1100" align="center" cellspacing="0" cellpadding="0">
  2.  
  3. <tr>
  4. <td width="1100" height="203" valign="middle" align="center" background="ksiega_01.png"></td>
  5. </tr>
  6.  
  7. <tr>
  8. <td width="1100" valign="top" align="center" background="ksiega_02.png">
  9.  
  10. <form action="potwierdzenie.php" method="post">
  11. <table border="0" width="900" align="center" cellspacing="5" cellpadding="5">
  12.  
  13. <tr background="he1.jpg">
  14. <td width="200" valign="middle" align="left"><b>Autor</b></td>
  15. <td width="700" valign="middle" align="left"><b>Opis</b></td>
  16. </tr>
  17.  
  18. <tr>
  19. <td width="200" valign="top" align="left"><input type="text" maxlength="20" name="autor" id="pole1"></td>
  20. <td width="700" valign="top" align="left"><textarea id="pole2" name="opis"></textarea></td>
  21. </tr>
  22.  
  23. <tr>
  24. <td width="200" valign="middle" align="left"></td>
  25. <td width="700" valign="middle" align="left"><input type="submit" name="dodaj" value="Dodaj do księgi"></form></td>
  26. </tr>
  27.  
  28. </table>
  29.  
  30. </td></tr>
  31. <?php
  32. $data = date("Y-m-d");
  33. $godzina = date("H:i");
  34. ?>
  35. <tr>
  36. <td width="1100" height="71" valign="middle" align="center" background="ksiega_03.png"><font size="2" color="gray">Mamy dzisiaj: <b><?php echo $data; ?></b> godzinę: <b><?php echo $godzina; ?></b></font></td>
  37. </tr>
  38. </table>
  39.  


Po co przepuszczasz tyle html przez parser w dodatku w cudzysłowach " a nie apostrofach ' ?
danielBSTOK
Fifi - wiem że zmieniłeś wink.gif
Czy możesz udzielić mi informacji w jaki sposób to zrobiłeś?
Geniuszem nie jestem a dobrych rad potrzebuję smile.gif
Fifi209
A jak dodasz wpisz to dalej jest taka sama "zmieniona" czcionka? Serio, nie zmieniałem.

Zajmij się tym, czym pisałem! Wrzuć poprawiony kod, będę pomagał dalej.
danielBSTOK
Teraz spróbuj usunąć wpis
Fifi209
No nie da się, poprawiłeś. Tylko to? A może zastosowałeś się do większej ilości moich rad? Wstaw poprawiony kod, będziemy przeglądali dalej.
danielBSTOK
Nie usunąłem z kodu php - htmla.
Co tam jeszcze miałem zastosować oprócz styli?
Fifi209
Wcześniej pokazałem Ci brak filtracji jakiejkolwiek, co umożliwi atak SQL INJECTION
danielBSTOK
Jak mam zrobić tą filtrację?
nospor
Tyle jest tematów odnośnie SQL INJECTION, że naprawdę mógłbyś wpierw ich poszukać...
danielBSTOK
No właśnie aż za dużo tego ... nie wiem od czego zacząć ! wujek google dużo mówi ...
nospor
Wpisałem w google:
php sqlinjection

Już pierwsze dwa wyniki wyjaśniają wszystko
http://www.poradnik-webmastera.com/artykul...l_injection.php
http://webmade.org/porady/bezpieczenstwo-p...on-xss-csrf.php
danielBSTOK
Spoko. Zobaczę. Dzięki

Fifi wrzucam księge na ftp.
KSIĘGA GOŚCI ! - POBIERZ

link do księgi gości - online

log: admin
pas: 123

Looknij co tam nie pasuje.
Nie usuwałem z php kodu html.
nospor
  1. /* Porcjowanie wyników*/
  2. $ile = "SELECT id from wpisy";
  3. $query = mysql_query($ile);
  4. $licz = mysql_num_rows($query);

Wyobraź sobie teraz, że masz milion rekordów. Chcąc policzyć ich ilośc, pobierasz wszystkie te milion rekordów na serwer....
Do liczenia liczby rekordów używa sie
select count(*) from tabela
liczeniem ma się zając baza i ma zwrócić tylko liczbę

  1.  
  2. /* Porcjowanie wyników*/
  3. $ile = "SELECT id from wpisy";
  4. $query = mysql_query($ile);
  5. $licz = mysql_num_rows($query);
  6.  
  7. for ($i=0; $i < ($licz / $ile_wynikow); $i++) {
  8. $ink = $i +1;
  9. echo "<font size=\"1\" color=\"gray\"><a id=\"dodaj\" href=\"admin.php?strona=$i\">[ $ink ]</a></font>";
  10. }
  11.  
  12.  
  13. echo "</td></tr>";
  14.  
  15. $ile = "SELECT id from wpisy";
  16. $query = mysql_query($ile);
  17. $licz = mysql_num_rows($query);
  18.  
  19. $data = date("Y-m-d");
  20. $godzina = date("H:i");

To też jest dobre. Raz liczysz liczbę rekordów i parę linijek później znowu liczysz liczbę rekordów...
danielBSTOK
Spoko już poprawiam.
nospor
Każdy może edytować wpisy, nawet osoba nie zalogowana
http://eksperymentalni.pl/ksiega123/edytuj.php?id=31
danielBSTOK
Poprawiłem wszystko smile.gif
nospor
Wszystko? Znaczy napisałeś od nowa całą aplikację? Bo tylko w ten sposób można poprawić tam wszystko wink.gif (przy okazji robiąc masę innych błędów wink.gif )
danielBSTOK
To poproszę o szczegółowe błędy:)
zawodnik
Przy kliknięciu edytuj prosi o zalgowanie, po czym nie przenosi do strony edycji
Fifi209
Ok, nie ma problemu gadam dalej:

mysql_escape_string
Cytat
This function has been DEPRECATED as of PHP 5.3.0. Relying on this feature is highly discouraged.

U mnie jej nie ma.

Zastąp:
mysql_real_escape_string

To:
  1. $wykonaj = "DELETE FROM wpisy where id='".$id."'";


Powinno raczej wyglądać o tak:
  1. $wykonaj = 'DELETE FROM `wpisy` WHERE `id` = '.(int) $id;


Tutaj:
  1. $autor = strip_tags($autor);
  2. $opis = strip_tags($opis);
  3. $ip = $_SERVER['REMOTE_ADDR'];
  4. $data = date("Y-m-d H:i:s");
  5. $query = "insert into wpisy value(NULL,\"$autor\", \"$opis\", \"$data\" ,\"$ip\")";

Skupiasz się na XSS zapominając o SQL Injection

Nie do końca zastosowałeś się do rady nospora, liczysz po stronie bazy ale nadal dwa razy:
  1. /* Porcjowanie wyników*/
  2. $ile = "SELECT count(*) AS ilosc FROM wpisy";
  3. $query = mysql_query($ile);
  4. $licz = mysql_fetch_assoc($query);
  5. $licz = $licz['ilosc'];
  6.  
  7. for ($i=0; $i < ($licz / $ile_wynikow); $i++) {
  8. $ink = $i +1;
  9. echo "<font size=\"1\" color=\"gray\"><a id=\"dodaj\" href=\"index.php?strona=$i\">[ $ink ]</a></font>";
  10. }
  11.  
  12.  
  13. echo "</td></tr>";
  14.  
  15. $ile = "SELECT count(*) AS ilosc FROM wpisy";
  16. $query = mysql_query($ile);
  17. $licz = mysql_fetch_assoc($query);
  18. $licz = $licz['ilosc'];


Pytanie: Po co w sesji trzymasz hasło?

Kolejny przykład gdzie patrzysz tylko na XSS:
  1. $opis = $_POST['opis'];
  2. $id = $_GET['id'];
  3.  
  4. $opis = strip_tags($opis);
  5.  
  6. $query = "UPDATE wpisy SET opis = '$opis' WHERE id = '$id'";

Rzutowanie id na inta masz wyżej i nie wstawiaj liczby jako string! Po co dodatkowo obciążać bazę?

Jak zwykle:
  1. $zmienna4 = $_GET['id'];
  2. $rekord = ("SELECT * FROM wpisy where id = '$zmienna4'") or die ("Problem !");

ja tam wpiszę sobie:
' or 1=1 union select interesujace,pola from logowanie /*

Rzutowanie jak wyżej.

W configu dajesz nam dane do bazy.

  1. if ( empty($_POST['haslo2']) | empty($_POST['haslo1']))


or to inaczej || a nie |

Starczy Ci roboty na dziś, popraw i mogę sprawdzać dalej.

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-2024 Invision Power Services, Inc.