Памятка PHP разработчика
Настройки PHP при разработке в качестве рекомендации
1) error_reporting = E_ALL | E_STRICT
2) display_errors = On
3) register_globals,register_long_arrays,magic_quotes off (первые 2 удалены в 5.4)
4) short_open_tag off
5) allow_call_time_pass_reference = off (Удалено в 5.4)
6) safe_mode — все настройки off (Удалено в 5.4)
Типичные уязвимости
Загрузка файлов:
1. Заливка исполняемого файла
2. Исполнение неопределённых Mime Type Apache например file.php.7z
3. Исполнение мета-информации например исполняемый image.gif
4. Уязвимость связки php+nginx (выставить cgi.fix_pathinfo=0)
5. Выставление некорректных прав на загружаемый файл
Код:
1. Ядовитый ноль он же нулевой байт он же символ конца строки %00, позволяет производить php injection
2. Не фильтрованный ввод
3. SQL injection
4. XSS
5. Remote File Inclusion [RFI] (отключаем allow_url_include = Off)
6. Возможность перехвата сессии (привязываем к клиенту)
7. Rainbow Table подбор ( храним пароли в sault md5)
8. Автоматизированное внедрение iframe (иногда помогает вынос точки выхода из приложение в файл отличный от index + exit в конце) (Такая простая мера очень часто меня спасала)
9. CSRF — Cross-Site Request Forgery (имитирование запроса пользователя к стороннему сайту)
Полезные советы
1. По возможности сливайте часто используемые библиотеки в один файл, уменьшайте количество include / require
2. Мониторьте кол-во расходуемой памяти, время генерации и количество запросов, наличие одинаковых запросов.
3. Выставляйте unset($v) после циклов вида foreach($data as $k=>&$v)
4. Javascript проверка «,» Всеми нами любимый IE не переваривает композиций вида var a = {one:1,two:2,} удаляем лишние «,» также выставляем недостающие «;»
5. Будьте внимательны к наличию необоснованных циклов особенно вложенных, тем более с запросами к базе
6. Используйте минифицированные, объединённые JavaScript файлы
7. Используйте спрайты
8. Выносите js,css код со страницы в файлы
9. Кэшируйте при возможности
11. Минимизируйте жёсткую связанность кода
12. Пишите «reusable» код, избегайте копи-паста
13. Отделяйте логику от представления
14. Избегайте злоупотребления ООП
15. Используйте единообразный утверждённого или выбранный coding style
16 Учитывайте ограничение integer в 32 битных системах от -2147483648 до 2147483647
17. Выставляйте адекватные индексы в таблицах
18. Сортируйте загружаемые файлы в папки, так чтобы не скапливалось больше 200-300 в одной. Например /uploads/user/a/an/anonimus
19. Уменьшайте размер загружаемых картинок, делайте thumbnail'ы (очищает мета информацию, облегчает загрузку страницы)
20. Адекватно и оправданно выбирайте storage engine для таблиц MySQL
21. Откажитесь от выборки лишних полей из BD ( select *)
22. Избегайте большого неоправданного количества объединений (JOIN) в запросах
23. Primary Key — unsigned integer auto increment (особенно в innodb никаких md5 в primary key иначе таблица будет перестраиваться при каждом insert !)
24. Профилирование и трассировка тяжёлых мест (xdebug + cachegrind) поможет найти неочевидные причины
25. При работе с SOAP учитывайте ошибку Zend_Soap_AutoDiscover и eAccelerator
26. Бэкапы товарищи, бэкапы…
Чек-лист перед запуском production
0 — Работа с сервером только по защищённому каналу, никакого ftp, особенно осторожно подключаемся с windows машин.(Довольно часто приходилось чистить сайты от iframe)
1. Сложный пароль
2. Разрешить только локальный доступ к MySQL skip_networking
3. Для скриптов отдельный пользователь mysql с пониженными привилегиями
4. Запрет просмотра содержимого директории
5. Выставление корректных прав доступа на скрипты и файлы
6. Убедиться в отсутствии .svn или хотя бы прав на их просмотр
7. Отключить вывод ошибок
8. Register_globals, magic_quotes off
9. Проверить выделяемый объем памяти на скрипт
10. Проверить максимальный размер загружаемого файла
11. На некоторых проектах предпочитаю expose_php = off, при использовании определённого вида ЧПУ сложно определить на чем написан сайт.
12. Подключён ли production конфиг
13. При наличии сторонних библиотек, проверить содержимое директорий удалить install и demo. При наличии WYSIWYG проверить возможность исполнения извне, при наличии spaw editor наложить security patch, при наличии fck editor обновить до ck editor. Проверить наличие обновлений, если есть открытые уязвимости для сторонних библиотек — постараться наложить собственные патчи.
14. Изменение default настроек mysql (тюнинг) habrahabr.ru/blogs/mysql/66684/
15. Изменение default настроек apache (тюнинг) greenmice.info/ru/node/98
16. Изменение default настроек nginx (тюнинг) habrahabr.ru/blogs/nginx/56497/
17. По возможности поставить eAccelerator и nginx
18. Запретить заход от root в консоль (/etc/securetty)
19. Отключить лишние неиспользуемые библиотеки PHP, модули Apache
20. Проверить наличие сайтов предрасположенных к взлому на этом же сервере, далее по ситуации (иногда переношу на чистый сервер, если необходимо обеспечить безопасность)
21. Настроить сжатие если nginx (не больше 5, либо ngx_http_gzip_static_module)
и mod_deflate если Apache
1) error_reporting = E_ALL | E_STRICT
2) display_errors = On
3) register_globals,register_long_arrays,magic_quotes off (первые 2 удалены в 5.4)
4) short_open_tag off
5) allow_call_time_pass_reference = off (Удалено в 5.4)
6) safe_mode — все настройки off (Удалено в 5.4)
Типичные уязвимости
Загрузка файлов:
1. Заливка исполняемого файла
2. Исполнение неопределённых Mime Type Apache например file.php.7z
3. Исполнение мета-информации например исполняемый image.gif
4. Уязвимость связки php+nginx (выставить cgi.fix_pathinfo=0)
5. Выставление некорректных прав на загружаемый файл
Код:
1. Ядовитый ноль он же нулевой байт он же символ конца строки %00, позволяет производить php injection
2. Не фильтрованный ввод
3. SQL injection
4. XSS
5. Remote File Inclusion [RFI] (отключаем allow_url_include = Off)
6. Возможность перехвата сессии (привязываем к клиенту)
7. Rainbow Table подбор ( храним пароли в sault md5)
8. Автоматизированное внедрение iframe (иногда помогает вынос точки выхода из приложение в файл отличный от index + exit в конце) (Такая простая мера очень часто меня спасала)
9. CSRF — Cross-Site Request Forgery (имитирование запроса пользователя к стороннему сайту)
Полезные советы
1. По возможности сливайте часто используемые библиотеки в один файл, уменьшайте количество include / require
2. Мониторьте кол-во расходуемой памяти, время генерации и количество запросов, наличие одинаковых запросов.
3. Выставляйте unset($v) после циклов вида foreach($data as $k=>&$v)
4. Javascript проверка «,» Всеми нами любимый IE не переваривает композиций вида var a = {one:1,two:2,} удаляем лишние «,» также выставляем недостающие «;»
5. Будьте внимательны к наличию необоснованных циклов особенно вложенных, тем более с запросами к базе
6. Используйте минифицированные, объединённые JavaScript файлы
7. Используйте спрайты
8. Выносите js,css код со страницы в файлы
9. Кэшируйте при возможности
11. Минимизируйте жёсткую связанность кода
12. Пишите «reusable» код, избегайте копи-паста
13. Отделяйте логику от представления
14. Избегайте злоупотребления ООП
15. Используйте единообразный утверждённого или выбранный coding style
16 Учитывайте ограничение integer в 32 битных системах от -2147483648 до 2147483647
17. Выставляйте адекватные индексы в таблицах
18. Сортируйте загружаемые файлы в папки, так чтобы не скапливалось больше 200-300 в одной. Например /uploads/user/a/an/anonimus
19. Уменьшайте размер загружаемых картинок, делайте thumbnail'ы (очищает мета информацию, облегчает загрузку страницы)
20. Адекватно и оправданно выбирайте storage engine для таблиц MySQL
21. Откажитесь от выборки лишних полей из BD ( select *)
22. Избегайте большого неоправданного количества объединений (JOIN) в запросах
23. Primary Key — unsigned integer auto increment (особенно в innodb никаких md5 в primary key иначе таблица будет перестраиваться при каждом insert !)
24. Профилирование и трассировка тяжёлых мест (xdebug + cachegrind) поможет найти неочевидные причины
25. При работе с SOAP учитывайте ошибку Zend_Soap_AutoDiscover и eAccelerator
26. Бэкапы товарищи, бэкапы…
Чек-лист перед запуском production
0 — Работа с сервером только по защищённому каналу, никакого ftp, особенно осторожно подключаемся с windows машин.(Довольно часто приходилось чистить сайты от iframe)
1. Сложный пароль
2. Разрешить только локальный доступ к MySQL skip_networking
3. Для скриптов отдельный пользователь mysql с пониженными привилегиями
4. Запрет просмотра содержимого директории
5. Выставление корректных прав доступа на скрипты и файлы
6. Убедиться в отсутствии .svn или хотя бы прав на их просмотр
7. Отключить вывод ошибок
8. Register_globals, magic_quotes off
9. Проверить выделяемый объем памяти на скрипт
10. Проверить максимальный размер загружаемого файла
11. На некоторых проектах предпочитаю expose_php = off, при использовании определённого вида ЧПУ сложно определить на чем написан сайт.
12. Подключён ли production конфиг
13. При наличии сторонних библиотек, проверить содержимое директорий удалить install и demo. При наличии WYSIWYG проверить возможность исполнения извне, при наличии spaw editor наложить security patch, при наличии fck editor обновить до ck editor. Проверить наличие обновлений, если есть открытые уязвимости для сторонних библиотек — постараться наложить собственные патчи.
14. Изменение default настроек mysql (тюнинг) habrahabr.ru/blogs/mysql/66684/
15. Изменение default настроек apache (тюнинг) greenmice.info/ru/node/98
16. Изменение default настроек nginx (тюнинг) habrahabr.ru/blogs/nginx/56497/
17. По возможности поставить eAccelerator и nginx
18. Запретить заход от root в консоль (/etc/securetty)
19. Отключить лишние неиспользуемые библиотеки PHP, модули Apache
20. Проверить наличие сайтов предрасположенных к взлому на этом же сервере, далее по ситуации (иногда переношу на чистый сервер, если необходимо обеспечить безопасность)
21. Настроить сжатие если nginx (не больше 5, либо ngx_http_gzip_static_module)
и mod_deflate если Apache
0 комментариев