Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 [ 127 ] 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189

владеет злоумышленник, он может перехватить эту операцию и возвратить вам все, что ему (а не вам) будет угодно!

Рассмотрим это на примере. Пусть вам надо определить доменное имя компьютера, расположенного по адресу 195.84.12.34. Давайте предположим, что эта машина принадлежит симпатичному хакеру, который настроил свой DNS-сервер так, чтобы он говорил: "Я являюсь хостом whitehouse.gov", если его об этом спросят по адресу 195.84.12.34 . Так что, выполнив код:

echo gethostbyaddr("195.84.12.34");

мы получим вывод whilehouse.gov. Произошла подмена!

Как же нам быть? А вот как. Предположим, мы получили от хоста с некоторым IP-адресом информацию, что его "зовут" whitehouse.gov. Обратимся же к нему и получим его IP-адрес, а потом сравним, тот ли это адрес, который мы запрашивали вначале:

$ip="195.84.12.34";

$host=gethostbyaddr($ip);

Если б1ла ошибка, $host==$ip

if($host==$ip) die("НевернIЙ ip-адрес $ip!");

$check ip=gethostbyname($host);

Если была ошибка, $check ip==$host

if($check ip==$host) die("Неверное доменное имя $host!");

Ну вот, теперь сверяем данные

if($ip==$check ip)

echo "По адресу $ip расположен хост $host"; else

echo "По адресу $ip расположен хост злоумышленника!!!";

Длинно? Да. Но это еще, к сожалению, не все. Ведь у одного и того же доменного имени могут быть сразу несколько IP-адресов. Нас устроит, если хотя бы один из них совпадет с затребованным нами. Так что придется воспользоваться функцией gethostbynamel() и циклом перебора списка IP-адресов. Вот что у нас получится:

1 Листинг 27.2. Безопасная функция получения доменного имени

<?

Аналог функции gethostbyaddr(), но всегда проверяет, не подменил ли злоумышленник по адресу $ip имя своего хоста на чужое. В последнем случае просто возвращает false. function safe gethostbyaddr($ip) { Получаем предолагаемюе имя $host=gethostbyaddr($ip);



Адреса не существует? Не фатально - вернем то, что есть.

if($host==$ip) return $host;

Теперь спрашиваем $host, кто он такой.

$check ips=gethostbynamel($host);

Есть ли среди адресов, которые он вернул, затребованн1Й? foreach($check ips as $check ip) {

Если нашли, то $host достоверен - возвращаем его.

if($ip==$check ip) return $host;

Иначе, если ни один адрес не совпал, в1ходим return false;

Теперь посмотрим, что из себя представляет наш адрес... echo safe gethostbyaddr("195.84.12.34");

?>

Вот теперь все будет работать корректно. Однако за все приходится платить: safe gethostbyaddr() требует гораздо больших затрат времени, чем gethostbyaddr() , потому что нам приходится дополнительно обращаться еще как минимум к одной машине. Если безопасность для вас важнее, чем какие-то пара секунд простоя, используйте safe gethostbyaddr() .





0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 [ 127 ] 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189