Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] kasowanie javascript ze stringa
Forum PHP.pl > Forum > Przedszkole
marcinek37
  1. function strip_script($string) {
  2. $string = preg_replace("/<script[^>]*>.*?< *script[^>]*>/i", "", $string);
  3. $string = preg_replace("/<script[^>]*>/i", "", $string);
  4. return $string;
  5. }


czy taka funkcja wystarczy, aby każdy skrypt usunąć ze stringa?
sowiq
Jeżeli potrzebujesz jakiegoś "czyściciela" XSS, to polecam ten kombajn: http://htmlpurifier.org/
marcinek37
wystarczy mi usunięcie <script>
czy ww. kod wystarczy?
sowiq
Nie wystarczy.
Kod
<<script>script>alert('1')</script>


Masz złe podejście. Zamiast robienia blacklisty i usuwania rzeczy w niej zawartej powinieneś zrobić whitelistę i usuwać wszystko, czego na niej nie ma. "Atakujący" zawsze może wymyślić coś, o czym Ty nie pomyślałeś. Chociażby
Kod
<img src="java script:alert(1)" />
Ten kod nie zadziała na teraźniejszych przeglądarkach, ale na starszych najprawdopodobniej tak.

Jeszcze raz polecam http://htmlpurifier.org/ bo to na prawdę dobre i sprawdzone rozwiązanie.

[edit]
Forum automatycznie rozdziela spacją javascript w tagu img powyżej
marcinek37
właśnie to za dużo, co polecasz
chcę jedynie, aby do edytora tekstu (fckeditor) nie można było dawać skryptów - nic więcej
sowiq
Jeśli to ma być edytor dla użytkowników strony, to nie wystarczy Ci tylko filtrowanie JS. Poza tym musisz usuwać np. CSS. Jeszcze nie tak dawno Allegro zaliczyło niezłą wpadkę przez nieszczelne usuwanie CSS. Ktoś zrobił aukcję z elementami HTML pozycjonowanymi absolutnie. Dzięki temu był w stanie podmienić (tak na prawdę to zasłonić) elementy aukcji z ceną, przyciskiem 'Kup Teraz' itp.

Więc zastanów się dobrze czy chcesz dać użytkownikom możliwość wysyłania HTML i okrojenia go tylko z JS, czy nie zastąpić tego np. BBCode.
marcinek37
wszystko jest pod kontrolą, prócz JS - nie chcę Was zanudzać tłumaczeniami, chcę jedynie skasować wszelkie skrypty JS, nic poza tym
sowiq
Jeśli chcesz się skupić jedynie na tagach <script>, to teoretycznie wystarczy, że podaną przez Ciebie funkcję wykonasz w pętli
Kod
while(stripos($string, '<script') !== false){
    $string = strip_script($string);
}


Ale weź też pod uwagę takie rzeczy jak:
  1. <a onclick="alert(1)">
  2. <img onmouseover="alert(1)" />
  3. <meta http-equiv="refresh" content="10;url=http://google.com" /> <!-- to zadziała z każdego miejsca na stronie -->
  4. <img src="java script:alert(1)" />
  5. itd...
darko
W pliku konfiguracyjnym fckconfig.js ustaw
FCKConfig.ProtectedSource.Add( /<script[\s\S]*?\/script>/gi ) ;
znalezione na
sowiq
@darko, filtrowanie client-side nie daje praktycznie żadnego zabezpieczenia. Równie dobrze możesz wysłać niebezpieczny kod z pominięciem edytora, albo chociażby wyłączyć JS w przeglądarce.
marcinek37
dlatego szukam funkcji typowo php - czy ta zasugrowana przeze mnie wystarczy, czy lepiej szukać czegoś bardziej rozwiniętego?
Crozin
W pierwszym poście dostałeś na tacy podane gotowe narzędzie, które wystarczy tylko skonfigurować do swoich potrzeb. Czego więcej oczekujesz?
sowiq
Cytat(marcinek37 @ 5.10.2012, 13:04:34 ) *
dlatego szukam funkcji typowo php - czy ta zasugrowana przeze mnie wystarczy, czy lepiej szukać czegoś bardziej rozwiniętego?

Ręce opadają... Podałem Ci idealny przykład, że nie wystarczy.
Kod
<<script>script>alert('1')</script>

Podałem Ci powyżej przykład jak "zabezpieczyć" Twój kod przed takimi stringami, podałem Ci też przykład, że takie filtrowanie na wiele się nie zda. W końcu, jak zauważył Crozin, podałem Ci linka do biblioteki, która jest dobrze przetestowana i zabezpieczy Cię przed typami ataków, o których pewnie nawet nie masz pojęcia.

Jak sobie zabezpieczysz, tak bezpiecznie będziesz miał. Bardziej okrągłego koła na nowo nie wymyślisz. Dla mnie eot.
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.