Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP
Code

Простые методы защиты вашего сайта

by
Difficulty:IntermediateLength:LongLanguages:

Russian (Pусский) translation by Anna Goorikova (you can also view the original English article)

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


Введение

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


Что вы узнаете

  • Как генерировать случайные значения с помощью PHP
  • Создание случайных паролей
  • Соли для паролей и проверка подлинности пользователя
  • Обфускация в PHP, обзор
  • Криптография в PHP и ее приложения

Генерация случайных значений

Dictionary.com определяет рандомизацию как:

«- глагол: заказывать или выбирать случайным образом, как в примере или эксперименте, особенно для уменьшения смещения и помех, вызванных не релевантными переменными; делать наугад».

Генерация случайного числа определяется различными способами, однако вычислительные генераторы не соответствуют «истинной» случайности, как в природе или электронном шуме (нечеткий, шумный, черно-белый канал на телевидении). Эти вычисленные значения считаются псевдослучайными.

PHP предоставляет нам несколько различных способов создания случайных значений. Давайте рассмотрим несколько наиболее популярных функций.

Две функции rand() и mt_rand(), вероятно, являются наиболее широко используемыми функциями для генерации набора случайных чисел в PHP. Функция rand(); является более старым генератором и не используется из-за mt_rand(); которая быстрее, надежнее и может обрабатывать более высокое максимальное целочисленное значение на некоторых платформах. Функция str_shuffle() делает именно то, что вы ожидаете от нее, она перетасовывает переданную ей строку.

Функции rand() и mt_rand() принимают два параметра, где $min является наименьшим целым, и $max является наибольшим целым числом. Функция str_shuffle принимает один параметр - строку, выводит же перетасованную измененную строку. Она действует так же, как если бы вы перетасовывали колоду карт.

В то время как mt_rand(); выдает случайное целое число, а str_shuffle перемешивает строку, есть еще одна функция, широко используемая для создания случайных уникальных значений, - uniqid(). Она генерирует префиксный уникальный идентификатор, основанный на текущем времени в микросекундах (через php.net). Использование этой функции полезно для создания токенов сессии и даже создания ключей, как показано в разделе Защитите свои формы с помощью форм-ключей.

Функция uniqid() принимает два параметра: первый добавляет префикс к результатам, а второй, если установлен в TRUE, добавит дополнительную энтропию в конец возвращаемого значения.


Создание случайных паролей

Есть множество примеров в Интернете, которые генерируют случайные пароли, и все это прекрасно работает. «Но зачем, - спрашиваешь ты, - мне нужно создавать случайный пароль?» Ну, ответ, довольно прост, заключается в том, что вам не нужно полагаться на конечного пользователя, чтобы предоставить себе более безопасный пароль на ходу. Генерирование случайных паролей очень полезно при регистрации пользователей или когда пользователь делает запрос, потому что он забыл свой пароль. Это обеспечивает надежный пароль в начале пользовательского опыта на вашем веб-сайте или может сократить строки кода, когда пользователю необходимо снова получить доступ.

Давайте посмотрим на некоторые примеры: Пример 1

Этот пример перемешивает строку с помощью str_shuffle и возвращает строку в пределах подсчитанного диапазона. Поэтому, если вы хотите сгенерировать пароль с 8 символами, вы передадите 8 в функцию randompassword или randompassword (8) из исходного кода.

Пример 2

Для сравнения, пример 1 берет статическую строку и перетасовывает ее, а затем возвращает ее, пример 2 добавляет более динамичный привкус (mmm вкусно). В примере 2 перетасованная строка больше не является статической, но изменяется с каждой генерацией. В то время как первый пример в большинстве случаев достаточен для генерации надежного пароля, второй пример позволяет нам быть уверенными, что длина строки и символы будут меняться с использованием, что значительно уменьшит вероятность дублирования.

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


Передайте соль, пожалуйста. Соли для паролей для повышения безопасности.

Солить пароли - эффективный способ повысить безопасность ваших учетных записей пользователей, даже если злоумышленник получает доступ к вашей базе данных, если все сделано правильно. Можно утверждать, что, имея доступ к соли, злоумышленник может получить ваши учетные данные. Хотя это верно, применение некоторых методов рандомизации для хранения паролей сделает этот процесс чрезвычайно сложным, особенно если хранение информации и контента пользователя разделено на отдельные базы данных.


Зачем и как?

Опять же, это подпадает под «отсутствие уверенности конечного пользователя в обеспечении безопасности». Пользователи обычно используют пароли, которые легко запомнить и даже используют одни и те же пароли на нескольких сайтах (я точно знаю!?). Легко запомнить пароли, как правило, слова, найденные в словаре и других видах значений (например, 12345, QWERTY). Как разработчики мы часто смеемся над этой практикой, но мы не можем отрицать, что это так.

Чтобы веб-приложение использовало соль в пароле, приложение должно его где-то хранить. Не рекомендуется использовать одну и ту же соль для всей базы данных паролей, но для создания уникальной соли для каждого пользователя. Генерация одной соли для всей базы данных фактически снижает безопасность веб-приложения в том смысле, что если злоумышленник может ее взломать, вся схема сломана или потеряна, что делает базу данных бесполезной. Создание полноценной системы регистрации участников со всеми тонкостями выходит за рамки этого учебника, однако мы создадим простую систему для использования примера. Давайте рассмотрим создание соли и применение некоторых методов рандомизации:


1. Соединение с базой данных

Вот таблица SQL, которую мы будем использовать.


2. Файл регистрации

Давайте рассмотрим PHP код. Чтобы все было просто, мы включаем наш файл конфигурации базы данных. Далее PHP проверяет, была ли отправлена форма HTML, проверяя, не являются ли переменные $_POST пустыми. Если они не пусты, скрипт переходит к сохраненным данным пользователя, готовя их к вставке в базу данных. Затем мы генерируем простую соль с использованием uniqid() и mt_rand() и сохраняем ее в переменной $salt_gen. Чтобы солить наш пароль, мы объединяем $password и соль. Следующий шаг, один из способов хэширования комбинированных переменных с помощью md5.

«Но подождите, вы также добавили электронную почту пользователей на передний план пароля и соляную комбинацию!» Ага! Я сделал это, потому что, если злоумышленник каким-то образом получает доступ к моей базе данных и соли, единственный способ, когда злоумышленник точно знает, что адрес электронной почты используется в хэшировании пароля, - это если у него есть доступ к исходному коду. Насколько случайным и уникальным является адрес электронной почты?

В довершение всего остального кода PHP мы вставляем наши переменные в таблицу базы данных в соответствующие поля и предоставляем пользователю некоторую обратную связь об успехе или неудаче. Теперь на оставшуюся часть регистрационного файла HTML.

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


3. Аутентификация пользователя

Итак, теперь у нас есть простая форма регистрации, которая добавляет пользователя в базу данных вместе с его соленым паролем. Давайте создадим страницу входа, которая потребует от нас получения информации из базы данных и проверки подлинности пользователя. Сначала PHP:

Вот то, что в основном мы делаем в файле login.php: принимаем представленные переменные формы, захватывая строку таблицы, связанную с именем пользователя, и восстанавливаем пароль из элементов в базе данных, созданной с помощью (email, pass, salt) и перехэшируем их. Затем мы снова проверяем базу данных для имени пользователя и подтвержденного пароля для поиска соответствия, выводящего пользователя на успех или неудачу. Наконец, вот HTML:


Обфускация в PHP

Простое, но комплексное определение обфускации (используйте версию, содержащуюся в источнике, если вы хотите запустить код):

Как вы можете видеть, этот код не должен отличаться. Нет никаких отдельных имен переменных, комментариев нет, нет интервала, нет отступов, нет четкого порядка, и все это в одной строке. Несмотря на то, что мы не можем читать код, наши машины все еще знают, что это такое. Оно работает. Эта одна строка хаоса просто выводит «Obfusction is a technique used to complicate code in such a way that i t i not understandable.» Да, я знаю об ошибках.

Обфускация имеет свои плюсы и минусы. Цель состоит в том, чтобы не дать человеку выяснить с первого взгляда, что делает код. Это плюс для людей, мало знакомых с языком программирования. Тем не менее, любой, кто имеет базовое понимание PHP, может пытаться читать вышеупомянутый запутанный код и выяснять, что он делает, на это может потребоваться немного времени. Это один из недостатков обфускации, это не форма шифрования, а просто попытка быть зашифрованным. Обфускация также обычно добавляет к размеру файла. Много времени вы потратите на запутанный код в чужом программном обеспечении.


Итак, как я могу скрыть мой код?

Это обычный вопрос. В основном есть два способа обфускации вашего кода. Во-первых, вы можете сделать это вручную. Написание скрытого кода занимает много времени. Пример, используемый в этой статье, занял некоторое время на написание по тем же причинам, что вы, в первую очередь, используете обфускацию (отсутствие структуры, порядка и т. д.), это даже приводило к некоторым ошибкам, которые я даже не хотел выслеживать и исправлять. Второй способ, которым вы можете запутать свой код, - это купить программное обеспечение, которое сделает это за вас. Использование программы для обфускации кода тривиально и, конечно же, стоит много денег. Некоторое программное обеспечение, которое утверждает, что запутывает ваш код, фактически шифрует и / или кодирует его таким образом, что оно требует handshake для работы. Часто вы можно найти программное обеспечение, чей поставщик даже не гарантирует, что ваш код будет работать, когда это будет сделано. Даже в этом примере я использовал простую функцию Base64 для кодирования вывода скрипта.


Несколько приемов обфускации

  • Всегда, всегда, храните чистую версию источника для себя.
  • Чем более случайная ваша техника, тем лучше.
  • Устраните все пробелы, где они не нужны.
  • Кодирование печатных/выведенных символов и пробелов (например, кавычки, пробелы, апострофы, дефисы)
  • Чем сложнее код, тем лучше.
  • Можно пренебречь структурой, если это не нанесет вреда работе кода (например, местоположения переменных до их вызова)
  • Не используйте отличительные имена переменных, пространства имен или имена классов.
  • Чем меньше кода вы используете, тем лучше
  • Не верьте, что это надежно

Делать обфускацию или не делать?

Это зависит от вашего плана. В частности, если вы хотите продать свой PHP-скрипт (или любое программное обеспечение), вам необходимо его лицензировать. Это будет одна из передовых линий защиты, чтобы помешать программным средствам, предназначенным для аудитории, делать то, что они хотят. Яркий пример лицензирования можно увидеть в Envato Marketplace Wiki. Однако, по какой-либо причине, вы можете захотеть запутать часть или весь ваш код. Однако из-за недостатков обфускации, если вы действительно беспокоитесь о безопасности своего исходного кода, скорее всего, стоит смотреть в сторону шифрования.


Криптография в PHP

Wikipedia.com определяет криптографию как:

«практика и изучение сокрытия информации».

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


Одностороннее хэширование

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

SHA-1, 2 и 3

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

В PHP SHA-2 используется в другом отношении и требует, чтобы версия PHP 5 была больше или равна 5.1.2. SHA-2 превосходит SHA-1 и может быть вызван с разными размерами бит.

Хэш-функция вызывается хешем (алгоритм, строка); В новейших версиях PHP функция hash() может использоваться для вызова любого одностороннего хэш-алгоритма, поддерживающего PHP (т.е. md5, sha-1, haval, ghost). Если вы хотите просмотреть список всех зарегистрированных алгоритмов хеширования, вы можете использовать:

SHA-3 все еще разрабатывается и рассматривается для стандартизации. Национальным институтом стандартов и технологий было открыто соревнование для поиска лучшего кандидата, который бы выступил в качестве нового алгоритма безопасного хэширования, а запись для конкурса была ограничена до 31 октября 2008 года. Довольно популярный продукт, названный Skein, доступен как PHP-модуль, который вы можете скачать (хотя вы должны его скомпилировать самостоятельно). Skein разработан несколькими известными людьми в индустрии безопасности, такими как Брюс Шнайер, Нильс Фергюсон и Стефан Лакс. Официальный сайт Skein можно найти здесь.


Шифрование на основе ключа 

Способы симметричного шифрования Symmetric-Key - это когда безопасность шифрования в основном находится внутри ключа, который разделяется между двумя точками, где данные шифруются и где данные дешифруются. Очень хороший пример того, как это может работать, был предоставлен учебным пособием Кристиана Бейкова «Создание класса Crypter Class with PHP».


HMAC

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


Подводя итоги

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.