Виктор Зинченко

software engineer в infopulse

преподаю в качестве хобби

снял курс по PHP

имею какой-то сертификат по PHP

люблю программировать, веду блог

Кого ломали?

Кто переживает?

Кто здесь? Fingerprints

Меньше знаешь — крепче спишь

Отображение ошибок

error_reporting(...);

ini_set('display_errors', ...);

Debug mode

Использование защищенного соединения https

Стоит 10$ / год за домен. Или бесплатно

в чем отличие от http?

PHP

=  сценарий

На входе:

  • Формы
  • Файлы
  • Заголовки запроса
  • API
  • другое

PHP

=  сценарий

На выходе:

  • Веб-страница
  • Операции с данными (БД, файлы)
  • Консольные команды
  • Ответ API
  • другое

 

Зло может манипулировать данными!

Не доверять входящим данным

Filter input

Escape output

Фильтрация данных

Являются ли данные такими, как мы ожидаем?

Фильтрация данных

Белые списки

Фильтруйте приходящие данные!

XSS (Cross-Site Scripting)

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

XSS (Cross-Site Scripting)

  • Получить несанкционированный доступ
  • Совершить действие от лица пользователя
  • Ввести в заблуждение

Зло может:

XSS (Cross-Site Scripting)

  • Отфильтровать данные на входе (насколько возможно)
  • Экранирование на “выходе”

Как бороться с XSS:

XSS (Cross-Site Scripting)

Экранирование = заставить специальные символы

вести себя как обычные.

 

Как бороться с XSS:

php: htmlspecialchars()

Экранирование

Экранирование = заставить специальные символы вести себя как обычные

Экранирование

  • Веб-страница
  • Операции с данными: работа с БД, файловой системой
  • Выполнение консольных команд
  • Ответ API
  • Другое

 

Правила будут разные:

Экранирование

  • БД:   ‘  “ \n \r …
     
  • HTML:    & < > ‘ “
     
  • Консоль:  ! ? $ % $ # & * ( ) [ ] { }   ………… 

 

О_О

Выполнение произвольного SQL запроса

SQL injection

Достигается манипуляцией параметрами запроса

$query  = "SELECT * FROM products ORDER BY name LIMIT $_POST['limit'];";

Фильтрация входящих данных не спасет

SQL injection

Экранируйте данные

правильно

Вручную

SQL injection

  • addslashes()
  • mysql_escape_string()
  • mysql_real_escape_string()

Почему нет?

Используйте prepared statements

SQL injection

$sql = "SELECT * FROM user WHERE email = :email";
$q = $db->prepare($sql);
$q->bindValue(':email', $email);
$user = $q->fetch();

 

Проверка на mime тип

Загружаемые файлы

https://site.com/uploads/index.php

Пересохраняйте изображения

Загружаемые файлы

удаляем мета-данные

Подделка запроса

Cross site request forgery

Сторонний сайт инициирует злонамеренный
запрос к Вашему ресурсу 

Подделка запроса

Cross site request forgery

Использовать токен

  1. К каждой форме добавляется токен.
  2. Токен добавляется в хранилище (на сервере).
  3. После отправки формы токены сравниваются.

Многие умеют "из коробки"

проверить referer / защищенное соединение

Пароли

1. Нельзя хранить!!!

Почему?

Пароли

2. Могут подобрать

Что делать?

  • Добавить captcha
  • Ограничить попытки
  • Что-нибудь еще -->

Пароли

3. Могут украсть БД

Что делать?

Не хранить пароли в открытом виде. Хранить хеши

но... Что такое хеш?

Это происходит даже у "больших"

Пароли

3. Могут украсть БД

Где соль не поможет?

Почему GPU, а не CPU?

Как перебирают хеши? Как сокращают время?

От чего помогает соль?

Пароли

3. Могут украсть БД

bcrypt

  • Параллельные вычисления
  • Медленно перебирается
  • Можно регулировать сложность (cost)
    + 1 cost = iterations x 2

Что делать?

Обновляйте ПО

  • ОС
  • Веб-сервер
  • PHP
  • СУБД

Пишите логи

  • Умеет немного больше, чем блог
  • Работает с пользователями
  • Платежи
  • ...

 

Если ваш сайт:

Пишите логи

  • Запросы пользователей
  • Запросы к БД
  • Отчеты об ошибках
  • ...

 

Что писать в логи?

Пишите логи

 

Как и чем писать логи?

Настраивайте правильно

  • Права под которыми запущен PHP
  • Права пользователей базы данных
  • Веб-сервер для избежания fingerprints
  • Отображение ошибок

Если вы проиграли

  • Потушите сайт
  • Включите заглушку
  • Устраните проблему
  • Запускайтесь снова

0..24 h

Команда должна знать что делать

Если вы проиграли

  • Оцените ущерб
  • Живем? Хорошо :)
  • Попросить пользователей
    поменять пароли. Но ведь bcrypt? Почему?
  • Сделать review, привлечь консультантов,
    объявить конкурс на поиск уязвимостей, ...

0..72 h

Хищение куки

Проверка доступа (авторизация)

Утечки в git, svn

Объекты в ajax

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

Уязвимости библиотек

DDOS

Clickjacking

Что еще? :)

Безопасность = процесс

Спасибо

 

zinchenko.us