Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wstrzykniecie JavaScriptu - jak temu zapobiec?
collecter
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 22.10.2010

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


Witam,

od pewnego czasu ucze sie obiektowego php, tworzac wlasna strone internetowa. Jakie bylo moje zdziwienie gdy dzisiaj przestala ona poprawnie funkcjonowac. Strona odswieza sie sama co sekunde, co uniemozliwa jej poprawne funkcjonowanie. Po zweryfikowaniu kodu zrodlowego stronu zobaczylem nastepujacy kod:

<script type="text/javascript">
window.setTimeout("window.location.replace(ADRES_STRONY');",1);
</script>

Slyszalem o atakach XSS, ale nigdy ze tak powiem nie doswiadczylem tego na wlasnej skorze:) Z tego powodu chcialbym sie zapytac bardziej doswiadczonych kolegow jak temu zapobiec?

pozdrawiam
d
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 10)
pyro
post
Post #2





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Szukając na forum.
Go to the top of the page
+Quote Post
zegarek84
post
Post #3





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


to zależy, na jakie wprowadzanie tekstu chcesz pozwolić - jeśli najprostsze to po prostu wyświetlaj to co ktoś wpisze stosując jakąś funkcję w php w stylu htmlspecialchars

- jeśli z kolei chcesz pozwolić na wiele i nie dodajesz tekstu zbyt często to zainteresuj się DOM'em w php i usuwaj elementy script oraz style(by Ci nie przestylowali strony ^^) no i elementy link pod kontem pobieranych plików - lub też je usuwaj... w pozostałych elementach albo usuwaj wszystkie atrybuty mouseover (jest ich znacznie więcej) lub prościej zostawiaj tylko dozwolone atrybuty... w atrybucie href sprawdzaj czy nie zaczyna się od "java script:" - i dopiero dobrze obrobiony tekst przez dom zapisuj do bazy...

Ten post edytował zegarek84 4.11.2011, 17:53:30
Go to the top of the page
+Quote Post
lobopol
post
Post #4





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

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


Prawda jest taka, że jeżeli nie puścisz htmlspecialcharsa lub nie pozbędziesz się wszystkich złych znaków, to użytkownik może ci zrobić ze stroną wszystko, np. umieścić iframe zasłaniający całą treść. Albo wykraść ciasteczka twojej strony, albo robić redirecta. W zasadzie nie powinieneś nigdy dopuścić aby użytkownik mógł sam wstawiać jakikolwiek tag html czy skrypt.
Go to the top of the page
+Quote Post
Niktoś
post
Post #5





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

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


Ja spojrzałem na przykłady ataków i był taki specyficzny atak XSS:
\x3Ca href="" onmouseover="alert(document.cookie);" \x3ETUTAJ!\x3C/a\x3E
czy htmlspecialchars przefiltruje takie coś?

Ten post edytował Niktoś 4.11.2011, 18:23:09
Go to the top of the page
+Quote Post
lobopol
post
Post #6





Grupa: Zarejestrowani
Postów: 1 729
Pomógł: 346
Dołączył: 4.04.2009

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


Tak, ale szybciej było chyba sprawdzić co?
Go to the top of the page
+Quote Post
cudny
post
Post #7





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Ehh, zawsze dodaje się do widoków edytowanych przez usera zewnętrznego htmlspecialchars($string);
Jest to konieczne !
Opuszczam to tylko i wyłącznie w przypadku edycji strony www w cms przy użyciu tinyMCE, no ale wiadomo, jest to admin, wszytko zabezpieczone hasłem, tak być musi.
Ale mimo to zawsze używam przed dodaniem do bazy addslashes(stripslashes($string)); i po wyciągnięciu z bazy w widoku daje stripslashes($string);
Przy dodawaniu daje stripslashes przed addslashes żeby przypadkiem nie powielały się \ przy włączonej dyrektywie magic_quotes w .htaccess
Przy wyświetlaniu usuwam wszystkie \
Oczywiście jeśli wprowadzał dane ktoś z zewnątrz to w widoku dajesz: echo htmlspecialchars(stripslashes($string)); i masz wszytko załatwione.

Stwórz sobie jakąś klasę, no nie wiem, validation i w niej walnij metody:

  1. class Validation {
  2. public function escape($string, $html = true) {
  3. $string = stripslashes($string);
  4. if($html) return htmlspecialchars($string);
  5. else return $string;
  6. }
  7. public function escapeDB($string) {
  8. return addslashes(stripslashes($string));
  9. }
  10. }


To ci eliminuje wszelkie niebezpieczeństwa (IMG:style_emoticons/default/smile.gif)

  1. $validation = new Validation();
  2. echo $validation->escape($string); // jeśli chcesz użyć htmlspecialchars
  3. echo $validation->escape($string, false); // jeśli pozwalasz aby text zawierał javascript bądz xhtml
  4. $query = 'insert into db values(1,"'.$validation->escapeDB($string).'")'; // dodawanie rekordów do bazy - wywala wszelkie niebezpieczne znaki dla zapytań SQL
Go to the top of the page
+Quote Post
lukaskolista
post
Post #8





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cudny, jestes hardcorem! Zapytan do bazy sie tak nie zabezpiecza (w przypadku MySQL jest to funkcja mysql_real_escape_string). Co do tekstu wyswietlanego na stronie - stary ale jary BBCode, wedlug mnie trzeba odroznic "HTML" wstawiany przez uzytkownikow od tego natywnego z aplikacji.
Go to the top of the page
+Quote Post
cudny
post
Post #9





Grupa: Zarejestrowani
Postów: 387
Pomógł: 66
Dołączył: 31.03.2005
Skąd: Kielce

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


Cytat(lukaskolista @ 5.11.2011, 09:35:30 ) *
Cudny, jestes hardcorem! Zapytan do bazy sie tak nie zabezpiecza (w przypadku MySQL jest to funkcja mysql_real_escape_string). Co do tekstu wyswietlanego na stronie - stary ale jary BBCode, wedlug mnie trzeba odroznic "HTML" wstawiany przez uzytkownikow od tego natywnego z aplikacji.



Zatem jestem harcorem (IMG:style_emoticons/default/biggrin.gif)
Czy kolega przeczytał najpierw jak działa funkcja addslashes(); (IMG:style_emoticons/default/biggrin.gif) ?
W przypadku kodowania utf8 jest ona bezpieczna dla sql injection bo nie jesteś w stanie dodać w żadnym wypadku pojedynczego znaku ' bądź "
Poniżej artykuł opisujący atak sql injection pomimo użycia addslashes:
http://shiflett.org/blog/2006/jan/addslash...l-escape-string
Proszę jednak zapoznać się z dopiskiem na końcu strony:
Cytat
This type of attack is possible with any character encoding where there is a valid multi-byte character that ends in 0x5c, because addslashes() can be tricked into creating a valid multi-byte character instead of escaping the single quote that follows. UTF-8 does not fit this description.

Wnioski:
Jak mądrze rozwiążesz aplikację to i validacja będzie łatwiejsza.
Oczywiście sam używam mysql_real_escape_string(); ale powyższy przykład udowadnia, że piszesz o czymś o czym nigdy nie czytałeś.
Warto zapoznać się z funkcjami predefiniowanymi w php

A tu ciekawostka dotycząca bezpieczeństwa mysql_real_escape_string(); przy użyciu kodowania ISO-8859-1
http://ilia.ws/archives/103-mysql_r...Statements.html

Nie ma super bezpiecznej validacji danych. Można jedynie zabezpieczyć dane bardzo dobrze, ale i tak znajdzie się na to sposób. SHA1 też zostało złamane i szybki komputer jest w stanie w (tu nie pamiętam dokładnego czasu, nie chce mi się szukać) tydzień czy dwa odczytać hasło wykradzione z bazy danych.
Niestety często się to zdarza przy backupach, wiec... jak piszą, "było włamanie do servisu, wykradziono hasła, ale nie martwcie się, były hashowane", to i tak zmień sobie to hasło. To taka ciekawostka sytuacyjna (IMG:style_emoticons/default/biggrin.gif)

Co do BBCode, nie widzę najmniejszego sensu używania go w aplikacjach, chyba że jest to forum.
Czemu ? A z racji wydajności.
Lepiej zapisać pełny html do pliku i potem require_once($file); niż przy użyciu wyrażeń regularnych parsować cały kod i zamieniać znaczniki.
Moim zdaniem lepiej mądrze rozwiązać widoki aplikacji niż używać BBCode.
Oczywiście możliwość tworzenia HTML w tym wypadku może mieć tylko i wyłącznie admin, czyli osoba odpowiedzialna za poprawne działanie całej aplikacji.
Możliwość tylko i wyłącznie po autoryzacji.
Jak zwalisz validacje logowania to i tak aplikacja nadaje się do kosza (IMG:style_emoticons/default/smile.gif)

Ten post edytował cudny 5.11.2011, 11:22:17
Go to the top of the page
+Quote Post
adam882
post
Post #10





Grupa: Zarejestrowani
Postów: 289
Pomógł: 1
Dołączył: 2.11.2007

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


długo używałem takiego rozwiązania, jakie podał @cudny byłem z niego bardzo zadowolony
Go to the top of the page
+Quote Post
lukaskolista
post
Post #11





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cytat
Oczywiście sam używam mysql_real_escape_string(); ale powyższy przykład udowadnia, że piszesz o czymś o czym nigdy nie czytałeś.
Tak, oczywiscie ze nie wiem jak dziala addslashes... OFC!! Jak chcecie kombinowac to prosze bardzo, osobiscie nie widze w tym sensu skoro jest funckja przeznaczona do zabezpieczania zapytan, czego nie mozna powiedziec o addslashes

Ten post edytował lukaskolista 5.11.2011, 18:27:21
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: 24.08.2025 - 14:34