Автор работы: Пользователь скрыл имя, 27 Ноября 2013 в 09:48, контрольная работа
Внутри PHP-скрипта имеется несколько способов получения доступа к данным, переданным клиентом по протоколу HTTP. До версии PHP 4.1.0 доступ к таким данным осуществлялся по именам переданных переменных (данные передаются в виде пар «имя переменной, символ «=», значение переменной»). Если было передано first_name=Nina, то внутри скрипта появлялась переменная $first_name со значением Nina.
I. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ…………………………………………………………………..3
1. ОБРАБОТКА ЗАПРОСОВ С ПОМОЩЬЮ PHP……………………………………………3
2. ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ ПРИ ИСПОЛЬЗОВАНИИ
МЕХАНИЗМА СЕССИЙ………………………………………………………………………..6
II. ПРАКТИЧЕСКАЯ ЧАСТЬ…………………………………………………………………...8
СОДЕРЖАНИЕ
I. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ…………………………………………………………………
1. ОБРАБОТКА ЗАПРОСОВ
С ПОМОЩЬЮ PHP……………………………………………
2. ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ ПРИ ИСПОЛЬЗОВАНИИ
МЕХАНИЗМА СЕССИЙ………………………………………………………………
II. ПРАКТИЧЕСКАЯ ЧАСТЬ…………………………………………………………………
I.ТЕОРЕТИЧЕСКАЯ ЧАСТЬ
1.ОБРАБОТКА ЗАПРОСОВ С ПОМОЩЬЮ PHP
Внутри PHP-скрипта имеется несколько способов получения доступа к данным, переданным клиентом по протоколу HTTP. До версии PHP 4.1.0 доступ к таким данным осуществлялся по именам переданных переменных (данные передаются в виде пар «имя переменной, символ «=», значение переменной»). Если было передано first_name=Nina, то внутри скрипта появлялась переменная $first_name со значением Nina. Если требовалось различать, каким методом были переданы данные, то использовались ассоциативные массивы $HTTP_POST_VARS и $HTTP_GET_VARS, ключами которых являлись имена переданных переменных, а значениями – соответственно значения этих переменных. Таким образом, если пара first_name=Nina передана методом GET, то $HTTP_GET_VARS ["first_name"]="Nina".
Использовать в программе
Допустим, мы создали форму для регистрации участников заочной школы программирования. Тогда в файле, обрабатывающем эту форму, можно написать следующее:
<?php
$str = "Здравствуйте, ".
$_REQUEST["first_name"]. " ".
$_REQUEST["last_name"]."! <br>";
$str .="Вы изучаете ".
$_REQUEST["kurs"]; echo $str;
?>
Тогда, если в форму мы ввели имя «Вася», фамилию «Петров» и выбрали среди всех курсов - PHP, на экране браузера получим сообщение:
Здравствуйте, Вася Петров! Вы изучаете PHP
После введения массива $_REQUEST массивы $HTTP_POST_VARS и $HTTP_GET_VARS для однородности были переименованы в $_POST и $_GET соответственно, но сами они из обихода не исчезли из соображений совместимости с предыдущими версиями PHP. В отличие от своих предшественников, массивы $_POST и $_GET стали суперглобальными, т.е. доступными напрямую и внутри функций и методов.
Приведем пример использования этих массивов. Допустим, нам нужно обработать форму, содержащую элементы ввода с именами first_name, last_name, kurs. Данные были переданы методом POST, и данные, переданные другими методами, мы обрабатывать не хотим. Это можно сделать следующим образом:
<?php $str = "Здравствуйте, ".
$_POST ["first_name"]." ".
$_POST ["last_name"] ."! <br>";
$str .= "Вы изучаете ".
$_POST["kurs"]; echo $str;
?>
Тогда на экране браузера, если мы ввели имя «Вася», фамилию «Петров» и выбрали среди всех курсов курс по PHP, увидим сообщение:
Здравствуйте, Вася Петров! Вы изучаете PHP
Для того, чтобы сохранить возможность обработки скриптов более ранних версий, чем PHP 4.1.0, была введена директива register_globals, разрешающая или запрещающая доступ к переменным непосредственно по их именам. Если в файле настроек PHP параметр register_globals=On, то к переменным, переданным серверу методами GET и POST, можно обращаться просто по их именам (т.е. можно писать $first_name). Если же register_globals=Off, то нужно писать $_REQUEST["first_name"] или $_POST ["first_name"], $_GET["first_name"], $HTTP_POST_VARS ["first_name"], $HTTP_GET_VARS ["first_name"]. С точки зрения безопасности эту директиву лучше отключать (т.е. register_globals=Off). При включенной директиве register_globals перечисленные выше массивы также будут содержать данные, переданные клиентом.
Иногда возникает необходимость узнать значение какой-либо переменной окружения, например метод, использовавшийся при передаче запроса или IP-адрес компьютера, отправившего запрос. Получить такую информацию можно с помощью функции getenv(). Она возвращает значение переменной окружения, имя которой передано ей в качестве параметра.
<? getenv('REQUEST_METHOD');
// возвратит использованный метод echo getenv ('REMOTE_ADDR');
// выведет IP-адрес пользователя,
// пославшего запрос
?>
Использование функции getenv()
Если используется метод GET, то данные передаются добавлением строки запроса в виде пар «имя_переменной=значение к URL-адресу ресурса». Все, что записано в URL после знака вопроса, можно получить с помощью команды: getenv('QUERY_STRING');
Благодаря этому можно по методу GET передавать данные в каком-нибудь другом виде. Например, указывать только значения нескольких параметров через знак плюс, а в скрипте разбирать строку запроса на части или можно передавать значение всего одного параметра. В этом случае в массиве $_GET появится пустой элемент с ключом, равным этому значению (всей строке запроса), причем символ «+», встретившийся в строке запроса, будет заменен на подчеркивание «_».
Методом POST данные передаются только с помощью форм, и пользователь (клиент) не видит, какие именно данные отправляются серверу. Чтобы их увидеть, хакер должен подменить нашу форму своей. Тогда сервер отправит результаты обработки неправильной формы не туда, куда нужно. Чтобы этого избежать, можно проверять адрес страницы, с которой были посланы данные. Это можно сделать с помощью функции getenv():
getenv('HTTP_REFERER');
2.ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ ПРИ ИСПОЛЬЗОВАНИИ
МЕХАНИЗМА СЕССИЙ
Использование механизма сессий не гарантирует полной безопасности системы. Для этого нужно принимать дополнительные меры. Обратим внимание на проблемы с безопасностью, которые могут возникнуть при работе с сессиями и, в частности, с теми программами, что мы написали.
Во-первых, опасно передавать туда-сюда пароль, его могут перехватить. Кроме того, мы зарегистрировали его как глобальную переменную сессии, значит, он сохранился в cookies на компьютере-клиенте. Это тоже плохо. И вообще, пароли и логины должны храниться в базе данных. Пусть информация о пользователях хранится в базе данных "test" (в таблице "users"), а мы имеем к ней доступ под логином my_user и паролем my_passwd.
Во-вторых, что делать, если кто-то написал скрипт подбора пароля для секретной страницы? В этом случае на страницу авторизации много раз должен стучаться какой-то посторонний скрипт. Поэтому нужно просто проверять, с нашего ли сайта пришел запрос на авторизацию, и если нет, то не пускать его дальше. Адрес страницы, с которой поступил запрос, можно получить с помощью глобальной переменной $_SERVER['HTTP_REFERER']).
<?
session_start();
// создаем новую сессию или // восстанавливаем текущую $conn = mysql_connect("localhost", "my_user","my_passwd");
// устанавливаем соединение с сервером БД mysql_select_db("test");
// выбираем рабочую
базу данных $SERVER_ROOT = "http://localhost/~nina/tasks/
// где находятся наши скрипты
/* с помощью регулярного
выражения ^$SERVER_ROOT и функции eregi
проверяем, начинается ли
if (!isset($_POST['go'])){ echo "<form method=POST > Login:
<input type=text name=login> Password:
<input type=password name=passwd>
<input type=submit name=go value=Go> </form>";
}else {
/* запрос к базе
данных: выбираем из таблицы users
login, который совпадает с
$sql = "SELECT login FROM users WHERE login='" . $_POST['login'] . "' AND passwd='" . $_POST['passwd'] . "';"; $q = mysql_query($sql,$conn); // отправляем запрос к БД $n = mysql_num_rows($q);
// число строк в ответе на запрос if (!$n==0){
$_SESSION['user_login']=$_
else echo "Неверный ввод, попробуйте еще раз<br>"; }
print_r($_SESSION); // выводим все переменные сессии }
?>
Первые две проблемы решены. Но есть еще одна. Что делать, если хакер просто допишет в строку запроса значение какой-нибудь глобальной переменной (например, логина)? Вообще это возможно, только если register_globals=On. Просто иначе мы используем для работы с глобальными переменными массив $_SESSION и с ним такие фокусы не проходят. Все же попробуем решить и эту проблему. Для этого нужно очистить строку запроса перед тем, как сравнивать значения параметров. То есть сначала сбросим значение $user_login. Потом данную переменную нужно опять зарегистрировать, но не как новую, а как уже существующую. Для этого знак доллара при регистрации НЕ опускается. Вот что получилось:
<?php
unset($user_login); // уничтожаем переменную session_start();
// создаем новую сессию или // восстанавливаем текущую session_register($user_login); // регистрируем переменную // как уже существующую if (!($user_login=="pit")) // проверяем логин Header("Location: authorize.php");
// если ошибка, то перенаправляем // на страницу авторизации
?>
<html>
<head>
<title>Secret info</title>
</head> ... // здесь располагается // секретная информация :)
</html>
II.ПРАКТИЧЕСКАЯ ЧАСТЬ
INDEX
<html xmlns="http://www.w3.org/1999/
<head>
<title>Этапы строительства загородного дома | Характеристики грунтов </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Style-
<meta name="description" content="Выбор участка под строительство загородного дома" />
<meta name="keywords" content="строительство, дом, земельный участок" />
<link href="css/style.css" rel="stylesheet" type="text/css" />
<link href="css/layout.css" rel="stylesheet" type="text/css" />
<!--[if lt IE 8]>
<link href="css/ie_style.css" rel="stylesheet" type="text/css" />
<![endif]-->
<!--[if lte IE 7]>
<script type="text/javascript" src="js/ie_png.js"></script>
<script type="text/javascript">
ie_png.fix('.png, .box .bg, .box .extra-bg, .box .bottom, #content.top-bg')
</script>
<![endif]-->
</head>
<body id="page1">
<div class="tail-top">
<div class="tail-bottom">
<div id="main">
<!-- header -->
<div id="header">
<div class="row-1"></div>
<div class="row-2">
<div class="indent">
<div id="logo"></div>
</div>
</div>
<div class="row-3">
<div class="slogan">
<span class="style1">Строительство</
<span class="style2">Загородного </
<span class="style3">Дома</span>
</div>
</div>
</div>
<!-- content -->
<div id="content">
<!-- box begin -->
<div class="box">
<div class="bg">
<div class="extra-bg">
<div class="inner">
<div class="img-indent">
<img alt="" src="images/1page-img1.jpg" />
<h1>Этапы строительства загородного дома. <br />
Характеристики грунтов. </h1>
<br />
В этой статье Вы найдёте общие рекомендации по этапам строительства загородного дома. Итак, свой участок земли у Вас уже есть, что надо делать дальше? </p>
<p> Предположим, что Вы решили, из какого материала будет дом (кирпич, газобетонные или пенобетонные блоки, несъемная опалубка, каркасный или каркасно-щитовой дом, брус или оцилиндрованное бревно). Перед выбором проекта дома обратите внимание на саму землю, а именно на ее характеристики: состав грунтов, уровень грунтовых вод. Важны также характеристики самого земельного участка, который может быть ровным, с наклоном, с перепадом высот, узким и т.д. Обладая этими знаниями, Вы уже сможете подбирать готовый проект дома или обращаться в архитектурное бюро, которое будет проектировать Ваш дом, исходя из характеристик участка земли. Среди застройщиков, к примеру, распространена следующая ошибка: многие покупали проект дома с подвалом, а когда дело доходило до строительства, выяснялось что на участке высокий уровень грунтовых вод. Комплекс мер по гидроизоляции фундамента и сам фундамент требовали значительных материальных вложений, на которые заказчик не рассчитывал. Средняя стоимость проведения геодезических работ составляет примерно около 2 тыс. долларов. <br />