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

На этой странице описаны некоторые “лучшие практики” в отношении веб безопасности и детали внутренней безопасности CodeIgniter.

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

CodeIgniter довольно ограничен в отношении допустимых символов в URI строке для того чтобы свести к минимуму саму возможность передачи вредоносной инофрмации в приложение. URI могут содержать только:

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

Директива register_globals 

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

Их удаление также эффективно как и register_globals = off.

Директива display_errors 

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

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

Директива magic_quotes_runtime

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

Лучшие практики 

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

  1. Проверяйте данные для обеспечения соответствий правильного типа, длины, размера и т.д.
  2. Фильтруйте данные так, как если бы они были испорченные.
  3. Защищайте данные перед отправкой в базу данных или перед выводом в браузер.

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

XSS фильтрация 

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

Примечание

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

CSRF защита 

CSRF стоит для кросс-сайтовых запросов, которые злоумышленник обманывая свою жертву подменяет.

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

Обработка пароля 

Критически важно обрабатывать пароли в приложении правильно.

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

Мы хотели бы дать вам список сочетаний ДЕЛАТЬ и НЕ ДЕЛАТЬ, чтобы помочь вам. Пожалуйста, прочтите нижеизложенное.

  • НЕ храните пароли в plain-text (текстовом) формате.

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

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

    Это также хорошо как и хранить их в текстовом формате. Действительно. Делайте кеширование, не кодирование.

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

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

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

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

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

    Пожалуйста используйте ее, даже если вы не используете PHP 5.5+ CodeIgniter обеспечивает их даже для версии PHP 5.3.7 (если вы не удовлетворили это требование - пожалуйста обновитесь).

    Если же вы один из действительно невезучих людей кто не может даже обновить PHP до более свежей версии, используйте hash_pbkdf() <http://php.net/hash_pbkdf2> которые мы предоставляем в нашей совместимости.

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

    Даже владельцу пароля! Если вам необходима функция “забыли пароль”, просто сгенерируйте новый пароль и отправте его (это тоже важно) .

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

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

    Но впрочем, нет никакого обоснования правила, что пароль должен содержать только цифры и буквы и не может содержать набор определенных спецсимволов.

    Не только это снижает безопасность вместо того чтобы ее улучшать, но нет никакой буквальной причины это делать. Нет технических ограничений и нет (практического) хранения ограничений, принятых после их обсуждения, нет!

Проверяйте входные данные 

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

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

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

Защищайте все данные прежде чем записать их в базу данных

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

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

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

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

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

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