Безопасное кодирование — это не просто "не делать ошибок". Это целая философия: не доверять никаким пользовательским вводам, проверять каждый внешний источник и правильно форматировать каждый вывод. Опытные разработчики называют это "defense in depth" — то есть защита должна быть на каждом уровне. Если один уровень не сработает, второй защитит. Этот подход особенно важен в веб-приложениях, поскольку они постоянно открыты для атак через интернет.
SQL injection — самая опасная уязвимость
SQL injection — это когда атакующий получает возможность управлять базой данных, добавляя свои команды в SQL запрос. Например, если вы напрямую вставляете ID, введенный пользователем, в SQL, атакующий может написать "1 OR 1=1" вместо ID и прочитать всю таблицу. Или написать "1; DROP TABLE users" и полностью удалить таблицу. Единственный правильный способ защиты — использовать prepared statements. В prepared statements PDO или MySQLi данные не смешиваются с SQL кодом, и возможность атаки исчезает.
XSS — атака Cross-Site Scripting
XSS атака — это внедрение чужого JavaScript кода в страницу. Если вы выводите текст, введенный пользователем, напрямую в HTML страницу, атакующий может через script тег украсть сессионные cookie, перенаправить пользователя на другой сайт или совершить действия от его имени. Защита очень проста: перед выводом нужно использовать функцию htmlspecialchars() с флагом ENT_QUOTES. Дополнительно заголовок Content Security Policy дает еще один уровень защиты.
CSRF — Cross-Site Request Forgery
В CSRF атаке пользователь сам того не зная совершает действие на другом сайте. Например, пользователь вошел на ваш сайт и его сессия открыта. Затем он заходит на другой сайт, где есть скрытая форма, отправляющая запрос на ваш сайт — браузер автоматически добавляет cookie и запрос выполняется. Защита — использование уникального CSRF токена в каждой форме. Этот токен хранится в сессии и проверяется на сервере.
Secure defaults — безопасные настройки по умолчанию
Хорошая программа должна быть написана так, чтобы если разработчик не сделал никаких настроек, система все равно была в безопасном состоянии. Например, новый пользователь не должен автоматически получать права администратора. Новый файл не должен быть автоматически открыт для всех. Cookie должны автоматически быть HttpOnly и Secure. Сессия должна автоматически регенерироваться. Этот принцип называется "secure by default" и применяется как стандарт в современных фреймворках.
Code review — важен взгляд со стороны
Даже самый опытный разработчик делает ошибки. Поэтому при командной работе каждое изменение должно быть просмотрено другим разработчиком. В процессе code review не только находятся ошибки, но и происходит обмен знаниями. Кроме того, инструменты автоматического анализа — SonarQube, PHPStan, Psalm — постоянно отслеживают качество кода. Эти инструменты могут также выявлять потенциальные проблемы безопасности.
Практика Sayt.uz
На платформе Sayt.uz все SQL запросы выполняются через PDO prepared statements. Пользовательские вводы фильтруются htmlspecialchars(), а заголовки Content Security Policy активированы. Каждая важная форма защищена CSRF токеном. Если разместите свой сайт на хостинге Sayt.uz, защитные слои на уровне сервера дают дополнительную безопасность. Также доступна регистрация домена и установка SSL сертификата.