Регистрационная форма REST API Best Practices

Я создаю приложение SaaS, используя стек MEAN, и у меня есть несколько вопросов о том, как лучше защитить регистрационные формы. Express.js — это то, что я использую для создания конечных точек (через angular-fullstack)

У меня есть «арендаторы», которые регистрируются с помощью регистрационной формы (имя, адрес электронной почты, пароль и т. д.). Этот REST API в настоящее время не защищен (POST/tenants).

Мои вопросы:

  1. Должен ли я как-то защитить этот POST? Если да, то как?
  2. Если мне не нужно защищать конечную точку POST/tenants, как мне избежать того, чтобы кто-то написал сценарий, чтобы просто создать целую кучу клиентов и атаковать мое приложение?
  3. Я хочу использовать подтверждение по электронной почте, но является ли это хорошей практикой при регистрации нового арендатора?

Я хотел бы получить некоторые отзывы здесь о том, как лучше действовать.

Спасибо!


person harbinja    schedule 18.03.2016    source источник
comment
защита с помощью обычных средств (ssl) не помешает скрипту создать целую группу пользователей, для чего и нужны капчи и приманки. Подтверждение по электронной почте может бороться с этим, но оно также не является надежным. ни капчи, ни приманки.   -  person Kevin B    schedule 18.03.2016


Ответы (2)


reCAPTCHA — это решение, которое я выбрал для решения этой же проблемы.

Цитата с сайта разработчиков Google, посвященного reCAPTCHA, содержит обзор интеграции reCAPTCHA на сайт. Стоит отметить, что кодовая лаборатория Google reCAPTCHA также включает пример для Java.

Обзор

Чтобы начать использовать reCAPTCHA, вам необходимо подписать пару ключей API для своего сайта. Пара ключей состоит из ключа сайта и секретного ключа. Ключ сайта используется для вызова службы reCAPTCHA на вашем сайте или в мобильном приложении. Секретный ключ разрешает связь между серверной частью вашего приложения и сервером reCAPTCHA для проверки ответа пользователя. . Секретный ключ необходимо хранить в безопасном месте в целях безопасности.

Сначала выберите тип reCAPTCHA, а затем заполните авторизованные домены или имена пакетов. После того, как вы примете наши условия обслуживания, вы можете нажать кнопку «Зарегистрироваться», чтобы получить новую пару ключей API.

Теперь выполните следующие действия, чтобы добавить reCAPTCHA на свой сайт или в мобильное приложение:

  1. Choose the client side integration:
  2. Проверка ответа пользователя

И, будучи поклонником Python, вот пример, которому я следовал, чтобы реализовать это решение в Django (ссылка: пример Google codelab):

<сильный>1. Подготовка

Установите и проверьте веб-сервер

Эту кодовую лабораторию можно запустить локально или через оболочку gcloud в Google Cloud Platform. Чтобы начать работу с оболочкой gcloud, перейдите на страницу https://console.cloud.google.com/appengine/start.

Загрузить код

Скопируйте весь код для этой кодлабы:

git clone https://github.com/googlecodelabs/recaptcha-codelab.git

Для Питона:

cd recaptcha-codelab/phase1-python
python server.py

В веб-браузере перейдите по адресу http://localhost:8080, чтобы увидеть пример пользовательского интерфейса без встроенной reCAPTCHA.

<сильный>2. Регистрация в консоли администратора reCAPTCHA

... Мы рекомендуем, если у вас есть время, выполнить и создать свою собственную регистрацию в консоли администратора. Прежде чем использовать reCAPTCHA в разработке или производстве, вам необходимо выполнить этот шаг.

Сначала перейдите на сайт администратора reCAPTCHA.

Выберите «Invisible reCAPTCHA» в качестве типа капчи. введите здесь описание изображения

Заполните список доменов, для которых вы хотите показывать капчу. Ключ сайта reCAPTCHA, который вы создадите, будет работать только на этих доменах. Сохраните ключ сайта и секретный ключ для последующих этапов. введите здесь описание изображения введите здесь описание изображения

<сильный>3. Добавьте невидимую reCAPTCHA во внешний интерфейс — Python

Давайте обновим внешний интерфейс, чтобы вызывать Invisible reCAPTCHA с помощью вашего любимого текстового редактора.

Сначала добавим тег скрипта к элементу html в файле feedback.html.

feedback.html

 <html>
 <head>
   <title>Suggestion page</title>
   <script src='https://www.google.com/recaptcha/api.js'></script>

Теперь обновите атрибуты кнопки отправки. Добавьте class='g-recaptcha' data-sitekey="YOUR SITE KEY" и добавьте data-callback.

feedback.html

     <button class="g-recaptcha"
       data-sitekey="6LfeHx4UAAAAAAKUx5rO5nfKMtc9-syDTdFLftnm"
       data-callback="onSubmit">Submit</button>

Полный файл должен быть:

feedback.html

<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
  <title>Suggestion page</title>
  <script src='https://www.google.com/recaptcha/api.js'></script>
  <script>
    function onSubmit() {
      document.getElementById("demo-form").submit();
    }   
  </script>
  <style>
    body {
      font-family: Helvetica, sans-serif;
    }   
    .status-message {
      background-color: #5ff;
      margin-bottom: 10px;
      text-align: center;
    }   
    textarea {
      margin: 10px 0;
      resize: none;
    }   
  </style>
</head>
<body>
  <h3>Give us feedback on our webpage!</h3>
  <div class="status-message">%s</div>
  <form id="demo-form" action="/feedback" method="POST">
    Your comment <br><textarea name="feedback" cols="50" rows="5"></textarea><br>
    <!-- Replace this with your site key --> 
    <button class="g-recaptcha"
            data-sitekey="6LfeHx4UAAAAAAKUx5rO5nfKMtc9-syDTdFLftnm"
            data-callback="onSubmit">Submit</button>
  </form>
</body>
</html>

<сильный>3. Проверка невидимой reCAPTCHA на сервере — Python

В разделе «Регистрация в консоли администратора reCAPTCHA» мы создали новый ключ сайта. В рамках этого процесса был создан секрет сайта. Секрет сайта необходим для проверки решения CAPTCHA. Для целей этой лаборатории кода вы можете использовать предоставленные ключи по умолчанию. Они будут работать только на локальном хосте.

Проверка токена reCAPTCHA выполняется путем отправки запроса POST на https://www.google.com/recaptcha/api/siteverify. Подробности см. в разделе Проверка ответа пользователя.

Чтобы проверить токен reCAPTCHA, давайте обновим сервер. Сначала нам нужно добавить секрет сайта и константы проверки сайта.

server.py

SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
SITE_SECRET = '6LfeHx4UAAAAAFWXGh_xcL0B8vVcXnhn9q_SnQ1b'
RECAPTCHA_RESPONSE_PARAM = 'g-recaptcha-response'

Затем нам нужно обновить наш обработчик POST, чтобы проверить токен.

server.py

def do_POST(self):
    self.set_headers();
    post_body = parse_qs(self.rfile.read(int(self.headers['Content-Length'])))

    success = False
    if RECAPTCHA_RESPONSE_PARAM in post_body:
      token = post_body[RECAPTCHA_RESPONSE_PARAM][0]
      resp = urllib.urlopen(
          SITE_VERIFY_URL, urllib.urlencode(
              {'secret': SITE_SECRET, 'response': token}, True)).read()
      if json.loads(resp).get("success"):
        success = True

    if success:
      message = 'Thanks for the feedback!'
    else:
      message = 'There was an error.'
    self.wfile.write(open(curdir + sep + 'feedback.html').read() % message)

Окончательный файл должен выглядеть так:

server.py

import json
import urllib
from os import curdir, sep
from urlparse import parse_qs
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

SITE_VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
SITE_SECRET = '6LfeHx4UAAAAAFWXGh_xcL0B8vVcXnhn9q_SnQ1b'
RECAPTCHA_RESPONSE_PARAM = 'g-recaptcha-response'

class Handler(BaseHTTPRequestHandler):
  def set_headers(self):
    self.send_response(200)
    self.send_header('Content-type', 'text/html')
    self.end_headers()

  def do_GET(self):
    self.set_headers();
    self.wfile.write(open(curdir + sep + 'feedback.html').read() % '')

  def do_POST(self):
    self.set_headers();
    post_body = parse_qs(self.rfile.read(int(self.headers['Content-Length'])))

    success = False
    if RECAPTCHA_RESPONSE_PARAM in post_body:
      token = post_body[RECAPTCHA_RESPONSE_PARAM][0]
      resp = urllib.urlopen(
          SITE_VERIFY_URL, urllib.urlencode(
              {'secret': SITE_SECRET, 'response': token}, True)).read()
      if json.loads(resp).get("success"):
        success = True

    if success:
      message = 'Thanks for the feedback!'
    else:
      message = 'There was an error.'
    self.wfile.write(open(curdir + sep + 'feedback.html').read() % message)

if __name__ == '__main__':
  httpd = HTTPServer(('', 8080), Handler)
  httpd.serve_forever()

Готово! Теперь перезагрузите сервер и попробуйте. Завершенную версию можно найти в final-python/server.py. Теперь у вас есть базовая интеграция с reCAPTCHA для защиты вашей формы. В фоновом режиме мы проверяем пользователя и иногда показываем запрос reCAPTCHA, чтобы убедиться, что ваш сайт защищен от злоупотреблений. Дополнительную информацию и варианты можно найти на нашем сайте для разработчиков.

Обратите внимание: я независимый разработчик программного обеспечения, не связанный с Google.

person MikeyE    schedule 28.12.2019
comment
Отметив это как решение, потому что это то, что мы в итоге сделали. Оглядываясь назад, я должен был обновить этот вопрос своим решением.... но на данный момент он довольно старый :) - person harbinja; 14.01.2020

Вам следует просмотреть веб-сайт Open Web Application Security Project (OWASP) и их 10 основных уязвимостей. Там много информации. Я также рекомендую соблюдать их шпаргалки. Этот ресурс является полезным местом для начала работы. Веб-безопасность сложна и требует комплексной схемы защиты.

person Brett    schedule 18.03.2016