Аргерих Л. О языке РНР. Часть 5. Страница 83


Создание безопасных программ

Создание безопасных программ подразумевает рассказ не столько о том, что надо делать, сколько о том, чего делать нельзя. РНР проектировался так, чтобы упростить его применение в качестве языка веб-программирования. Некоторые функции, введенные для облегчения труда программиста, могут при бесконтрольном применении сделать программы

В последнее время разработчики РНР стараются по умолчанию отключать некоторые функции и предъявляют требования к программированию в сти­ле, лучше учитывающем соображения безопасности. Есть несколько глав­ных областей, в которых часто совершают ошибки, ведущие к появлению небезопасных программ. Мы рассмотрим эти ошибки и укажем способы их предотвращения.

Небезопасность register_globals

Одной из самых удобных и опасных характеристик РНР является возмож­ность пользоваться переменными, которые не были явно определены. Это

очень популярная функция РНР, но в сочетании с установкой register_glo- bals может создать проблему безопасности вашего приложения.

Рассмотрим следующий короткий сценарий. Он принимает имя пользовате­ля и пароль из веб-формы. Затем он аутентифицирует пользователя и в слу­чае успеха разрешает ему доступ к специальной странице HTML:

<?php

if (isset($user)) {

if ($user == "admin") { :

if ($pass == "password") { $loggedin = 1;

}

)

:

if (Sloggedin == 1) {

include("secretpage.html"); exit;

} ?>

<html> <head>

<title>Login</title> </head> •:'.;' <body>

<form method="get" action="<?php echo($PHP_SELF) ?>"> <input type="test" name="user"> <input type="password" name="pass"> <input type="submit" value="Login"> </form> </body> </html>

Нетренированный взгляд не обнаружит ничего дурного в этом маленьком сценарии, но он создает огромную брешь в системе защиты. Обычный пода­ваемый запрос на регистрацию имеет вид http://www.yourdomain.com/"> http://www.yourdomain.com/ test.php?user=admin&pass=password. После этого Sloggedin устанавливается в 1, и мы включаем страницу secretpage. html.

Проблема в том, что пользователю не обязательно ограничиваться передачей значений user и pass; он может дописать к строке запроса все, что угодно. На­пример, можно послать запрос http://www.yourdomain.com/test.,php?logge-"> http://www.yourdomain.com/test.,php?logge- din=l. При выполнении такого запроса условие в операторе if (Sloggedin == 1) будет иметь значение true, и секретная страница будет выдана без всякой ре­гистрации.