luq techblog

o tworzeniu słów kilka…

Ukrywanie plików dla innych serwerów… 7 Maj 2010

Filed under: Ajax,JS,PHP,Security,Web — Łukasz @ 09:31
Tags: ,

Wczoraj, na forum.php.pl pojawiło się pytanie dotyczące tego jak ukryć dane z pliku *.js, tak żeby user nie mógł ich podejrzeć. Oczywiście odpowiedzią na te pytanie, jest krótkie „nie da się”, ale można zrobić kilka rzeczy aby utrudnić podejrzenie pliku czy uniemożliwić użycie go na innym serwerze, w sposób:

 

<script type="text/javascript" src="http://www.example.com/file.js"></script>

 

O tym właśnie jest ten wpis.

 

Dla przykładu załóżmy, że mamy na domenie http://www.example.com wrzucony plik file.js,

alert(123);

który chcemy ukryć przed osobami wpisującymi w przeglądarkę adres: http://www.example.com/file.js.
Mamy też plik index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
	<script type="text/javascript" src="./file.js"></script>
</head> 
<body>
	
</body>
</html>

Standardowo Apache ustawiony jest tak, że jedynie pliki z rozszerzeniem *.php *.php3 *.php4 *.php5 lub *.phtml przechodzą przez parser PHP. Oczywiście można to łatwo zmienić, edytując plik httpd.conf. Wystarczy, że dodamy do linijki AddType ” .js”, tak aby wyglądało to w ten sposób:

AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml .js

Teraz pliki z rozszerzeniem *.js będą najpierw parsowane przez interpreter PHP, a dopiero potem wyświetlone czy użyte w jakiś inny sposób. A więc możemy pisać w PHP, co nam to daję? Dużo ;) Wystarczy tylko rozpoznać czy odwołanie do pliku wystąpiło pośrednio (user wywołał index.html, a ten wysłał zapytanie o file.js, bo go potrzebuje) czy bezpośrednio (user wpisał w adresie przeglądarki http://www.example.com/file.js). Rozpoznać to bardzo prosto, a z pomocą nam idzie tablica $_SERVER. W kluczu HTTP_REFERER, przechowywany jest adres z którego nastąpiło wywołanie.

Z manuala PHP:

The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted.

a więc trzeba pamiętać, że przeglądarka może taką zmienną ustawiać ale nie musi.

 

Do file.js wpisujemy:

<?php
	if( $_SERVER[ 'HTTP_REFERER' ] ){
        ?>

		alert(123);

        <?php
	}
?>

Teraz wpisując w przeglądarce http://www.example.com/file.js otrzymamy pustą stronę. Natomiast odwołując się do index.html powita nas alert.

 

W taki sposób można też zablokować aby inne serwery nie mogły wykorzystywać naszych plików. Edytujemy plik file.js:

<?php
	$ref = $_SERVER[ 'HTTP_REFERER' ];
	$parse = parse_url( $ref );

	if( $_SERVER[ 'HTTP_HOST' ] == $parse['host'] ){
	?>

		alert(123);

	<?php
	}
?>

Natomiast zawszę będzie można podejrzeć pliki *.js. Wszystkie próby są na nic, bo przecież jeśli index.html potrzebuje file.js to musi wysłać zapytanie po niego. W odpowiedzi zwrotnej wysyłane są dane tego pliku, i jeśli te dane są wysłane do przeglądarki to można je podejrzeć, np. Firebugiem. Możnaby szyfrować, ale przeglądarka musi rozumieć kod co wymagałoby deszyfrowania po jej stronie, co skutkowałoby tym, że dostalibyśmy czysty kod. Tak samo jak nigdy nie zabezpieczy się obrazków na stronie, tak żeby uniemożliwić ich kopiowania. Jeśli coś zostało wyświetlone na ekranie to można to mieć, chociażby przez naciśnięcie magicznego klawisza [Print/SysRq]

Reklamy
 

2 Responses to “Ukrywanie plików dla innych serwerów…”

  1. Kamil Says:

    W ostatnim listingu mogłeś od razu dać:
    if( $_SERVER[ ‚HTTP_HOST’ ] == parse_url($url, PHP_URL_HOST) ){
    choć to mało istotny szczegół :-)

    Pozdrawiam

  2. luq Says:

    Tak, masz rację Kamil, bardziej optymalnie bo nie marnujemy tyle pamięci ;)


Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s