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-х дней.