Контрольный список для разработки безопасного API

задняя часть Безопасность Android AWS

Ниже приведены важные меры безопасности, которые необходимо проверить при разработке, тестировании и публикации API.


Аутентификация

  • Не используйBasic AuthИспользуйте стандартные протоколы аутентификации (например, JWT, OAuth).
  • не воссоздавайAuthentication, token generating, password storingЭти колеса, используйте стандартные.
  • использовать в логинеMax Retryи функция автоматического запрета.
  • Шифруйте все конфиденциальные данные.

JWT (JSON Web Token)

  • Используйте случайный сложный ключ (JWT Secret) для увеличения сложности взлома методом грубой силы.
  • Не извлекайте данные непосредственно в теле запроса, шифруйте данные (HS256илиRS256).
  • Сделайте срок действия токена как можно короче (TTL, RTTL).
  • Не храните конфиденциальные данные в теле запроса JWT, этовзламываемый.

Протокол авторизации или аутентификации OAuth

  • Всегда проверяйте в фоновом режимеredirect_uri, разрешены только URL-адреса из белого списка.
  • Не добавляйте токен каждый раз при обмене токена (не разрешеноresponse_type=token).
  • использоватьstateи заполните его случайным хешем, чтобы предотвратить подделку межсайтовых запросов (CSRF).
  • Определите область по умолчанию и соответствующие допустимые параметры области для различных приложений.

доступ

  • Ограничьте трафик, чтобы предотвратить DDoS-атаки и атаки методом перебора.
  • Используйте протокол HTTPS на сервере для предотвращения атак MITM.
  • использоватьHSTSПротокол для предотвращения атак SSLStrip.

входной фильтр

  • использовать функцию действия HTTP, которая соответствует действию,GET (读取), POST (创建), PUT (替换/更新)а такжеDELETE (删除记录), возвращается, если запрошенный метод недоступен для запрошенного ресурса405 Method Not Allowed.
  • в заголовке запросаcontent-typeПоля используют проверку содержимого, чтобы разрешать только поддерживаемые форматы (например,application/xml, application/jsonи т. д.) и вернуться, если условие не выполнено406 Not Acceptable.
  • проверятьcontent-typeОпубликованные данные совпадают с теми, что вы получили (например,application/x-www-form-urlencoded, multipart/form-data, application/jsonи т.д).
  • Проверяйте вводимые пользователем данные, чтобы избежать распространенных уязвимостей, таких какXSS, SQL-注入, 远程代码执行и т.д).
  • Не используйте конфиденциальные данные в URL-адресе (credentials, Passwords, security tokens, or API keys), вместо этого используя стандартные заголовки проверки подлинности.
  • Используйте службу шлюза API для включения кэширования, ограничения скорости (например,Quota, Spike Arrest, Concurrent Rate Limit) и динамически развертывать ресурсы API.

иметь дело с

  • Проверьте, все ли терминалы прошли аутентификацию, чтобы избежать поломки системы аутентификации.
  • Избегайте использования уникальных идентификаторов ресурсов./me/ordersальтернатива/user/654321/orders
  • использоватьUUIDЗаменяет автоматически увеличивающийся идентификатор.
  • При анализе XML-файлов убедитесь, что анализ объектов отключен, чтобы избежатьXXEатака.
  • При анализе XML-файлов убедитесь, что расширение сущности отключено, чтобы избежать экспоненциальных атак расширения сущности.Billion Laughs/XML bomb.
  • Используйте CDN для загрузки файлов.
  • Если вам нужно обработать много данных, используйте Workers и Queues, чтобы быстро реагировать и избегать блокировки HTTP.
  • Не забудьте отключить режим DEBUG.

вывод

  • ОтправитьX-Content-Type-Options: nosniffголова.
  • ОтправитьX-Frame-Options: denyголова.
  • ОтправитьContent-Security-Policy: default-src 'none'голова.
  • Снимите головку отпечатков пальцев -X-Powered-By, Server, X-AspNet-Versionи Т. Д.
  • Обязательное использование в ответcontent-type, если ваш типapplication/jsonтогда твойcontent-typeэтоapplication/json.
  • Не возвращайте конфиденциальные данные, такие какcredentials, Passwords, security tokens.
  • Возвращает соответствующий код состояния в конце операции (например,200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowedи т.д).

Непрерывная интеграция и непрерывное развертывание

  • Используйте модульные и интеграционные тесты для проверки дизайна и реализации.
  • Внедрите процесс проверки кода, не одобряйте изменения самостоятельно.
  • Убедитесь, что все компоненты службы статически проверены антивирусным программным обеспечением, включая сторонние библиотеки и другие зависимости, прежде чем запускать их в производство.
  • Разработайте схему отката для развертывания.

Система разрешений (Регистрация/Регистрация/Вторичная проверка/Сброс пароля)

  • Используйте HTTPS везде.
  • использоватьBcryptХранить хэш пароля (не нужно использовать соль -BcryptЭто то, что он делает).
  • 登出После этого уничтожьте идентификатор сеанса.
  • Уничтожить все активные сеансы после сброса пароля.
  • Аутентификация OAuth2 должна содержатьstateпараметр.
  • После успешного входа его нельзя напрямую перенаправить на открытый путь (требуется проверка, иначе он подвержен фишинговым атакам).
  • Фильтровать javascript://, data:// и другие символы CRLF при разборе регистрации/входа пользователя.
  • Используйте безопасные/httpOnly файлы cookie.
  • Мобильное использованиеOTPПри проверке, при звонкеgenerate OTPилиResend OTPOTP (одноразовый пароль) нельзя вернуть непосредственно в API. (обычно путем отправки SMS-сообщения с подтверждением на мобильный телефон, случайного кода электронной почты и т. д., а не прямого ответа)
  • Ограничить одного пользователяLogin,Verify OTP,Resend OTP,generate OTPПодождите количество вызовов API и используйте Captcha и другие средства, чтобы предотвратить взлом методом перебора.
  • Проверьте токен сброса пароля в электронном письме или SMS, чтобы убедиться в случайности (не угадывать)
  • Установите срок действия токена сброса пароля.
  • После успешного сброса пароля токен, использованный для сброса, станет недействительным.

Данные пользователя и проверка разрешений

  • Такие как我的购物车,我的浏览历史доступ к ресурсам, например, должен проверить, есть ли у вошедшего в систему пользователя права доступа к этим ресурсам.
  • Чтобы избежать непрерывного обхода идентификаторов ресурсов, используйте/me/ordersзаменять/user/37153/ordersНа всякий случай, если вы забыли проверить разрешения и привести к утечке данных.
  • 修改邮箱/手机号码Функция должна сначала подтвердить, что пользователь подтвердил, что почтовый ящик/мобильный телефон принадлежит ему.
  • Любая функция загрузки должна фильтровать имена файлов, загружаемых пользователем, и по соображениям общности (не из соображений безопасности) загрузки должны храниться в облачном хранилище, таком как S3 (с лямбда-обработкой), а не на собственном сервере, что предотвращает выполнение кода.
  • 个人头像上传функция должна фильтровать всеEXIFярлык, даже без этого требования.
  • Идентификатор пользователя или другой идентификатор, следует использоватьRFC compliant изUUIDвместо целых чисел Вы можете найти реализацию на своем языке на github.
  • JWT (веб-токен JSON)Отлично. Используйте, когда вам нужно создать одностраничное приложение/API.

ПРИЛОЖЕНИЕ для Android и iOS

  • Платежный шлюз盐(salt)не должно быть жестко запрограммировано
  • от третьих лицsecretиauth tokenне должно быть жестко запрограммировано
  • API, которые вызываются между серверами, не должны вызываться из приложения.
  • Под Android будьте осторожны, чтобы оценить все приложения дляразрешение
  • В iOS используйте связку ключей системы для хранения конфиденциальной информации (токены разрешений, ключи API и т. д.).не хотетьСохраните эту информацию в конфигурации пользователя
  • настоятельно рекомендуетсяЗакрепление сертификата

действовать

  • Если у вас небольшой бизнес или у вас нет опыта, рассмотрите возможность использования AWS или платформы PaaS для запуска своего кода.
  • Создавайте виртуальные машины в облаке с помощью формальных сценариев
  • Убедитесь, что все машины не обязательно открыты端口
  • Проверьте, не установлен ли для базы данных пароль или используется пароль по умолчанию, особенно MongoDB и Redis.
  • Войдите на свой компьютер, используя SSH, не используйте пароль, войдите с аутентификацией по ключу SSH.
  • Своевременно обновляйте систему, чтобы предотвратить 0day-уязвимости, такие как Heartbleed, Shellshock и т. д.
  • Измените конфигурацию сервера, HTTPS использует TLS1.2, отключите другие режимы. (стоило того)
  • Не включайте онлайн-режим DEBUG. Для некоторых фреймворков режим DEBUG откроет множество разрешений и бэкдоров или выставит некоторые конфиденциальные данные для информации стека ошибок.
  • Будьте готовы к плохим парням и DDOS-атакам, пользуйтесь услугами хостинга, обеспечивающими очистку от DDOS
  • Контролируйте свою систему и регистрируйте ее (например, используяNew Relicили другой ).
  • Если это бизнес 2B, придерживайтесь требований соответствия. Если вы используете AWS S3, рассмотрите возможность использованияшифрование данныхФункция: при использовании AWS EC2 рассмотрите возможность использования функции шифрования диска (теперь системный загрузочный диск также может быть зашифрован).

о людях

  • Создайте группу рассылки (например:security@coolcorp.io) и страница сбора информации об уязвимостях для исследователей безопасности.
  • В зависимости от вашего бизнеса, ограничьте доступ к пользовательским базам данных
  • Будьте вежливы с теми, кто сообщает об ошибках, уязвимостях
  • Предоставьте свой код коллегам, у которых есть концепция безопасного кодирования, для проверки (больше глаз)
  • При взломе или утечке данных проверяйте журналы перед доступом к данным и уведомляйте пользователей о смене паролей. Вам может понадобиться стороннее агентство для помощи в проведении аудита.
  • использоватьNetflix ScumblrБудьте в курсе некоторой информации обсуждения вашей организации (компании) в социальных сетях или поисковых системах, такой как хакерские атаки, уязвимости и т.д.
происхождениеHack-with-Github/Awesome-Hacking Fallible