Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы WEB 2

.0.pdf
Скачиваний:
63
Добавлен:
16.05.2015
Размер:
809.61 Кб
Скачать

Очень важно, что в составе строки SQL-запроса могут присутствовать имена переменных, которые при вызове преобразуются в значения, которые имеют эти переменные. Например

“INSERT INTO Subscriber(name,email) VALUES($sname,$semail)”

Эти правила работают не только в SQL-запросах, но и во всех других операциях со строками.

При выполнении запроса “SELECT” функция mysql_query возвращает идентификатор результата (выборки), который можно использовать для получения данных этого запроса.

$query = "SELECT last_name, first_name FROM friends"; $result = mysql_query ($query) {

Для получения количества извлеченных полей используется функция: int mysql_num_fields(int result);

Для получения количества записей (строк) результата используется функция: int mysql_num_rows(int result);

Для обработки полученной выборки (результата) используется целый набор функций: int mysql_result(int result, int row, mixed [field] );

first_name = mysql_result( $result, 1, mixed [field] );

Возвращает значение указанного поля текущей записи полученной выборки. row – индекс, имя поля, либо алиас.

Большую эффективность и удобство при обработке результатов дают функции целой строки: array mysql_fetch_row(int result); // возвращает текущую запись в виде массива

$row = mysql_fetch_row($result); printf(“Имя-%s\n”, $row[1]);

array mysql_fetch_array (int result); // возвращает текущую запись в виде массива и $row = mysql_fetch_array($result);

printf(“Имя-%s\n”, $row[“first_name”]);

object mysql_fetch_object(int result, int [result_typ] );

возвращает запись в виде объекта: позволяет обращаться к полям по индексам $row = mysql_fetch_object ($result); printf(“Имя-%s\n”, $row->first_name);

При получении записей из результата с помощью функций fetch курсор перемещается на следующую запись. Установить курсор можно принудительно, использую функцию:

int mysql_data_seek(int result_identifier, int row_number);

Спозиционировать курсор можно на произвольное поле: int mysql_field_seek(int result, int field_offset);

После завершения обработки результата его необходимо удалить (происходит очистка памяти): int mysql_free_result(int result);

Пример вывода всех строк рзультата while($row = mysql_fetch_array($result)) { echo $row["user_id"];

echo $row["fullname"];

}

mysql_free_result($result);

Несколько функций позволяют получить информацию о структуре БД, таблицах и полях: int mysql_list_dbs(int [link_identifier] ); // Получить список БД MySQL доступных на сервере

Поолучить список таблиц конкретной БД:

int mysql_list_tables(string database, int [link_identifier] );

Поолучить список полей таблицы:

int mysql_list_fields(string database_name, string table_name, int [link_identifier] ); string mysql_tablename(int result, int i); // Возвращает имя таблицы

$result = mysql_list_tables("BSTU"); $i = 0;

while ($i < mysql_num_rows ($result)) { $tb_names[$i] = mysql_tablename ($result, $i); echo $tb_names[$i] . "<BR>";

$i++;

}

Следующее семейство функций имеет одинаковый синтаксис: Mysql_filed_имя(int result, int field_offset);

mysql_field_table – возвращает имя таблицы, которой принадлежит поле mysql_field_name – возвращает имя поля,

mysql_field_type – возвращает тип поля ("int", "real", "string", "blob",)

mysql_field_flags — возвращает строку установленных флагов (not_null", "primary_key", т.д.) mysql_field_len – возвращает длину поля

Функции обработки ошибок

string mysql_errno(int [link_identifier] ); // Возвоашает номер ошибки

string mysql_error(int [link_identifier] ); // Возвоашает текстовое сообщение об ошибке

23. Объектно–ориентированная модель PHP: ключевые особенности классической и современной моделей.

PHP поддерживает широкие объектно-ориентированные возможности, полная поддержка которых была введена в пятой версии языка.

Класс - это базовое понятие в объектно-ориентированном программировании (ООП). Классы образуют синтаксическую базу ООП. Их можно рассматривать как своего рода "контейнеры" для логически связанных данных и функций (обычно называемых методами). Если сказать проще, то класс - это своеобразный тип данных.

Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки. Свойства и методы называются членами класса. Вообще, объектом является все то, что поддерживает инкапсуляцию.

Если класс можно рассматривать как тип данных, то объект — как переменную (по аналогии). Скрипт может одновременно работать с несколькими объектами одного класса, как с несколькими переменными.

Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет. Открытые данные и члены класса являются доступными для других частей программы, которые не являются частью объекта. А вот закрытые данные и члены класса доступны только внутри этого объекта.

PHP поддерживает классы. Методы и поля класса могут быть общедоступными (public, по умолчанию), защищёнными (protected) и скрытыми (private). PHP поддерживает все три основных механизма ООП — инкапсуляцию, полиморфизм и наследование (родительский класс указывается с помощью ключевого слова extends после имени класса). Поддерживаются интерфейсы (ставятся в соответствие с помощью implements). Разрешается объявление финальных, абстрактных методов и классов. Множественное наследование классов не поддерживается, однако класс может реализовывать несколько интерфейсов. Для обращения к методам родительского класса используется ключевое слово parent.

Экземпляры класса создаются с помощью ключевого слова new, обращение к полям и методам объекта производится с использованием оператора ->. Для доступа к членам класса из его методов используется переменная $this.

Описание классов

Описание классов в PHP начинаются служебным словом class: class Имя_класса {

// описание членов класса - свойств и методов для их обработки

}

Для объявления объекта необходимо использовать оператор new: Объект = new Имя_класса;

Данные описываются с помощью служебного слова var. Метод описывается так же, как и обыкновенная пользовательская функция. Методу также можно передавать параметры.

Пример класса на PHP: <?php

//Создаем новый класс Coor: class Coor {

//данные (свойства):

var $name; var $addr;

// методы: function Name() {

echo "<h3>John</h3>";

}

}

// Создаем объект класса Coor: $object = new Coor;

?> Для получения доступа к членам класса предназначен оператор ->. Приведем пример:

$object -> Name();

Чтобы получить доступ к членам класса внутри класса, необходимо использовать указатель $this, который всегда относится к текущему объекту. Модифицированный метод Getname():

function Getname() { echo $this->name;

}

Конструкторы

Конструктор представляет собой метод, который задает значения некоторых свойств (а также может вызывать другие методы). Конструкторы вызываются автоматически при создании новых объектов. Чтобы это стало возможным, имя метода-конструктора должно совпадать с именем класса, в котором он содержится. Пример конструктора:

<?

class Webpage { var $bgcolor;

function Webpage($color) { $this->bgcolor = $color;

}

}

// Вызвать конструктор класса Webpage $page = new Webpage("brown");

?>

PHP 5 позволяет объявлять методы-конструкторы. Классы, в которых объявлен метод-констуктор, будут вызывать этот метод при каждом создании нового объекта, так что это может оказаться полезным, чтобы, например, инициализировать какое-либо состояние объекта перед его использованием. Конструктор, ранее совпадавший с названием класса, теперь необходимо объявлять как __construct(), что позволит легче перемещать классы в иерархиях. Конструкторы в классах-родителях не вызываются автоматически. Чтобы вызвать конструктор, объявленный в родительском классе, следует обратиться к методу parent::__construct().

<?php

class BaseClass { function __construct() {

print "Конструктор класса BaseClass\n";

}

}

Поддержка деструктора для класса, определяемого как метод __destructor()

PHP 5 предоставляет концепцию деструкторов, сходную с теми, что применяются в других ОО языках, таких, как Java: когда освобождается последняя ссылка на объект, перед высвобождением памяти, занимаемой этим объектом, вызывается метод __destruct(), не принимающий параметров.

<?php

class MyDestructableClass { function __construct() {

print "Конструктор\n";

$this->name = "MyDestructableClass";

}

function __destruct() {

print "Уничтожается " . $this->name . "\n";

}

}

$obj = new MyDestructableClass(); ?>

Как и в случае с конструкторами, деструкторы, объявленные в родительском классе, не будут вызваны автоматически. Для вызова деструктора, объявленном в классе-родителе, следует обратиться к методу parent::__destruct().

• Константы класса В определения классов можно включить константы, и ссылаться на них, используя объект. Константы также

могут быть объявлены и в пределах одного класса. Отличие переменных и констант состоит в том, что при объявлении последних или при обращении к ним не используется символ $. Как и свойства и методы, значения констант, объявленных внутри класса, не могут быть получены через переменную, содержащую экземпляр этого класса.

<?php

class MyClass {

const SUCCESS = "Success"; const FAILURE = "Failure";

}

print MyClass::SUCCESS; ?> Статические члены класса

Определения классов могут теперь включить статических членов класса (свойства и методы), доступ к которым осуществляется через класс. Общее использование статических членов показано на примере:

<?php

class Singleton {

static private $instance = NULL;

private function __construct() {

}

static public function getInstance() { if (self::$instance == NULL) {

self::$instance = new Singleton();

}

return self::$instance;

}

}

?> Статические методы

Вы можете теперь определить методы как статические, разрешая им быть вызванными вне контекста объекта. Статические методы не определяются через переменную $this, поскольку они не должны быть ограничены определенным объектом.

<?php

class MyClass {

static function helloWorld() { print "Hello, world";

}

}

MyClass::helloWorld();

?> Явное клонирование объекта

Копия объекта создается с использованием вызова clone (который вызывает метод __clone() объекта, если это возможно). Вы можете объявить метод __clone(), который будет вызван при клонировании объекта (после того, как все свойства будут скопированы из исходного объекта).

copy_of_object = clone $object; <?php

class MyClass { function __clone() {

print "Объект был клонирован ";

}

}

$obj = new MyClass(); clone $obj;

?> Наследование - это не просто создание точной копии класса, а расширение уже существующего класса, чтобы

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

Теперь на практике рассмотрим, что же представляет собой наследование (или расширение возможностей) классов:

<?php

class B extends A {

function B(параметры_для_A, другие_параметры) { $this->A(параметры_для_A);

// инициализируем другие поля B

}

function TestB() { ... } function Test() { ... }

}

?>

Наследование

Ключевое слово extends говорит о том, что создаваемый класс является лишь "расширением" класса A, и не более того. То есть B содержит те же самые свойства и методы, что и A, но, помимо них и еще некоторые дополнительные, "свои".

Теперь "часть A" находится прямо внутри класса B и может быть легко доступна, наравне с методами и свойствами самого класса B. Например, для объекта $obj класса B допустимы выражения $obj->TestA() и $obj- >TestB().

Немного о терминологии: родительский класс A принято называть базовым классом, а класс дочерний класс B

— производным от A. Иногда базовый класс также называют суперклассом, а производный — подкласcом.

Полиморфизм (многоформенность) является следствием идеи наследования. В общих словах, полиморфность класса — это свойство базового класса использовать функции производных классов, даже если на момент определения еще неизвестно, какой именно класс будет включать его в качестве базового и, тем самым, становиться от него производным.

Рассмотрим свойство полиморфности классов на основе следующего примера: <?php

class A {

//Выводит, функция какого класса была вызвана function Test() { echo "Test from A\n"; }

//Тестовая функция — просто переадресует на Test() function Call() { Test(); }

}

class B extends A {

//Функция Test() для класса B

function Test() { echo "Test from B\n"; }

}

$a=new A();

$b=new B(); ?>

Используем следующие следующие команды: $a->Call(); // выводит "Test from A" $b->Test(); // выводит "Test from B"

$b->Call(); // Внимание! Выводит "Test from B"!

Функция, переопределяемая в производном классе, называется виртуальной. Обращение к элементам классов в PHP5 (::)

Используя эту оператор :: можно обращаться к константам, статическим или перегруженным свойствам или методам класса.

При обращении к этим элементам извне класса, программист должен использовать имя этого класса. Обозначение "двойное двоеточие" (::) не менялось ни разу в течение всего времени разработки PHP.

Абстрактные классы

PHP 5 поддерживает определение абстрактных классов и методов. Создавать экземпляр класса, который был объявлен абстрактным, нельзя. Класс, в котором объявлен хотя бы один абстрактный метод, должен также быть объявлен абстрактным. Методы, объявленные как абстрактные, несут, по существу, лишь описательный смысл и не могут включать какой-либо функционал. Класс может быть объявлен как абстрактный при помощи использования ключевого слова abstract, для исключения из обработки движком описания класса. Однако, вы можете наследовать абстрактные классы. Практический пример:

<?php

abstract class AbstractClass {

/* Данный метод должен быть определён в дочернем классе */ abstract protected function getValue();

/* Общий метод */ public function print() { print $this->getValue();

}

}

class ConcreteClass1 extends AbstractClass { protected function getValue() {

return "ConcreteClass1";

}

}

class ConcreteClass2 extends AbstractClass {

protected function getValue() { return "ConcreteClass2";

}

}

$class1 = new ConcreteClass1; $class1->print();

$class2 = new ConcreteClass2;

$class2->print(); ?>

Абстрактные методы

Метод может быть объявлен как abstract, таким образом отложив его определение наследуемым классом. Класс, который включает абстрактные методы, должен быть объявлен как abstract.

<?php

abstract class MyBaseClass { abstract function display();

}

?>

Интерфейсы Интерфейсы объектов позволяют программисту создавать код, который указывает, какие методы и свойства

должен включать класс, без необходимости описывания их функционала.

Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова "interface"; тела методов интерфейсов должны быть пустыми. Для включения интерфейса в класс программист должен использовать ключевое слово "implements" и описать функционал методов, перечисленных во включаемом интерфейсе. Если это требуется, классы могут включать более одного интерфейса путём их перечисления через пробел.

Если класс включает какой-либо интерфейс и не описывает функционал всех методов этого интерфейса, выполнение кода с использованием такого класса завершится фатальной ошибкой, сообщающей, какие именно методы не были описаны. Пример интерфейса:

<?php

interface ITemplate

{

public function setVariable($name, $var); public function getHtml($template);

}

class Template implements ITemplate

{

private $vars = array();

public function setVariable($name, $var)

{

$this->vars[$name] = $var;

}

public function getHtml($template)

{

foreach($this->vars as $name => $value) {

$template = str_replace('{'.$name.'}', $value, $template);

}

return $template;

}

}

?>

Метод final

Ключевое слово final позволяет вам помечать методы, чтобы наследующий класс не мог перегрузить их. Разместив перед объявлениями методов или свойств класса ключевое слово final, вы можете предотвратить их переопределение в дочерних классах, например:

<?php

class BaseClass {

public function test() {

echo "Вызван метод BaseClass::test()\n";

}

final public function moreTesting() {

echo "Вызван метод BaseClass::moreTesting()\n";

}

}

class ChildClass extends BaseClass { public function moreTesting() {

echo "Вызван метод ChildClass::moreTesting()\n";

}

}

//Выполнение заканчивается фатальной ошибкой: //Cannot override final method BaseClass::moreTesting()

//(Метод BaseClass::moretesting() не может быть переопределён)

?>

Классы, помеченные как final

После объявления класса final он не может быть унаследован. Следующий пример вызовет ошибку:

<?php

final class FinalClass {

}

class BogusClass extends FinalClass {

}

?>

24. Технология PHP: «магические методы».

Магические методы в ООП

Чтобы сделать использование объектов проще, PHP имеет несколько магических методов. Это специальные методы, которые вызываются, когда над объектом производятся определённые действия. Таким образом разработчик может выполнить несколько общих задач относительно просто.

Это методы, которые имеют особое значение, потому как их вызываете не вы, а PHP в определенные моменты. Чтобы не контролировать наступление этих моментов и не вызывать функции вручную вы можете добавлять к своим классам «магические» методы и быть уверенным в том что они будут вызваны автоматически. Все «магические» методы начинаются с двойного символа подчеркивания __ и являются методами объекта (не static), кроме двух: __callStatic и __set_state.

Перечислим их все:

void __construct(mixed $arg1[, mixed $arg2[, ...]])

Когда: Вызывается при создании экземпляра объекта. Имеет входное количество параметров таким каким его задаст пользователь, т.е. вы.

void __destruct()

Когда: в момент когда объект подвергается сборке мусора. Т.е. завершает своё существование. mixed __get(string $name)

Когда: при попытке запросить свойство объекта, которого он не имеет (или недоступному из за private/protected модификатора). Именно имя этого несуществующего свойства он и передаст в качестве первого параметра. А что с этим делать – ваша забота.

void __set (string $name, mixed $value)

Когда: запустится, если вы попытаетесь несуществующему (или недоступному из-за private/protected модификатора) свойству присвоить какое-либо значение. В функцию будут переданы имя этого свойства и значение, которое ему пытались установить.

mixed __call (string $name, array $args)

Когда: вызовется, если у объекта была попытка выполнить несуществующий метод. Первым параметром будет имя этого метода, а вторым будет массив входных параметров, которые пытались этой функции передать.

mixed __callStatic (string $name, array $args)

Когда: аналогично __call, но работает с несуществующими статическими методами, т.е. методами которые были вызваны через синтаксис ИмяКласса::ИмяМетода, но не были найдены в классе.

string __toString ()

Когда: вызывается, когда объект пытаются использовать как строку, например, в случае если вы хотите вывести объект через echo. Объект будет представлен как строка, так как вы захотите – он будет представлен тем, что будет возвращено этим методом, т.е. return обязателен.

void __clone ()

Когда: после клонирования объекта оператором clone. Внутри этого метода вы можете использовать $this, чтобы изменить клон который создается.

Зачем: Если в классе используются объекты, то обычное клонирование скопирует лишь ссылки на них, и новых экземпляр будет привязан к данным которые находятся не только внутри него, но и в том объекте из которого он клонировался. Выход - клонировать необходимое вручную внутри __clone

bool __isset (string $name)

Когда: сработает при проверке с помощью isset() несуществующих свойств у данного объекта. void __unset (string $name)

Когда: вызовется, когда применяют функцию unset() на несуществующем свойстве класса. Принимает в качестве первого параметра имя этого свойства.

object __set_state (array $properties)

Когда: внутри вызова var_export(), первым параметром принимает свойства объекта которые собирается сохранить система. Если сделать eval полученного кода, вызовется эта функция

mixed __invoke (mixed $arg1[, mixed $arg2[, ...]])

Когда: вызывается, когда объект используется в стиле функции. В метод __invoke передаются все параметры, которые вы передали, используя объект в качестве функции. Но они передадутся не в одном первом аргументе, а в обычном виде. Чтобы получить параметры в массиве можно, конечно же, воспользоваться функцией func_get_args()

array __sleep ()

Когда: вызывается внутри функции serialize и определяет какие члены объекта надо сохранить, для этого вы должны вернуть массив содержащий строки-имена членов которые должны быть записаны.

void __wakeup ()

Когда: вызывается когда метод "просыпается" десериализацией внутри unserialize

25.Объектно–ориентированная модель PHP: статические переменные, методы, интерфейсы.

Класс - это базовое понятие в объектно-ориентированном программировании (ООП). Классы образуют синтаксическую базу ООП. Их можно рассматривать как своего рода "контейнеры" для логически связанных данных и функций (обычно называемых методами). Если сказать проще, то класс - это своеобразный тип данных.

Экземпляр класса - это объект. Объект - это совокупность данных (свойств) и функций (методов) для их обработки. Свойства и методы называются членами класса. Вообще, объектом является все то, что поддерживает инкапсуляцию.

Если класс можно рассматривать как тип данных, то объект — как переменную (по аналогии). Скрипт может одновременно работать с несколькими объектами одного класса, как с несколькими переменными.

Внутри объекта данные и код (члены класса) могут быть либо открыты, либо нет. Открытые данные и члены класса являются доступными для других частей программы, которые не являются частью объекта. А вот закрытые данные и члены класса доступны только внутри этого объекта.

Статические члены класса

Статические члены и статические методы могут использоваться для реализации того, что в ООП называется "методы класса" и "переменные класса".

"Статическим методом класса" называют метод, который можно вызвать без создания объекта этого класса. "Переменной класса" называют переменную, к которой можно обратиться без создания объекта этого класса

(и метод доступа при этом не потребуется).

Статические методы не определяются через переменную $this, поскольку они не должны быть ограничены определенным объектом.

Абстрактные методы

Если метод определяется как abstract, он должен быть переопределен в классе-потомке. При этом параметры переопределенного метода должны совпадать с параметрами абстрактного метода. Модификатор уровня доступа для абстрактных методов не учитывается. Уровень доступа определяется методом, переопределяющим абстрактный.

Интерфейсы

Интерфейсы объектов позволяют программисту создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала.

Интерфейсы объявляются так же, как и обычные классы, но с использованием ключевого слова "interface"; тела методов интерфейсов должны быть пустыми. Для включения интерфейса в класс программист должен использовать ключевое слово "implements" и описать функционал методов, перечисленных во включаемом интерфейсе. Если это требуется, классы могут включать более одного интерфейса путём их перечисления через пробел.

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

26.Проблема безопасности веб-приложений «SQL-Injection»

Внедрение SQL-кода (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.

Внедрение SQL, в зависимости от типа используемой СУБД и условий внедрения, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.

Атака типа внедрения SQL может быть возможна из-за некорректной обработки входных данных, используемых в SQL-запросах.

Разработчик прикладных программ, работающих с базами данных, должен знать о таких уязвимостях и принимать меры противодействия внедрению SQL.

Допустим, серверное ПО, получив входной параметр id, использует его для создания SQL-запроса. Рассмотрим следующий PHP-скрипт:

# Предыдущий код скрипта...

$id = $_REQUEST['id'];

$res = mysql_query("SELECT * FROM news WHERE id_news = $id");

# Следующий код скрипта...

Если на сервер передан параметр id, равный 5 (например так: http://example.org/script.php?id=5), то выполнится следующий SQL-запрос:

SELECT * FROM news WHERE id_news = 5

Но если злоумышленник передаст в качестве параметра id строку -1 OR 1=1 (например, так: http://example.org/script.php?id=-1+OR+1=1), то выполнится запрос:

SELECT * FROM news WHERE id_news = -1 OR 1=1

Таким образом, изменение входных параметров путём добавления в них конструкций языка SQL вызывает изменение в логике выполнения SQL-запроса (в данном примере вместо новости с заданным идентификатором будут выбраны все имеющиеся в базе новости, поскольку выражение 1=1 всегда истинно).

Защита от атак типа внедрение SQL-кода

Для защиты от данного типа атак необходимо тщательно фильтровать входные параметры, значения которых будут использованы для построения SQL-запроса.

Фильтрация строковых параметров[править | править исходный текст] Предположим, что код, генерирующий запрос (на языке программирования Паскаль), выглядит так: statement := 'SELECT * FROM users WHERE name = "' + userName + '";';

Чтобы внедрение кода было невозможно, для некоторых СУБД, в том числе, для MySQL, требуется брать в кавычки все строковые параметры. В само́м параметре заменяют кавычки на\", апостроф на \', обратную косую черту на \\ (это называется «экранировать спецсимволы»). Это можно делать таким кодом:

statement := 'SELECT * FROM users WHERE name = ' + QuoteParam(userName) + ';'; function QuoteParam(s : string) : string;

{ на входе — строка; на выходе — строка в кавычках и с заменёнными спецсимволами } var

i : integer; Dest : string; begin

Dest := '"';

for i:=1 to length(s) do case s[i] of

'''' : Dest := Dest + '\''';

'"' : Dest := Dest + '\"';

'\' : Dest := Dest + '\\'; else Dest := Dest + s[i]; end;

QuoteParam := Dest + '"'; end;

Для PHP фильтрация может быть такой: <?

$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($user)."';"; ?>

27. Методы реализации авторизации на web-сервере. Организация защищенных соединений, защита передаваемых данных. Примеры.

Пример авторизации пользователей будет состоять из трёх файлов:

index.php

authorize.php

secretplace.php

Файл index.php содержит форму, где пользователь вводит свое имя и пароль.

Эта форма передаст данные файлу authorize.php, который в случае успешной авторизации допустит пользователя к файлу secretplace.php, а в противном случае выдаст сообщение об ошибке.

Файл secretplace.php содержит сценарий, который предоставляет секретную информацию только зарегистрированным пользователям, а всех остальных пользователей перенаправляет на страницу для ввода имени и пароля.

Идея решения состоит в реализации аутентификации на уровне канальных приемников, встраиваемых в инфраструктуру канала Remoting на стороне клиента и сервера. Аутентификационная информация передается в заголовках запроса (TransportHeaders), результаты аутентификации передаются в заголовках ответа сервера. Авторизация выполняется с помощью декларативной проверки соответствия роли пользователя.

В случае успешной аутентификации на сервере приложения создается пользовательская сессия, в которой сохраняются пользовательские данные. Другая пользовательская сессия создается на Web-сервере, причем стандартный механизм сессий ASP.NET не используется, поэтому его можно отключить в web.config.

Сессии на сервере приложения и Web-сервере различны по содержанию, так как сервер приложения может хранить обязательные для каждого пользователя объекты, вполне возможно unmanaged (COM). Взаимосвязь между клиентом, Web-сервером и сервером приложения осуществляется по идентификатору сессии.

Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля?

1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшись этими дырками, злоумышленник может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля нечем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и

год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя.

2. Если злоумышленник вытащит трояном у пользователя уникальный хеш, воспользоваться им он также не сможет(разве если только, пользователь решил пренебречь своей безопасностью и выключил привязку к IP при авторизации).

28. Регистрация домена второго, третьего уровня (российские, зарубежные), географические домены третьего уровня, обслуживание DNS-записей.

Основные термины Домен — область пространства иерархических имен сети Интернет, которая обозначается уникальным

доменным именем, обслуживается набором серверов доменных имен (DNS) и администрируется его администратором.

Администратор домена второго уровня — юридическое лицо, осуществляющее организационную и техническую поддержку функционирования домена.

Аннулирование регистрации — исключение из реестра информации о домене и его Администраторе. Делегирование домена третьего уровня — размещение и хранение информации о доменном имени и

соответствующих ему записях на корневых серверах DNS домена второго уровня, что обеспечивает функционирование домена в сети Интернет. Делегирование домена с записями, переданными из системы регистрации Передающего Регистратора, возможно только в течение срока регистрации домена. Делегирование домена со списком DNS-серверов, указанных Администратором, возможно только в течение срока действия регистрации домена.

Домен RU является корнем для российской зоны Сети. И как из корня вырастают стволы и ветви, так и от корня RU начинается рост дерева имен российского Интернета. Начинается он за счет появления доменов второго уровня - второй части доменного имени, отделенного от первого точкой. И вот здесь начинаются различия. Принципиально любая организация, любой человек может подать заявку на регистрацию собственного домена второго уровня. Если заявителем будут выполнены определенные РосНИИРОС требования к регистранту, а название домена, выбранного им, еще не было никем зарегистрировано, то через небольшой период времени эта организация или человек становится собственником домена второго уровня, то есть владельцами собственного доменного имени. Если обратиться к нашему примеру, то этот домен будет выглядеть так: dog.ru

Но есть ряд названий доменов второго уровня, (речь идет только о России, не более того), которые выделены из общей массы и изначально были определены как домены второго уровня для общего пользования. Это так называемые домены типа GEOGRAPHICAL, которые выделены для субъектов Российской Федерации - например, spb.ru, nsk.ru и другие. У этих доменов, как и у доменов первого уровня, нет фактического владельца, но есть организации, отвечающие за их функционирование и координирующие их развитие в своих регионах. Также есть несколько специализированных доменов типа GENERIC, сделанных по подобию отраслевых американских доменов. К ним относятся домены второго уровня AC.RU, COM.RU, EDU.RU, NET.RU, ORG.RU, INT.RU, MIL.RU, PP.RU, также являющихся доменами общего пользования. Домены общего пользования открыты для регистрации всем на общих основаниях, в соответствии с правилами регистрации, опубликованными администраторами доменов и на сервере администратора домена RU. Для того чтобы зарегистрировать имя внутри одного из таких доменов, нужно обратиться к его администратору. Что вы при этом регистрируете? Совершенно верно, домен третьего уровня. А можете назвать его и хостом, если это имя будет использоваться в качестве имени конечного узла. В зависимости от домена общего пользования, в котором будет регистрироваться новый домен, его полное наименование будет выглядеть примерно так: dog.org.ru, dog.nsk.ru и т.п.

По регистрации в доменах типа GENERIC есть некоторые ограничения. Заключаются они в том, что администратором (владельцем) домена третьего уровня могут выступать:

взоне .NET.RU - организация, с целью реализации проектов, связанных с развитием сети Интернет;

взоне .ORG.RU - некоммерческая организация;

взоне .COM.RU - коммерческая организация;

взоне .PP.RU - физическое лицо.

Владелец домена второго уровня (кстати, надо отметить, что право владения выдается организации или человеку только на год, на каждый следующий год заявку надо продлевать) имеет право самостоятельно решать, будет ли он регистрировать домены третьего уровня внутри своего домена или нет. Это решение объявляется при оформлении заявки на получение домена второго уровня. Понятно, что это относится ко всем доменам, за исключением доменов общего пользования. Домены, владельцы которых объявили о своем желании регистрировать домены третьего уровня, называются доменами открытого использования. Все вопросы по регистрации новых доменов решает его администратор. Он объявляет политику, общие правила, на основании которой будет принимать заявки, и эти правила могут очень существенно отличаться друг от друга.

Кто является владельцем домена третьего уровня? В доменах общего пользования владельцем является то лицо, на кого будет зарегистрирован домен. А вот в остальных доменах этот вопрос решается по-разному, в зависимости от того, какие правила устанавливает администратор домена второго уровня. Узнать, кто же действительно имеет права на то или иное доменное имя, можно с помощью специальных программ - Whois (что можно примерно перевести как "Кто есть кто"), - либо можно воспользоваться специальным сервисом на сайте РосНИИРОС.

Какие существуют ограничения на имена доменов? В документах международной организации ICANN таких ограничений немного. Среди них - требование на размер каждой части доменного имени - оно не может быть