Ниже приведены важные меры безопасности, которые необходимо проверить при разработке, тестировании и публикации 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, orAPI 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