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

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Язык Java 51

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchпользоватьсяa

компилятором и запускать программу на выполнение. Ниже

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

приведен текст такой программы на языке Java.

Пример 1.10. Здравствуй, мир!

class helloWorld{

public static void main( String [] Args ) { System.out.println( "Hello, world!" );

}

}

Класс helloWorld содержит единственный метод main, который по умолча- нию принимает массив аргументов типа String. Этот метод открытый (public), то есть к нему есть доступ извне класса helloWorld. Он не возвращает значе- ния, о чем говорит ключевое слово void. Метод println является членом класса System.out. Он печатает строку «Hello, world!» на стандартный вывод. (О типах данных и методах мы еще скажем ниже в этой главе.)

Типы данных

Типы данных служат в языках программирования для определения переменных до их инициализации. Тип определяет как переменная будет размещена в памяти и какие данные она может содержать. Говорят, что переменная является экземпляром некоторого типа данных.

В языке Java есть две разновидности типов данных: примитивные и ссылочные. К примитивным относятся следующие типы:

Byte. Типом byte представляется целое число, занимающее 1 байт памяти;

Short. Òèï short служит для представления целых чисел, занимающих 2 байта памяти;

Int. Òèï int служит для представления целых чисел, занимающих 4 байта памяти;

Long. Òèï long служит для представления целых чисел, занимающих 8 байтов памяти;

Float. Типом float представляют числа с плавающей точкой, под которые отводится 4 байта;

Double. Òèï double служит для представления чисел с плавающей точ- кой двойной точности. Для них отводится 8 байтов;

Char. Òèï char служит для представления символов. В языке Java символ хранится в кодировке Unicode и занимает 16 битов;

Boolean. Типом boolean можно представить одно из двух значений: true или false.

В платформенно-зависимых языках, к которым относится, в частности, C, зачастую не определен точный объем памяти, отводимой под хранение дан-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

52 Глава 1. Написание безопасных программ

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

ных разных типов. Напротив, в Java размер и формат всех типов данных спе--x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

цифицированы в самом языке. Программистам не надо думать о системных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

особенностях.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В Java имеются также ссылочные типы. Переменные такого типа не содер-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

интерфейсы – все это данные ссылочных типов. На рис 1.2 приведена клас-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

сификация типов в языке Java.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ссылочные

 

 

 

object

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

array

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Предопре*

 

 

 

 

 

string

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

деленные

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

типы

 

 

 

 

bool

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Примитив*

 

 

 

 

 

Типы

 

 

double

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

с плавающей

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ные типы

 

 

 

 

 

точкой

 

 

float

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Число*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

byte

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вые типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Целочислен*

 

 

char

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

int

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ные типы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

long

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

short

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 1.2. Классификация типов данных в языке Java

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Поток управления

В языке Java для управления потоком выполнения программы применяются циклы. В программах часто встречаются участки, которые надо повторить либо заранее известное число раз, либо до тех пор, пока не будет выполнено некоторое условие. Циклы как раз и предназначены для решения подобного рода задач. Имеется три основных вида циклов: for, while и do...while.

Пример 1.11. Цикл «for»

for( начальное_выражение; проверяемое_условие; операция ){ [блок предложений];

}

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Язык Java

53

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

 

 

Среди всех циклов for используется чаще всего. В начале выполнения цикла

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программа вычисляет начальное выражение и проверяет следующее за ним условие. Если условие истинно, выполняется тело цикла («блок предложений»). В конце цикла производится операция, указанная третьей в заголовке, после чего снова проверяется условие. Цикл продолжается, пока условие не станет ложным.

Особенно хорошо цикл for подходит для выполнения итераций. Если нужно выполнить блок предложений пять раз, то можно написать такой простой цикл:

for( i = 0 ; i < 5 ; i++ ){ [блок предложений];

}

Пример 1.12. Цикл «while»

while( условие ){ [блок предложений];

}

При выполнении цикла while проверяется условие, стоящее в начале цикла. Если оно истинно, выполнение цикла продолжается, иначе прекращается. Цикл повторяется, пока условие не станет ложным.

Пример 1.13. Цикл «do...while»

do{

[блок предложений];

}while( условие );

Âцикле do...while проверяемое условие находится в конце и проверяется после выполнения блока предложений. Если оно истинно, то блок предложений выполняется еще раз, в противном случае происходит выход из цикла. Цикл do...while похож на цикл while с одним отличием: блок предложений будет выполнен хотя бы один раз. Циклы этого вида встречаются реже, чем for и while.

Следует отметить, что в большинстве случаев все три циклических конструкции функционально эквивалентны.

Пример 1.14. Эквивалентность циклов – выполнение пяти итераций

Öèêë for

for( i = 0 ; i < 5 ; i++ ){ блок_предложений;

}

Öèêë while int i = 0; while( i < 5 ){

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

54 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

блок_предложений;

 

 

 

df-xchan

e

 

 

 

 

 

 

 

 

i++;

}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Öèêë do...while int i = 0;

do { блок_предложений; i++;

}while( i < 5 )

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

Методы

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

Пример 1.15. Метод Factorial

int Factorial( int num ){

for( i = (num – 1) ; i > 0 ; i— ){

num *= i; /* сокращенная запись для num = num * i */

}

return num;

}

В первой строке Factorial – это имя метода. Ему предшествует ключевое слово int, говорящее о том, что метод возвращает целое значение. Часть ( int num ) означает, что метод принимает в качестве аргумента одно целое число, которое будет обозначаться num. Предложение return говорит о том, какое именно значение метод возвращает.

Классы

Объектно-ориентированные программы организованы в виде набора классов. Класс – это дискретная единица программы, обладающая определенны-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

 

Язык Java 55

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchìèa

характеристиками. Класс группирует данные и методы некоторых типов.

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Класс может содержать конструкторы, которые определяют, как создается

 

 

 

 

 

 

 

 

 

 

 

 

 

 

экземпляр класса или объект. В класс включаются методы, выполняющие

 

 

 

 

 

 

 

 

 

 

 

 

 

 

операции над экземплярами этого класса.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Предположим, к примеру, что программист работает над симулятором

 

 

 

 

 

 

 

 

 

 

 

 

 

 

полетов для компании, производителя самолетов. Результаты этой работы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

помогут компании принять важные проектные решения. В такой ситуации

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объектно-ориентированное программирование –

идеальный инструмент.

 

 

 

 

 

 

 

 

 

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

Класс может содержать несколько переменных, к примеру:

Weight (âåñ);

Speed (скорость);

Maneuverability (маневренность);

Position (положение).

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

SetWeight( int )

SetSpeed( int )

SetManeuverability( int )

SetPosition( int )

MovePosition( int )

Код такого класса plane мог бы выглядеть следующим образом:

Пример 1.16. Класс plane

1 public class plane{

2 int Weight;

3 int Speed;

4 int Maneuverability;

5 Location Position; /* тип Location должен быть где-то определен

6и представлять пространственные координаты (x,y,z) */

7 plane( int W, int S, int M, Location P ){

8 Weight = W;

9 Speed = S;

10 Maneuverability = M;

11 Position = P;

12 }

13

14 SetWeight( plane current, int W ){

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

56 Глава 1. Написание безопасных программ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

15 ñurrent.Weight = W;

 

 

 

 

 

 

 

 

16 }

17

18 /* Методы SetSpeed, SetManeuverability, SetPosition, MovePosition тоже должны быть определены */

19 }

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Этот код служит для инициализации объекта класса plane. При вызове метода plane задаются все характеристики, которыми должен обладать самолет: вес, скорость, маневренность и положение. На примере метода SetWeight показано, как можно включить в класс операцию над описываемым им объектом.

Симулятор может создать несколько экземпляров класса plane и выполнить «пробные полеты» для оценки влияния различных характеристик. Например, самолет plane1 может весить 5000 фунтов, летать со скоростью 500 миль/час и обладать маневренностью 10, тогда как для самолета plane2 можно задать следующие параметры: вес 6000 фунтов, скорость 600 миль/час, маневренность 8. В языке Java экземпляры класса создаются с помощью ключевого слова new. Скажем, объект plane1 можно создать с помощью таких предложений:

plane plane1; Location p;

p = new Location( 3, 4, 5 );

plane1 = new plane(5.000, 500, 10, p );

Наследование позволяет программистам создавать иерархии классов. Классы организуются в древовидные структуры, в которых у каждого класса есть «родители» и, возможно, «потомки». Класс «наследует», то есть может пользоваться функциями любого из своих родителей, называемых также его суперклассами. Например, если класс plane является подклассом класса vehicle, то объект класса plane имеет доступ ко всем методам, которые можно выполнять над объектом класса vehicle.

Óклассов есть много преимуществ, недостающих другим имеющимся

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

методов.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df

 

Получение заголовков HTTP

 

 

 

 

 

n

 

 

 

 

 

 

 

-xcha

 

 

 

 

Язык Java

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

57

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

При написании программ для работы с сетью и обеспечения безопасности не забывайте о средствах, уже имеющихся в том или ином языке. В примере 1.17 приведена программа, которая получает заголовки, присланные в ответе на запрос по протоколу HTTP (Hypertext Transfer Protocol) к заданному URL.

Пример 1.17. Получение заголовков HTTP

1 import java.net.URL;

2 import java.net.URLConnection;

3 import java.io.*;

4 import java.util.*;

5

6 public class HTTPGET{

7public static void main (String [] Args){

8try{

9

FileWriter file = new FileWriter( "OutFile" );

10

PrintWriter OutputFile = new PrintWriter( file );

11

 

12

URL url = new URL( "http://www.google.com" );

13

URLConnection urlConnection = url.openConnection();

14

InputStream IS = urlConnection.getInputStream();

15

 

16

IS.close();

17

OutputFile.print( IS );

18} catch (Exception e) { System.out.println("Error"); }

19}

20}

Эта программа демонстрирует, как на языке Java можно отправить HTTPзапрос типа GET и вывести полученный результат в файл. То и другое часто бывает нужно при реализации сетевых инструментов. Посредством строк 1–4 импортируются библиотеки, необходимые для установления соединения с заданным URL и для ввода/вывода. В строках 9 и 10 инициализируется объект класса FileWriter и задается выходной файл для него, затем создается объект PrintWriter, который будет осуществлять вывод в этот файл (строка 17).

Для создания соединения с помощью класса java.net.URLConnection нужно выполнить несколько шагов. Сначала методом openConnection() создается объект, представляющий соединение. Далее для него могут быть заданы различные параметры, после чего соединение открывается методом connect(). После того как соединение установлено, данные из него считываются в объект IS класса InputStream. В строке 16 поток закрывается, и в строке 17 его содержимое выводится в файл.

Если в процессе выполнения возможно возникновение исключений, в Java применяются операторные скобки try è catch (строки 8 и 18), в которых заклю-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

58 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

-xcha

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

чен потенциально опасный код. В строке catch указывается тип и имя ожида--x cha

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

Для работы на уровне сокетов в Java имеются дополнительные классы, например:

java.net.socket

java.net.serversocket

java.net.datagramsocket

java.net.multicastsocket

Заметим, впрочем, что ни один из них не дает доступа к простым (raw) сокетам. Если это необходимо, придется обратиться к языкам C, C++ или C#.

Примечание

Посетителей Web сайтов часто обманом вынуждают сообщить пре ступникам секретные данные, например, номер кредитной карты или социального страхования. Хакер может провести такую атаку, скопировав внешний облик чужого сайта на своем сервере, так что посетитель по ошибке примет его за настоящий сайт. Один из про стейших способов реализовать эту уловку заключается в том, чтобы разместить на публичном форуме ссылку, которая на первый взгляд выглядит вполне обычно, но ведет совершенно не туда, куда кажется на первый взгляд. Например, добропорядочный пользователь при глашает посетителей форума прочитать новость по такому адресу: http://www.google.com/?news=story1.html

Хакер же может разместить похожую ссылку, которая переадресует посетителя совсем в другое место:

http://www.google.com story=%40%77%77%77%2E%79%61%68%6F%6F%2E%63%6F%6D Можете ли вы сказать, куда попадете, щелкнув по такой ссылке? Оказывается, на http://www.yahoo.com. Переадресация обеспечива ется символами, указанными в конце URL. Эти символы представле ны в 16 ричной кодировке и соответствуют строке @www.yahoo.com

Обман основан на ранней схеме аутентификации через Web, когда пользователь получал доступ к сайту, задав URL в формате http:// user@site. В этом случае Web браузер пытался обратиться к сайту, указанному после символа @. Чтобы быстро создать зловредные ссылки в указанном формате, хакеру достаточно воспользоваться

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

Язык C#

w Click

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

любым инструментом для перекодировки из кода ASCII в 16 ричную форму (такая программа есть, скажем, на сайте http://d21c.com// sookietex/ASCII2HEX.html).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

59

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Как предотвратить

Защититься от такой атаки на вашем форуме несложно. Напишите фильтрующий сценарий, который проверяет, что в любой опублико ванной пользователем ссылке после имени домена имеется символ «/». Тогда приведенная выше ссылка после фильтрации приобретет такой вид:

http://www.google.com/ story=%40%77%77%77%2E%79%61%68%6F%6F%2E%63%6F%6D Теперь попытка перейти по этой ссылке приведет к ошибке, так что атака не состоялась. Отметим, что некоторые современные браузе ры уже содержат защиту от подобной уловки. К примеру, Firefox пре дупреждает пользователя об опасности.

Язык C#

В декабре 2001 года компания Microsoft выпустила в обращение язык C#. Он спроектирован Андерсом Хейльсбергом (Anders Hejlsberg) и предназначен прежде всего для написания компонентов Web-сервисов на платформе .NET. За предшествующее десятилетие язык Java приобрел широкую популярность благодаря своей переносимости, простоте и мощной библиотеке классов. Хотя о причинах, по которым Microsoft решила заняться разработкой C#, ведутся ожесточенные споры, можно считать это ответом на популярность Java. Ожидается что по мере распространения платформы .NET Framework многие программисты, работающие на C++ и Visual Basic, перейдут на C#.

Хотя язык C# и разработан компанией Microsoft, он не является ее собственностью. За стандартизацию C# отвечает Европейская ассоциация изготовителей компьютеров (European Computer Manufacturers Association). Этот факт в какой-то мере снимает опасения, что Microsoft может ввести ограни- чения на использование языка в чужих продуктах.

Основания для перехода на C#

Если верить заявлениям Microsoft, .NET станет платформой для разработки Web-сервисов, на которой смогут взаимодействовать компоненты, написанные на разных языках. Хотя .NET поддерживает много языков, но основным

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

60 Глава 1. Написание безопасных программ

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

для нее является C#. Разработчики, привыкшие программировать в среде Vi--x cha

 

 

 

 

 

sual Studio, обнаружат, что переход от Visual C++ к Visual C#.NET несложен. C# станет языком по умолчанию для разработки программ для Windows.

Да, архитектурно-нейтральный язык Java может работать также и в Windows, но в C# встроены многие возможности, специфичные именно для этой ОС. Например, с помощью C# легко обращаться к таким особенностям Windows, как графический интерфейс пользователя и сетевые службы. Программы, написанные на C++, сравнительно легко переносятся на C#, тогда как переписывание их на Java требует значительных усилий.

При разработке Web-сервисов выбор современного языка особенно важен. Java и C# обеспечивают независимость от платформы, предоставляют все преимущества объектно-ориентированного программирования и сокращают время разработки за счет таких механизмов как автоматическое управление памятью. Кроме того, C# легко осваивается программистами, что уменьшает расходы на обучение. Благодаря наличию многих достоинств и лишь немногих недостатков, большое число компаний считают C# экономи- чески оправданным выбором.

Характеристики языка

C# – это современный платформенно-независимый (по крайней мере, теоретически) объектно-ориентированный язык программирования. Новейшие возможности сочетаются в нем с синтаксисом, похожим на C/C++, поэтому опытным программистам достаточно просто выучить новый язык. C# отли- чается от Java, в частности, тем, что налагает меньше ограничений и в этом отношении больше напоминает C++. Как и C++, C# поддерживает прямую компиляцию в машинный код, имеет препроцессор и структуры.

Объектно-ориентированные возможности

C# – объектно-ориентированный язык программирования, что означает наличие следующих достоинств:

Инкапсуляция. За счет использования классов объектно-ориентиро- ванный код имеет очень хорошую организацию и обладает высокой модульностью. Данные и методы для выполнения операций над ними инкапсулированы в структуру класса;

Наследование. Объектно-ориентированная организация и инкапсуляция позволяют без труда реализовать повторное использование или «наследование» ранее написанного кода. Наследование экономит время, так как программисту не нужно заново кодировать уже имеющую-

ся функциональность;