Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги хакеры / Питер_Гудлиф_Ремесло_программиста_Практика_написания_хорошего_кода.pdf
Скачиваний:
16
Добавлен:
19.04.2024
Размер:
9.23 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

312m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 12. Комплекс незащищенностиClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

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

Хорошие программисты…

Плохие программисты…

Разбираются в требовани% Не занимаются проблемами защи%

ях к безопасности в каж% дом проекте, над которым трудятся

Инстинктивно пишут код, в котором нет стандартных уязвимых мест

Учитывают требования без% опасности при проектиро% вании каждой системы, а не приступают к защите, ко% гда продукт почти готов

Располагают стратегией тестирования безопасности

щенности, считая их малозначи% тельными

Считают себя экспертами в области безопасности (настоящих экспер# тов очень мало)

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

Думают о безопасности, только когда пишут код, игнорируя ее на уровне проектирования и архитектуры

См. также

Глава 1. Держим оборону

Защитное программирование – важная технология для написания безопасного кода.

Глава 8. Время испытаний

Необходимо строго тестировать наше программное обеспечение на предмет его безопасности.

Глава 13. Важность проектирования

Безопасность необходимо иметь в виду при проектировании каждо% го раздела кода.

Глава 14. Программная архитектура

Безопасность – одно из фундаментальных требований к архитекту% ре компьютерной системы. Ее проектированием нужно заниматься с самого начала.

Контрольные вопросы

Подробное обсуждение этих вопросов можно найти в разделе «Ответы и обсуждение» на стр. 638.

 

 

 

 

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

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

313Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Вопросы для размышления

1.Что такое «безопасная» программа?

2.Какие входные данные нужно проверять в безопасной программе? Какого типа проверка необходима?

3.Как можно защищаться против атак со стороны группы доверен% ных пользователей?

4.Где может произойти переполнение буфера, допускающее создание эксплойта? Какие функции особенно подвержены переполнению буфера?

5.Можно ли полностью исключить возможность переполнения буфе% ра?

6.Как защитить память, используемую приложением?

7.Характерна ли для C и C++ принципиально более низкая защищен%

ность, чем для других языков?

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

314m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Глава 12. Комплекс незащищенностиClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

8.Учтен ли опыт C для проектирования C++ как более защищенного языка?

9.Как можно узнать, что ваша программа скомпрометирована?

Вопросы личного характера

1.Каковы требования к безопасности, предъявляемые в вашем теку% щем проекте? Каким образом были они установлены? Кто осведом% лен о них? В каких документах они отражены?

2.Какой была самая страшная ошибка защиты в выпущенных вами приложениях?

3.Сколько бюллетеней по вопросам безопасности было выпущено по поводу вашего приложения?

4.Проводили ли вы аудит безопасности программы? Какие пробле% мы он выявил?

5.Кто, как вам кажется, вероятнее всего может попытаться атаковать вашу систему? В какой мере на это влияют:

a.Ваша компания

b.Тип пользователя

c.Тип продукта

d.Популярность продукта

e.Конкуренция

f.Платформа, на которой он работает

g.Нахождение в сети и видимость системы широкой публике

 

 

 

 

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

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

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

 

 

 

 

III

Проектирование кода

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

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

Как быть? Одно решение есть – никогда не заниматься разработкой кода, но едва ли оно осуществимо. Другое решение – разрабатывать код с учетом представления о структуре системы в целом. Хороший код не возникает случайным образом; это продукт умелой ремесленной работы при значительных предварительных затратах труда на плани% рование и проектирование. Но помимо этого в разработке необходимо проявлять находчивость и сообразительность, чтобы справиться с про% блемами и изменениями, с которыми вам неизбежно придется столк% нуться по пути.

 

 

 

 

hang

e

 

 

 

 

 

 

C

 

E

 

 

 

X

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

to

 

 

 

 

w Click

 

 

 

316m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

df

 

 

n

e

 

 

 

 

-xcha

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Часть III. Проектирование кодаClick

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

В этой части мы исследуем данный процесс. Мы рассмотрим:

Глава 13. Важность проектирования

Микропроектирование кода: рекомендации по конструктивным ре% шениям низкого уровня для отдельных модулей кода.

Глава 14. Программная архитектура

Проектирование систем на более крупном уровне – первый этап соз% дания любых программных систем.

Глава 15. Программное обеспечение – эволюция или революция?

Взгляд на особенности развития программного продукта во време% ни и ряд практических рекомендаций по соединению новых разра% боток со старым базовым кодом.

Все это не факультативные добавки или благие пожелания. Это важ% ные этапы в нашем деле, необходимые для выпуска качественного программного обеспечения. Можете опустить этот материал на свой страх и риск.