Для искупления греха в программе придерживайтесь следующих правил:

□ По возможности храните все файлы, нужные приложению, в таком месте, которое противник никак не может контролировать. Даже если программа ничего не проверяет, но безопасность ее рабочего каталога гарантируется, то большая часть проблем исчезнет сама собой. Обычно для этого создается «безопасный каталог», доступный только приложению. Часто самый простой способ обеспечить контроль доступа на уровне приложения заключается в том, чтобы создать специального пользователя, от имени которого приложение будет работать. Если этого не делать, то все приложения, работающие от имени того же пользователя, что и ваше, смогут манипулировать создаваемыми им файлами.

□ Никогда не используйте одно и то же имя файла для выполнения более одной операции над файлом; если первая операция выполнилась успешно, то всем последующим передавайте описатель или дескриптор файла.

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

□ Если вы вынуждены открывать временный файл в общедоступном каталоге, то самый надежный способ сформировать его имя – это получить восемь байтов от генератора случайных чисел криптографического качества (см. грех 18) и представить их в кодировке base64. Если в результирующей строке окажется символ \'/\', замените его символом \',\' или еще каким–нибудь безобидным – это и будет имя файла.

□ Там, где оправдано (читай: если сомневаетесь), блокируйте файл при первом доступе к нему или в момент создания.

□ Если вы точно знаете, что файл должен быть новым и иметь нулевую длину, усекайте его. Тем самым вы предотвратите попытку противника подсунуть программе предварительно заполненный временный файл.

□ Никогда не доверяйте именам файлов, контролируемым кем–то другим.

□ Проверьте, что имя относится именно к файлу, а не к каналу, устройству или символической ссылке.

Имея все это в виду, обратимся к примерам.

Искупление греха в Perl

Пользуйтесь описателем, а не именем файла, чтобы проверить его существование, а затем открыть.