Tagjavascript

google bug XSS – błąd w google webmaster tools

google bug – błąd w google webmaster tools

Otóż niedawno zwyczajnie przeglądając sobie google dla webmasterów zdziwiłem się jak zobaczyłem ładnie osadzony JavaScript pośród wyników. Może to niewiele ale takie rzeczy są równie bezpieczne jak sranie na odbezpieczony 5 sekundowy granat… Poza tym mając taką wskazówkę bez problemu odnajdziemy więcej podobnych błędów, wiadomo gdzie szukać… jestem wręcz pewien że wszystkie dane są w ten sam sposób parsowane!

Pragnę przypomnieć, że już dawno w google jakiś ktoś odkrył też jakieś luki (chyba także XSS), nie jestem pewnie bo nie było po polsku… Teraz odnalazłem go w : Twoja witryna w sieci >> Zapytania najczęściej powodujące wyszukanie

Miłego XSS-owania!

XSS
cross site scripting, atak na stronę polegający na umieszczeniu własnego kodu na stronie, oczywiście złośliwy w działaniu i szkodliwy (z reguły JavaScript).
Zabezpieczenie przed XSS
Otóż nie ma prostszych sposobów niż parsowanie danych w PHP za pomocą jednej z dwóch funkcji:

  • htmlentities() – zamienia specjalne znaki na encje, dzięki temu możemy wyświetlić bezpiecznie każdy kod i nie zostanie on wykoanany
  • strip_tags() – usuwa każdy kod HTML, osadzony JavaScript oraz PHP, wiec nie zostanie on w ogóle wyświetlony
  • htmlspecialchars() = konwertuje na encje tylko znaki specjalne

Przy htmlentities() oraz htmlspecialchars() pragnę przypomnieć, że jeśli parsujemy jakiś ciąg w utf-8 lub innym kodowaniu to musimy je podać jako trzeci argument funkcji, inaczej znaki specjalne nam się wykrzaczą!

htmlentities($str, ENT_NOQUOTES, 'utf-8');
htmlspecialchars($str, ENT_NOQUOTES, 'utf-8');

Screen buga w google webmaster tools:
google webmaster xss bug screen
Dla tych szukających rozwiązania od strony php polecam dwie funkcje:

  • urlencode()
  • rawurlencode()

Wszelkie prawa zastrzeżone © tosiek

compress JavaScript code – compressor

compress JavaScript code – compressor

Kompresja kodu JavaScript jest gotową funkcją PHP która za pomocą wyrażeń regularnych usuwa zbędne znaki ze skryptu JavaScript co powoduje zmniejszenie jego rozmiaru. Skutkiem tego jest przyspieszona obsługa skryptu (jego wykonanie) jak i szybsze wczytanie pliku se skryptem lub strony z osadzonym skryptem w znacznikach <script></script> co powoduje także zmniejszenie zużycia transferu, który jest wymagany do wysłania nie skompresowanego kodu w pliku do klienta (przeglądarki).

Działanie można przetestować na: Kompresja JavaScript

Aktualnie usuwane lub zamieniane są zbędne rzeczy takie jak

  • Tabulator Pionowy – vertical tab – 0×0B (\x0B)
  • Znak powrotu karetki – 0×0D (\r, \x0D)
  • Tabulatory zmienia na pojedynczą spację – TAB – 0×09 (\t, \x09)
  • Każdą podwójną spację (i więcej np. 3, 4 i tak dalej) zamienia na pojedynczą 0×20 – (\x20)
  • Wszystkie komentarze
  • Pojedyncze spacje tylko w określonych miejscach (określonych w zmiennej $char_js)
  • Ewentualnie przejścia do nowych linii – 0×0A (\n, \x0A)

Domyślnie nie są usuwane spacje powiązane ze zmienną $char_js oraz przejścia do nowych linii!!! Można uzyskać ten efekt przekazując odpowiednie wartości do funkcji.

function compress_javascript($js_code,$special_chars=false,$remove_new_lines=false) {
/*********************
//
//Compress JavaScript by tosiek - https://tosiek.pl/
//
*********************/
//
// Arrays
//
//array with pattern
	$pattern=array(
		//remove carriage return
		"/\x0D/",
		//remove vertical tab
		"/\x0B/",
		//Replace tabulators to one space
		"/\x09{1,}/si",
		//Replace more then one spaces to once
		"/\x20{2,}/",
		//Remove JS comments and HTML
		'/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/','/<!--.*?-->/si',
	);
	if($special_chars==true) {
	//Special JavaScript characters after and before the spaces are removed
		$char_js='(|)|=|;|:|?|\'|"|+|-|\*|\/|%|!|<|>|&|\|[|]|{|}';
		//remove spaces with $char_js, after and before
		$pattern[]="/([{$char_js}]+)\x20/";
		$pattern[]="/\x20([{$char_js}]+)/";
	}
	if($remove_new_lines==true) {
		$pattern[]="/\x0A/";
	}
	//array with replacement
	$replacement=array(
		//remove carriage return
		'',
		//remove vertical tab
		'',
		//Replace tabulators to one space
		"\x20",
		//Replace more then one spaces to once
		"\x20",
		//Remove JS comments and HTML
		'','',
	);
	if($special_chars==true) {
	//remove spaces with $char_js, after and before
		$replacement[]='$1';
		$replacement[]='$1';
	}
	if($remove_new_lines==true) {
		$replacement[]='';
	}
	$start=strlen($js_code);
	//Compress JS with regular expressions
	$replace=preg_replace($pattern,$replacement,$js_code,-1);
	// strlen() after compress
	$final=strlen($replace);
	//counts the difference in characters
	$exhed=$start-$final;
	//counts the difference in percentages
	$compression=round(($exhed)/$start*100,2);
	return $replace."\n//Before compress $start bytes; After compress: $final bytes; $exhed ({$compression}%)";
}

Przykładowe użycie funkcji bez dodatkowych wartości (bez usuwania spacji oraz nowych linii)

<?php
$code='if ( top.location  !=  self.location   )
	{ 
top.location.href =  self.location;
}';
$code = compress_javascript($code);
echo $code;
?>

Wyświetli nam:

if ( top.location != self.location )
 { 
top.location.href = self.location;
}
//Before compress 82 bytes; After compress: 77 bytes; 5 (6.09999999999999964472863%)

Lecz nadal widać zbędne spację więc podajmy funkcji jako drugi argument wartość prawda (true) co spowoduje usunięcie zbędnych spacji przy znakach specjalnych

$code = compress_javascript($code,1);

Da nam efekt:

if(top.location!=self.location)
{
top.location.href=self.location;
}
//Before compress 82 bytes; After compress: 68 bytes; 14 (17.0700000000000002842171%)

Do zupełnej kompresji kodu możemy dodać trzeci argument, który usuwa znaki nowych linii (tylko dla znawców JavaScript)

Usuwanie znaków specjalnych i nowych linii

$code = compress_javascript($code,1,1);

da efekt:

if(top.location!=self.location){top.location.href=self.location;}
//Before compress 82 bytes; After compress: 65 bytes; 17 (20.7300000000000004263256%)

Usuwanie nowych linii, bez usuwania spacji obok znaków specjalnych

$code = compress_javascript($code,0,1);

da efekt:

if ( top.location != self.location ) { top.location.href = self.location;}
//Before compress 82 bytes; After compress: 74 bytes; 8 (9.75999999999999978683718%)