Securly Хранение идентификаторов OpenID и маркеров OAuth

Я определенно согласился бы с вышеупомянутыми сообщениями, но у меня есть одна мелочь для добавления в ответ на ответ Cheekysoft, конкретно:

Когда дело доходит до запросов базы данных, всегда пытайтесь использовать подготовленные параметризированные запросы. mysqli и библиотеки PDO поддерживают это. Это бесконечно более безопасно, чем использование функций выхода, таких как mysql_real_escape_string.

Да, mysql_real_escape_string является эффективно просто строковой функцией выхода. Это не чудодейственное средство. Все, что это сделает, выйти из опасных символов, чтобы их могло быть безопасно использовать в строке единого запроса. Однако, если Вы не санируете свои исходные данные заранее, тогда Вы будете уязвимы для определенных векторов атаки.

Воображают следующий SQL:

$result = "ВЫБИРАЮТ полевую таблицу FROM ГДЕ идентификатор =" .mysql_real_escape_string ($ _POST ['идентификатор']);

необходимо быть в состоянии видеть, что это уязвимо для использования. Предположите, что идентификационный параметр содержал общий вектор атаки:

1 ИЛИ 1=1

нет никаких опасных символов там для кодирования, таким образом, это передаст прямо через фильтр выхода. Отъезд нас:

таблица FROM полей SELECT, ГДЕ идентификатор = 1 ИЛИ 1=1

я кодировал быструю небольшую функцию, что я вставил свой класс базы данных, который разделит что-либо, что не является числом. Это использует preg_replace, таким образом, существует prob более оптимизированная функция, но это работает в повышении...

function Numbers($input) {
  $input = preg_replace("/[^0-9]/","", $input);
  if($input == '') $input = 0;
  return $input;
}

Так вместо того, чтобы использовать

$result = "ВЫБИРАЮТ полевую таблицу FROM ГДЕ идентификатор =" .mysqlrealescapestring ("1 ИЛИ 1=1");

я использовал бы

$result = "ИЗБРАННАЯ полевая таблица FROM ГДЕ идентификатор =".Numbers ("1 ИЛИ 1=1");

и это безопасно выполнило бы запрос

таблица FROM полей SELECT, ГДЕ идентификатор = 111

Несомненно, который просто мешал ему отобразить корректную строку, но я не думаю, что это - большая проблема для того, кто бы ни пытается ввести sql в Ваш сайт;)

58
задан Matt McCormick 10 December 2009 в 05:38
поделиться

4 ответа

Во-первых, есть зарегистрированная заявка, которая имеет consumer_key и consumer_secret.

Когда пользователи аутентифицируют и "разрешают" вашу зарегистрированную заявку, вы возвращаетесь: access_token, который считается "паролем" пользователя и позволяет ВАШЕМУ приложению действовать от имени пользователя.

Таким образом, получение простого access_token пользователя из вашей базы данных не сильно поможет, если у него также нет consumer_key и consumer_secret для полного доступа.

Поставщик услуг сравнивает все 4 параметра по запросу. Было бы разумно зашифровать эти 4 параметра перед хранением и расшифровать их перед ответом.

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

.
28
ответ дан 24 November 2019 в 19:08
поделиться

Токен OAuth и секрет, очевидно, должны быть в безопасности в вашей базе данных, но вы не можете хранить их с использованием одностороннего шифрования так же, как для пароля. Причина в том, что вам нужны токен и секрет, чтобы иметь возможность подписать запрос.

Это также будет иметь место, если вы используете сервер OAuth, вам по-прежнему нужен исходный токен / секрет для проверки запроса.

При желании вы все равно можете зашифровать их с помощью алгоритма двустороннего шифрования, такого как AES, чтобы обеспечить безопасность в случае взлома базы данных или резервных копий базы данных.

19
ответ дан 24 November 2019 в 19:08
поделиться

Здесь есть две точки зрения.

Первый аргумент: вы должны относиться к токенам OAuth как к паролям. Если бы кто-нибудь получил доступ к вашей базе данных, получил все пары OpenID / OAuth и запустил атаку «злоумышленник в середине», он мог бы выдать себя за любого пользователя на вашем сайте.

Второй аргумент таков: к тому времени, когда кто-то получит доступ к вашей базе данных и достаточный доступ к вашей сети для запуска атаки типа «злоумышленник в середине», вы все равно заблокированы.

Я лично ошибаюсь из соображений осторожности и просто зашифрую их; это стандартная практика для паролей, так что вы можете дать себе немного дополнительного спокойствия.

Между тем, у Google есть такой совет:

«С токенами следует обращаться так же безопасно, как и с любой другой конфиденциальной информацией, хранящейся на сервер "

источник: http: разрешения, убедитесь, что они зашифрованы и хорошо скрывают пароль

  • Если они находятся в базе данных, зашифруйте поля, сохраните ключ ну и защитить доступ к саму базу данных внимательно. *
  • Если они в LDAP, сделайте то же самое.
  • архивное сообщение ( исходный URL сообщения, теперь мертвая ссылка )

    12
    ответ дан 24 November 2019 в 19:08
    поделиться

    URL-адрес OpenID не должен быть зашифрован, потому что это ваш "открытый id "буквально каждый должен знать значение. Кроме того, URL-адрес должен быть индексом в базе данных, а зашифровать индекс в базе данных всегда проблематично.

    Токен / секрет OAuth должен быть секретным, и шифрование может повысить безопасность, если вам нужно хранить токен в течение длительного времени. В нашем потребительском приложении OAuth токен / секрет хранится в сеансе только на короткое время, и мы предпочитаем не шифровать их. Думаю, это достаточно безопасно. Если кто-то может заглянуть в наше хранилище сеансов, вероятно, у него также есть наш ключ шифрования.

    0
    ответ дан 24 November 2019 в 19:08
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: