Данные концепции являются различными, но сильно связными
Безопасность — это процесс защиты личных данных и систем от
несанкционированного доступа
Конфиденциальность — это предоставление пользователю возможность
контролировать как его данные собираются, хранятся, используются и что они не
используются безответственно
В приложении необходимо корректно реализовать их вместе
Безопасное приложение может предоставлять безопасный доступ к конфиденциальным
данным других пользователей
Конфиденциальная информация может быть скрыта от обычного пользователя, но
доступна для нарушителя, т.к. передаётся по незащищённым каналам связи
Контексты безопасности (важно для подключения JavaScript-документов)
. . .
Многие вопросы не будут рассмотрены в данной лекции, однако рекомендуется самостоятельно ознакомиться со всеми актуальными угрозами и способами их противодействия
Информацию необходимо защищать как на стороне клиента, так и на стороне сервера
Веб-браузеры включают в себя множество средств защиты информации
Серверам необходимо корректно настраивать данные средства
Серверам необходимо корректно обрабатывать запросы от других клиентов
Корректно зашифрованный поток передачи данных обеспечивает безопасную передачу
данных между веб-браузером и сервером: если данные будут перехвачены третьей
стороной, то они не смогут их проанализировать
На настоящий момент безопасным считается шифрование с помощью протокола
TLS,
лежащего в основе протокола HTTPS (HTTP Secure)
Для реализации шифрования необходимо:
Зафиксировать доменное имя сервера (получить доступ или приобрести)
Получить подписанный сертификат, являющийся основой для шифрования данных
Можно заплатить доверенному центру сертификации за выпуск сертификата
Можно обратиться к сервису автоматизированного управления сертификатами
(Automated Certificate Management Environment, ACME), например Let’s
Encrypt
Подключить сертификат к веб-серверу либо внутри веб-приложения, либо на уровне
прокси-сервера
Без корректной реализации шифрования обеспечить безопасность невозможно
Веб-браузер может отображать смешанное
содержимое,
т.е. когда часть данных получена по шифрованному каналу, а часть данных по
незашифрованному каналу. Даже частичная передача данных по нешифрованному каналу
может значительно снизить безопасность. По умолчанию такое поведение
блокируется,
что хорошо
Сервер может использовать устаревшие схемы
шифрования,
что значительно снижает безопасность пользователя, своевременно обновляйте
настройки шифрования, которые устанавливает сервер
Следующие технологии используются для реализации контроля источника запроса
Политика того же источника определяет как документ или скрипт, загруженный с одного источника может взаимодействовать с ресурсом из другого источника
Cross-Origin Resource Sharing (CORS) — механизм, использующий дополнительные заголовки, позволяющий агенту получить разрешение на доступ к ресурсам сервера
Первая технология запрещает доступ к ресурсам сервера, если запрос был сделан со страницы, загруженной с другого домена
Доступ к данным должен осуществляться только уполномоченными лицами, чтобы исключить неправомерное использование, изменение, удаление данных или нарушение работы веб-приложения
Для обеспечения безопасности на стороне сервера необходимо выполнять работу систематически над:
Исходным кодом веб-приложения (ошибки должны остутствовать)
Обновлениями безопасности веб-сервера и другой инфраструктуры
Политикой хранения и обновления паролей (как приложения, так и инфраструктуры)
Настройками безопасности клиентского кода
Это комплексная задача, корректное решение которой требует детального понимания всех аспектов работы приложения и его окружения
Уязвимости SQL-инъекций позволяют злоумышленникам выполнять произвольный SQL-код в базе данных, позволяя получать, изменять или удалять данные независимо от реализованной системы прав пользователя
Эта уязвимость присутствует, если пользовательский ввод, который передаётся в SQL-запрос, может изменить смысл оператора
Рассмотрим следующий код по подготовке SQL-запроса:
val statement = "SELECT * FROM users WHERE name = '$userName';"
Если переменная userName передаётся от пользователя (например в параметрах запроса), то пользователь может передать туда следующую строку:
a';DROP TABLE users; SELECT * FROM userinfo WHERE 't' = 't
В результате выполнится SQL-код:
SELECT * FROM users WHERE name = 'a';DROPTABLE users; SELECT * FROM userinfo WHERE't' = 't';