|
|
PHP (angielski akronim rekurencyjny, którego rozwinięcie to PHP Hypertext Preprocessor), pierwotnie nazwany Personal
Home Page - skryptowy język programowania, służący przede wszystkim do tworzenia dynamicznych stron WWW i wykonywany w
tym przypadku po stronie serwera, z możliwością zagnieżdżania w HTML (bądź XHTML). PHP jest podobny w założeniach do
dużo starszego mechanizmu SSI (Server Side Includes), jednak jest w stosunku do SSI nieporównanie bardziej rozbudowany.
Udostępniany jest na zasadach licencji open-source. Jego składnia bazuje na językach C, Java i Perl.
SQL (ang. Structured Query Language) to strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz
do umieszczania i pobierania danych z baz danych.
Język SQL jest językiem deklaratywnym. Decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi
zarządzania bazą danych DBMS.
Jest to język programowania opracowany w latach siedemdziesiątych w firmie IBM. Stał się on standardem w komunikacji z
serwerami relacyjnych baz danych. Wiele współczesnych systemów relacyjnych baz danych używa do komunikacji z
użytkownikiem SQL, dlatego mówi się, że korzystanie z relacyjnych baz danych, to korzystanie z SQL-a.
Apache jest otwartym serwerem HTTP dostępnym dla wielu systemów operacyjnych (m.in. UNIX, GNU/Linux, BSD,
Microsoft Windows). Po angielsku słowo Apache wymawia się epaczi, co brzmi tak samo jak a patchy (server), co było
określeniem tego serwera we wczesnym stadium jego rozwoju w 1995 roku, kiedy był on głównie zbiorem poprawek (patch)
nałożonych na serwer HTTP o nazwie NCSA.
Apache jest najszerzej stosowanym serwerem HTTP w Internecie. W maju 2003 jego udział wśród serwerów wynosił 62%. W
połączeniu z interpreterem języka skryptowego PHP i bazą danych MySQL, Apache stanowi jedno z najczęściej spotykanych
środowisk w firmach oferujących miejsce na serwerach sieciowych.
|
PHP is subject to the security built into most server
systems with respect to permissions on a file and directory
basis. This allows you to control which files in the filesystem
may be read. Care should be taken with any files which are
world readable to ensure that they are safe for reading by all
users who have access to that filesystem.
Since PHP was designed to allow user level access to the
filesystem, it's entirely possible to write a PHP script that
will allow you to read system files such as /etc/passwd, modify
your ethernet connections, send massive printer jobs out, etc.
This has some obvious implications, in that you need to ensure
that the files that you read from and write to are the
appropriate ones.
Consider the following script, where a user indicates that
they'd like to delete a file in their home directory. This
assumes a situation where a PHP web interface is regularly used
for file management, so the Apache user is allowed to delete
files in the user home directories.
Przykład 26-1. Poor variable checking leads
to....
<?php // remove a file from the user's home directory
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ("$homedir/$userfile");
echo "$file_to_delete has been deleted!";
?> |
|
Since the username is postable from a user form, they
can submit a username and file belonging to someone else, and
delete files. In this case, you'd want to use some other form
of authentication. Consider what could happen if the variables
submitted were "../etc/" and "passwd". The code would then
effectively read:
Przykład 26-2. ... A filesystem attack
<?php // removes a file from anywhere on the hard drive that
// the PHP user has access to. If PHP has root access:
$username = "../etc/"; $homedir = "/home/../etc/"; $file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo "/home/../etc/passwd has been deleted!";
?> |
|
There are two important measures you should take to
prevent these issues.
Here is an improved script:
Przykład 26-3. More secure file name
checking
<?php // removes a file from the hard drive that
// the PHP user has access to. $username = $_SERVER['REMOTE_USER']; // using an authentication mechanisim
$homedir = "/home/$username";
$file_to_delete = basename("$userfile"); // strip paths
unlink ($homedir/$file_to_delete);
$fp = fopen("/home/logging/filedelete.log","+a"); //log the deletion
$logstring = "$username $homedir $file_to_delete";
fwrite ($fp, $logstring); fclose($fp);
echo "$file_to_delete has been deleted!";
?> |
|
However, even this is not without it's flaws. If your
authentication system allowed users to create their own user
logins, and a user chose the login "../etc/", the system is
once again exposed. For this reason, you may prefer to write a
more customized check:
Przykład 26-4. More secure file name
checking
<?php
$username = $_SERVER['REMOTE_USER']; // using an authentication mechanisim
$homedir = "/home/$username";
if (!ereg('^[^./][^/]*$', $userfile))
die('bad filename'); //die, do not process
if (!ereg('^[^./][^/]*$', $username))
die('bad username'); //die, do not process
//etc... ?> |
|
Depending on your operating system, there are a wide variety
of files which you should be concerned about, including device
entries (/dev/ or COM1), configuration files (/etc/ files and
the .ini files), well known file storage areas (/home/, My
Documents), etc. For this reason, it's usually easier to create
a policy where you forbid everything except for what you
explicitly allow.
|