C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь


Купить фрезы для чпу cnc cutter купить. ; Каталог устрицы живые oyster.market.

 Защита от переполнения буфера / Методы / Переполнение буфера

Защита от переполнения буфера

Переполнение буфера обычно происходит, когда программа пытается записать данные за пределы конца буфера. Рассмотрим пример:

#include <stdio.h>
int main()
{
  char buff[15] = {0};  /*все элементы инициализируются нулём*/
  printf("enter your name: ");
  scanf(buff, "%s"); /*опасно, так как длина не проверяется*/
}

Программа считывает строку со стандартного ввода (клавиатура). Проблема в том, что она не проверяет длину строки. Если будет введено более 14 символов, то произойдёт переполнение буфера, так как scanf() попытается сохранить остальные символы за пределами buff (не забудьте, что один символ всегда зарезервирован для нуля, которым должна заканчиваться строка). В результате обычно происходит аварийное завершение.

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

Однако, мы пойдём другим путём. Для начала всегда проверяйте границы массива перед записью его в буфер. Если это невозможно, например, когда ввод производится из скрипта CGI, то используйте функции, которые явно ограничивают количество вводимых сиволов, т.е. вместо scanf() используйте функцию fgets(), которая считывает символы до определённого предела:

#include <stdio.h>
int main()
{
 char buff[15] = {0};
 fgets(buff, sizeof(buff), stdin); /*считывает только 14 символов*/
}

Так же стандартные строковые функции имеют аналоги, которые позволяют ограничить размер. Таким образом, вместо strcpy (), strcmp (), и sprintf (), используют strncpy (), strncmp (), и snprint (), соответственно.