Создание безопасных программ
Создание безопасных программ подразумевает рассказ не столько о том, что надо делать, сколько о том, чего делать нельзя. РНР проектировался так, чтобы упростить его применение в качестве языка веб-программирования. Некоторые функции, введенные для облегчения труда программиста, могут при бесконтрольном применении сделать программы
В последнее время разработчики РНР стараются по умолчанию отключать некоторые функции и предъявляют требования к программированию в стиле, лучше учитывающем соображения безопасности. Есть несколько главных областей, в которых часто совершают ошибки, ведущие к появлению небезопасных программ. Мы рассмотрим эти ошибки и укажем способы их предотвращения.
Небезопасность 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, и секретная страница будет выдана без всякой регистрации.