D
D
Dmitry2015-05-10 01:38:32
PHP
Dmitry, 2015-05-10 01:38:32

How to protect the site from malicious attacks?

Здравствуй, Тостер!

Вопрос мой уж очень расплывчатый, поэтому немного предыстории.
Некоторое время назад наш сайт начали спамить реквестами. Злоумышленники нашли дыру и остановили работу нашего сервиса на некоторое время. Пока наша команда занималась добавлением новой защиты, меня заинтересовал вопрос: от куда будет следующая атака?

Понятно, что это далеко не последний раз. Будут и другие попытки взлома, нахождения эксплойтов и DDoS атак.
Так вот, Тостер, помоги нам. Сайт написан на PHP и на некоторых страницах присутствует AJAX. Писали всё сами и искать ошибки придётся самим.

С чего стоит начать? Какие страницы сайта наиболее подвержены атакам? Где проще всего допустить ошибки?
Какие методы защиты и проверки кода вы используете? Любые советы, истории и статьи приветствуются.

Answer the question

In order to leave comments, you need to log in

4 answer(s)
I
index0h, 2015-05-10
@0xfr3

1. Пользователь всегда врет. Все без исключения входящие данные ОБЯЗАТЕЛЬНО должны валидироваться, в случае ошибки - шлем на йух.
2. Для средних систем - вполне норм подход: во всех публичных методах выполнять обязательную проверку всех аргументов простых типов, чуть что не так - исключение. Так как проверок будет море - критично время их выполнения, можете посмотреть мой проектик: https://github.com/ko-ko-ko/php-assert
Пример использования:

/**
 * @param string $login
 * @param string $password
 * 
 * @return int
 * @throws \InvalidArgumentException
 */
public function login($login, $password)
{
    Assert::assert($login, 'login')->lengthBetween(4, 16);
    Assert::assert($password, 'password')->lengthBetween(6, 20);
    
    // Business logic here
}

Код конечно после таких действий не самый красивый, но надежный. В случае действительно крупного проекта - вполне норм делать проверки в приватных и защищенных методах. Многомерные массивы как аргументы методов можно использовать только в безвыходных ситуациях.
3. Гетеры и Сеттеры - обязательно. По хорошему классов с публичными свойствами быть не должно.
4. Права на запуск ТОЛЬКО у точек входа, например index.php.
5. Log - твой друг. Каждое исключение обязательно должно сохраняться для выяснения причин.
6. Жесткая блокировка типов запросов. Например на главной - только GET, на login - только POST.
7. По хорошему в мир должен смотреть только 80/443 порты.
8. Блокировка сканнеров - в случае подключения запросов на то, чего у вас нет публично, pma (phpmyadmin) например - банить по ip на час, или больше. *Если у вас таки есть публичный pma - сами себе злобные буратины))
9. По хорошему - стоит снимать метрики работоспособности вашей системы, например в zabbix, это косвенно решает проблему безопасности: отклонение метрик - маячок.
10. Система контроля версий на проде обязательна, но с заблокированным push + системные файлы vcs закрыты для мира.
11. Доступ к проду только у сисадмина и тим лида.
12. Ручные правки кода в не релизное время выполняет тимлид и только после апрува руководства. Эти правки ОБЯЗАТЕЛЬНО должны быть сохранены в репозиторий в ближайшее время, например в течении 3-х дней.

Назар Мокринский, 2015-05-10
@nazarpc

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

Антон Иванов, 2015-05-10
@Fly3110

Можно воспользоваться Acunetix Web Vulnerability Scaner. У него есть триал на 14 дней.

S
sivabur, 2015-05-10
@sivabur

Ну смотрите топ по количеству уязвимость по конкретной уже подчитывайите как она работает и какии способы защиты.
1. sql injection
2. xss
etc.
Так же желательно скрывать инфу о сервере.Какой язык используется/какая ос используется/используется ли апач или еще что то/подключить cloudfre etc. и потом сменить ип-его не будут знать извне/использовать последние версии php 5.5 5.6

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question