Spec-Zone.ru › CodeIgniter 3

Безопасность

Эта страница описывает некоторые «рекомендованные практики» в отношении безопасности веб-приложений и детализирует внутренние функции безопасности CodeIgniter.

Примечание

Если вы искали контактную информацию по безопасности, пожалуйста, обратитесь к нашему Contribution Guide <../contributing/index>.

Безопасность URI

CodeIgniter достаточно строго ограничивает символы, разрешённые в строках URI, чтобы минимизировать возможность передачи вредоночных данных в ваше приложение. URI могут содержать только следующие символы:

  • Буквенно-цифровые символы (только латинские)
  • Тильда: ~
  • Знак процента: %
  • Точка: .
  • Двоеточие: :
  • Подчеркивание: _
  • Дефис: -
  • Пробел

Register_globals

Во время инициализации системы все глобальные переменные, обнаруженные в $_GET, $_POST, $_REQUEST и $_COOKIE, отключаются.

Процедура отключения эквивалентна параметру register_globals = off.

display_errors

В производственных средах обычно желательно отключить отчёт об ошибках PHP, установив внутренний флаг display_errors в значение 0. Это предотвращает отображение ошибок PHP в выходных данных, которые могут содержать конфиденциальную информацию.

Установка константы ENVIRONMENT CodeIgniter в index.php в значение ‘production’ отключит эти ошибки. В режиме разработки рекомендуется использовать значение ‘development’. Дополнительную информацию о различении сред можно найти на странице Обработка сред.

magic_quotes_runtime

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

Рекомендованные практики

Перед приёмом любых данных в ваше приложение, будь то данные POST из формы, данные COOKIE, данные URI, данные XML-RPC или даже данные из массива SERVER, рекомендуется придерживаться следующего трёхэтапного подхода:

  1. Проверьте данные, чтобы убедиться, что они соответствуют правильному типу, длине, размеру и т. д.
  2. Отфильтруйте данные, как будто они потенциально небезопасны.
  3. Экранируйте данные перед отправкой их в базу данных или выводом на браузер.

CodeIgniter предоставляет следующие функции и советы для помощи в этом процессе:

Фильтрация XSS

CodeIgniter поставляется с фильтром Cross Site Scripting (XSS). Этот фильтр ищет распространённые методы встраивания вредоносного JavaScript в ваши данные или других типов кода, пытающихся перехватить куки или выполнить другие вредоносные действия. Подробное описание фильтра XSS можно найти здесь.

Примечание

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

Защита от CSRF

CSRF (Cross-Site Request Forgery) — это процесс, при котором злоумышленник обманным путём заставляет жертву выполнить нежелательный запрос.

CodeIgniter предоставляет защиту от CSRF «из коробки», которая автоматически срабатывает для каждого HTTP-запроса, отличного от GET, но также требует создания форм отправки определённым образом. Это описано в документации библиотеки безопасности.

Обработка паролей

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

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

Ниже приведён список рекомендаций по правильному и неправильному обращению с паролями.

  • НЕ храните пароли в текстовом формате.

    Всегда хешируйте ваши пароли.

  • НЕ используйте Base64 или аналогичное кодирование для хранения паролей.

    Это равносильно хранению паролей в текстовом формате. Серьёзно. Используйте хеширование, а не кодирование.

    Кодирование и шифрование — это двусторонние процессы. Пароли — это секреты, которые должны быть известны только их владельцу, и поэтому они должны работать только в одном направлении. Хеширование делает это — нет расшифровки или дешифровки, но есть декодирование и расшифровка.

  • НЕ используйте слабые или устаревшие алгоритмы хеширования, такие как MD5 или SHA1.

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

    Также, НЕ изобретайте свои собственные алгоритмы.

    Используйте только сильные алгоритмы хеширования паролей, такие как BCrypt, используемые в собственных функциях хеширования паролей PHP Password Hashing. Используйте их, даже если вы не используете PHP 5.5+ CodeIgniter предоставляет их для вас.

  • НИКОГДА не отображайте или не отправляйте пароль в текстовом формате!

    Даже владельцу пароля, если вам нужна функция «Забытый пароль», просто сгенерируйте новый одноразовый (важно и это) пароль и отправьте его вместо этого.

  • НЕ накладывайте ненужных ограничений на пароли пользователей.

    Если вы используете алгоритм хеширования, отличный от BCrypt (у которого есть ограничение в 72 символа), вы должны установить относительно высокое ограничение на длину пароля, чтобы смягчить атаки DoS — скажем, 1024 символа.

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

    Это не только снижает безопасность вместо её повышения, но и нет никаких технических ограничений и ограничений на хранение, если вы их хешируете, никаких!

Проверка входных данных

CodeIgniter имеет библиотеку проверки форм, которая помогает вам проверять, фильтровать и подготавливать ваши данные.

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

Учтите, что это относится не только к переменным $_POST и $_GET, но и к куки, строке пользовательского агента и, в принципе, всем данным, которые не создаются непосредственно вашим кодом.

Экранируйте все данные перед вставкой в базу данных

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

Скрытие файлов

Ещё одной хорошей практикой безопасности является размещение только index.php и «активов» (например, .js, css и файлов изображений) в каталоге webroot вашего сервера (чаще всего «htdocs/»). Это единственные файлы, которые должны быть доступны из сети.

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

Если это запрещено, вы можете попробовать использовать файл .htaccess для ограничения доступа к этим ресурсам.

CodeIgniter будет иметь файл index.html во всех своих каталогах, чтобы попытаться скрыть часть этой информации, но учтите, что этого недостаточно, чтобы предотвратить серьёзные атаки.

© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/general/security.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API