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

Пишем свой стартап: повышение безопасности

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Invite People via URL
Building Your Startup: Preparing for Text Messaging

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

Final product image
What You'll Be Creating

Этот учебник является частью серии Пишем свой стартап на PHP на Envato Tuts +. В этой серии я показываю вам запуск приложения от самой концепции до реального приложения, используя приложение «Планировщик встреч» в качестве примера. Каждый шаг по пути, я выпущу код планировщика собраний в качестве примеров с открытым исходным кодом, из которых вы можете узнать. Я также рассмотрю связанные с запуском бизнес-вопросы по мере их возникновения.

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

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

Повышение безопасности

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

Защита ключей и кодов

Очевидно, что важно хранить ключи подальше от хакеров, но их также довольно легко опубликовать в GitHub. Часто можно увидеть истории о случайно выложенных файлах с паролем или ключом API.

Чтобы предотвратить это в Yii, я сохраняю внешний .ini-файл за пределами дерева кода. Он загружается вверху /frontend/config/main.php и используется для любой необходимой конфигурации компонента:

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

Формат файла инициализации довольно простой:

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

Таким образом, важно, чтобы ваш файл .gitignore исключал локальные версии этих файлов:

Ниже приведен пример одного из моих локальных файлов параметров: /frontend/config/params-local.php:

Я мог бы потратить еще больше времени, чтобы лучше организовать их.

Блокировка плохих подписей

Building Your Own Startup - Preventing Spam Signups

Для альфа-релиза я отправил обновления в волнах. И на ранних стадиях Планировщика собраний было больше сообщений о плохих сообщениях, чем я ожидал. Mailgun упростил определение отказов и сбоев:

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

Совсем недавно, добавив социальные логины, я сделал вход в Meeting Planner довольно простым, но спам-регистрации все еще возможны. Мне хотелось, чтобы людям было сложно регистрироваться с плохими адресами электронной почты.

К счастью, Yii предлагает несколько функций, которые поддерживают это.

Captcha

Yii2 теперь предлагает встроенную captcha. Таким образом, каждый, кто зарегистрировался со старым методом электронной почты и пароля, должен ввести каптчу. Вы можете увидеть поле captcha:

Затем, как правило, для образца в формате RegisterForm добавляется соответствие captcha:

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

Проверка DNS

Я также хотел свести к минимуму регистрацию с поддельным адресом электронной почты. Валидация checkDNS Yii на самом деле ищет действительную запись MX на основе домена адреса электронной почты:

Так, например, если я ошибался и вместо gmail.com использовал gmal.com, checkDNS возвращает false. Нет зарегистрированной записи MX для gmal.com. Аналогично, для spambotolympics9922.com нет.

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

Ограничение оскорбительных действий

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

Создание собрания

Чтобы люди не могли создавать множество пустых собраний, я создал findEmptyMeeting, который ищет пустую встречу и повторно использует ее, когда кто-то пытается создать новую:

Другими словами, если пользователь собирается создать новое собрание 1,700 раз, ему всегда будет представлено первая пустая встреча.

Ограничение частоты действий

Я также создал обычно структурированный метод inLimit для повторного использования приложения, который мог бы предотвратить слишком много действий за слишком короткое время. В приведенном ниже примере проверяется, что за последний час и последний день было создано не более n собраний:

В любое время, когда кто-то пытается создать собрание, мы проверяем withinLimit. Если нет, мы покажем flash сообщение об ошибке:

Ограничение количества действий

Я также хотел ограничить общее количество действий. Например, каждый участник собрания может добавить только семь дней встречи на собрание. В MeetingTime.php я устанавливаю MEETING_LIMIT, поэтому его можно будет изменить позже:

Затем MeetingTime:: withinLimit() проверяет:

Когда пользователь хочет создать MeetingTime, контроллер создает метод проверки лимитов:

Защита задач CRON

Наконец, сегодня я хотел защитить доступ к удаленным cron задачам. Есть несколько интересных подходов, описанных в interwebs. На данный момент я проверяю, что$_SERVER['REMOTE_ADDR'](запрашивающий IP-адрес) является тем же сервером, что и хостинг $_SERVER ['SERVER_ADDR'], локальный IP-адрес. $_SERVER['REMOTE_ADDR'] безопасен для использования в целях безопасности - другими словами, я читал, что его нельзя подделать.

Для моего собственного тестирования я также разрешаю зарегистрированному администратору выполнять задания cron.

В конце концов, я также могу добавить пароль для своих заданий cron и переместить их в операциях командной строки.

Заглядывая вперед

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

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

Как всегда, вы можете следить за предстоящими учебниками в разделе «Пишем свой стартап на PHP» или подписаться на меня в Twitter @reifman. Есть еще несколько больших функций.

Ссылки по теме

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.