Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> [PHP]Bezpieczna długość zmiennej
Szunaj85
post
Post #21





Grupa: Zarejestrowani
Postów: 392
Pomógł: 7
Dołączył: 11.05.2008

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


Przeczytałem wasze posty i poszperałem w internecie. Zainteresowałem się funkcją strip_tags(). Chciałbym dobrze zrozumieć w jaki sposób można zaatakować stronę oraz samą funkcję w skrypcie.
Zacznę od formularza. Niech to będą komentarze.
Kod
Nick: [xxx]
Wiek: [30 ]
Komentarz:[<b>Zhakowałem ci stronę</b>]

No i jakieś zmienne $nick, $wiek, $komentarz. Czy mam rozumieć, że w powyższym wypadku haker zaatakował poprzez zmienną $komentarz, aby pogrubić tekst czy przez inne zmienne też jest to możliwe oczywiście odnosząc się do powyższego przykładu. No i sama funkcja
  1. <?php
  2. $ciag = 'Witaj <b>świecie</b>!!';  
  3. echo("strip_tags($ciag)");
  4. ?>

Rozumiem, że bez względu ile zmiennych by nie było wystarczy użyć jej przed samym wyświetleniem lub zapisem do pliku. Tylko w jakiej sytuacji jej użyć? Załóżmy, że zapisujemy komentarze do pliku txt. Funkcję użyć przed zapisem, przed wyświetleniem po odczytaniu, a może najbezpieczniej w obu przypadkach.
Jeśli znacie jeszcze jakieś inne funkcje, podzielcie się nimi.

Ten post edytował Szunaj85 28.04.2009, 22:11:55
Go to the top of the page
+Quote Post
batman
post
Post #22





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Moim zdaniem zmienna powinna być czyszczona z tagów html zarówno przed zapisem jak i przed wyświetleniem - nigdy nie wiadomo, czy nie została ona zmodyfikowana w magazynie.

Wszystkie niezbędne funkcje zapewniające bezpieczeństwo możesz znaleźć w wątku.
Go to the top of the page
+Quote Post
nieraczek
post
Post #23





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


Stosując strip_tags przed zapisem do bazy można stracić treść, która jest między tagami. To byłoby chyba bez sensu jesli potem przy wyświetlaniu stosuje się htmlspecialchars().


A jakbym chciał pozwolić użytkownikowi na pogrubianie, łamanie linii czy zmiane czcionki to czy to jest bezpieczne przed wyświetleniem:
  1. <?php
  2. trim(strip_tags($napis, "<b><font><br/>"))
  3. ?>


(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) ?
Usuwa wszystkie taki z wyjątkiem wymaganych.

Ten post edytował nieraczek 29.04.2009, 08:01:22
Go to the top of the page
+Quote Post
nospor
post
Post #24





Grupa: Moderatorzy
Postów: 36 565
Pomógł: 6315
Dołączył: 27.12.2004




dane, które z założenia nie powinny zawierac kodu html (czyli na dobrą sprawe prawie wszystkie) nalezy przepuszczac przez strip_tags. Ma nie zawierac i koniec kropka.
Nalezy oczywiscie pamietac, ze przed ich wyswietleniem nalezy je rownież przepuscic przez htmlspecialchars() - dla pewnosci. Nigdy nie wiadomo czy na jakims etapie rozwoju aplikacji nie wkradnie nam sie jakis blad w filtracji, wiec dla spokoju warto uzywac tej funkcji.

Co do glownego problemu w temacie:
cytat z arta, ktorego podano na początku:
Cytat
Zmienna powinna mieć radykalne ograniczenia wielkości, tak aby potencjalny włamywacz nie mógł zablokować naszej strony.

A nastepnie w kodzie dają ograniczenie do 255 znakow (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Zeby zablokowac komus strone to i 50 znakow starczy wiec zacytowany argument jest dość smieszny.
Owszem, należy sprawdzac dlugość tekstu, bo jesli baza przyjmuje tylko 255 znakow to dobrze by bylo, by tylko do niej tyle wkladac. Ot i cała filozofia

Cytat
Stosując strip_tags przed zapisem do bazy można stracić treść, która jest między tagami.
Toż to straszne. Jak ktos jest na tyle glupi (lub tez probuje nam XSS walnac),ze swoje imie wklada miedzy tagi, to jego sprawa (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Poza tym strip_tags tak latwo nie usuwa tresci, wiec naprawde nie ma co sie martwic
Go to the top of the page
+Quote Post
nieraczek
post
Post #25





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


ok dzieki nospor (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

A co z:
  1. <?php
  2. trim(strip_tags($napis, "<b><font><br/>"))
  3. ?>


(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

Myślę o sytuacjach, że np. wewnatrz tagu da się inny tag:
<b <script>alert("lol")</script> /> komentarz </b>

akurat w powyższym przypadku jest ok, ale są może inne niebezpieczeństwa ?

Ten post edytował nieraczek 29.04.2009, 08:14:48
Go to the top of the page
+Quote Post
nospor
post
Post #26





Grupa: Moderatorzy
Postów: 36 565
Pomógł: 6315
Dołączył: 27.12.2004




@nieraczek jesli juz tak bardzo chcesz komus pozwolic na niektore tagi to:
1) albo wprowadź bbcode
2) albo zainteresuj się klasą HTMLPurifier - posiada duze mozliwosci w filtracji tekstu, jego zabezpieczenia, usunieciu potencjalnych xss itp.
Go to the top of the page
+Quote Post
ddiceman
post
Post #27





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

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


Cytat(batman @ 24.04.2009, 23:12:26 ) *
Czytam i czytam i nadziwić się nie mogę, że ludzie takie bzdury wypisują. Długość zmiennej nie ma żadnego znaczenia jeśli chodzi o bezpieczeństwo. Nawet w 50 znakach można zmieścić kod z SQL Injection.
Najważniejszą rzeczą jest filtrowanie danych, a nie ich skracanie. Czyli:
1. Wywalanie kodu html/js tam, gdzie nie jest on potrzebny.
2. Walidowanie danych pod kątem ich typu.
3. Rzutowanie zmiennych przed ich użyciem. Jeśli wiadomo, że dana zmienna ma być liczbą, wówczas dla bezpieczeństwa lepiej ją zrzutować na int lub float.
I kilka innych, które akurat wyleciały mi z głowy.

Batman, bezpieczeństwo to nie tylko obrona przed SQL Injection. Co jeśli do pola typu VARCHAR(255) spróbujesz wstawić 500 znaków? W aktualnych wersjach MySQLa nic - rekord się nie doda. We wczesniejszych dodawał sie, ale ucięty - jeśli przez jakiś CMS wstawiany był kod HTML, to można było stracić zamykające tagi i tym samym zniszczyć układ strony. Ale byly też przypadki, że dalo sie tym mechanizmem uszkadzać tabele, co możesz sprawdzić tu i nie oznacza to, ze już takich problemów nie ma i nie będzie. Nie mów zatem, ze bzdurą jest ochrona dlugosci danych przed ich wstawieniem do BD.

Ten post edytował ddiceman 29.04.2009, 10:04:56
Go to the top of the page
+Quote Post
nospor
post
Post #28





Grupa: Moderatorzy
Postów: 36 565
Pomógł: 6315
Dołączył: 27.12.2004




@ddiceman akurat batman mowiąc "bzdura" nie mial na mysli dlugosci kolumny w bazie, tylko atak ssqlinjection czy xss. A wlasnie z artykulu to wlasnie wynikalo (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
To ze trzeba sprawdzic dlugosc pod wzgledem dlugosci w bazie danych to sprawa oczywista i juz pisalem w poprzednim poscie o tym
Go to the top of the page
+Quote Post
batman
post
Post #29





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Ludzie. Autor nie pytał się czy trzeba sprawdzać długość ciągu, tylko czy jest jakaś długość, która uniemożliwi atak. Czytajcie ze zrozumieniem.
A to, że konieczne jest sprawdzanie długości ciągu przed zapisem do bazy, jest jasne jak słupek uranu. Równie dobrze możesz się przyczepić, że nie napisałem jednoznacznie, że jeśli w formularzu użytkownik wysyła datę, to na serwerze trzeba sprawdzić, że to jest data.
Go to the top of the page
+Quote Post
megawebmaster
post
Post #30





Grupa: Zarejestrowani
Postów: 143
Pomógł: 17
Dołączył: 8.11.2008
Skąd: Libiąż

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


Przy okazji - strip_tags przecież umożliwia przepuszczenie przez niego tagów, które wg. Was mają być bezpieczne. Potem czeka tylko dodatkowa filtracja.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 7.04.2026 - 10:35