#mysql #sql #security #get
#mysql #sql #Безопасность #получить
Вопрос:
Я создаю приложение VueJS с помощью express и продолжаю доступ к базе данных mysql (в настоящее время запущенной с XAMPP). У меня есть база данных, которая состоит из 3 таблиц:
users: [id (primary key), name, email, family_id (foreign key)]
families: [id (primary key), name]
hobbies: [id (primary key), name, user_id (foreign key)]
Все эти идентификаторы являются auto_increment, поэтому первый зарегистрированный пользователь получает идентификатор 1 и так далее.
Каждому пользователю в пределах одной семьи (то есть с равным family_id) разрешено видеть увлечения других членов семьи. У меня есть SQL-запрос, который выдает мне всех членов семейства. На моем веб-сайте у меня есть простое выпадающее меню, где я могу выбрать участника. Затем с помощью запроса GET я хочу получить все увлечения выбранного участника.
Теперь я могу в принципе решить, использовать ли идентификатор или адрес электронной почты для параметра запроса, например, /api/hobbies/:id
или /api/hobbies/:email
. Электронная почта раскрывает больше личной информации, в то время как id раскрывает информацию о моей внутренней структуре, например «Существует по крайней мере (id) количество пользователей». . Я думаю, что лучше использовать id.
Может быть, есть также возможность назначить случайный идентификатор (не автоматическое увеличение) в базе данных? Но я не знаю, как это сделать.
Ответ №1:
Ничто из того, что вы отправляете в качестве параметра GET-запроса, не является частным. Эти параметры являются частью получаемого вами URL-адреса, и эти URL-адреса могут регистрироваться на различных прокси-серверах и т.д. По всему Интернету без вашего согласия или согласия ваших пользователей.
Мне кажется, что хобби членов семьи могут быть конфиденциальными данными. Что, если вся семья любит, скажем, гольф? Киберпреступник может легко вычислить, что подходящее время для взлома — субботний полдень.
И если ваше приложение выполняет операции с автообновляемыми значениями id, для киберпреступника это детская забава — проверять любую запись, которую они хотят. Посмотрите, например, на утечку данных Panera Bread. https://krebsonsecurity.com/2018/04/panerabread-com-leaks-millions-of-customer-records /
Как минимум используйте POST для такого рода данных.
А еще лучше, используйте в своем приложении хорошую систему аутентификации / сеансовых токенов и скрывайте данные от пользователей, если они не являются членами этого семейства.
И, если вы хотите использовать параметры GET в стиле REST, вам нужно сделать это, чтобы быть в безопасности:
- Используйте рандомизированные значения идентификаторов. Должно быть, киберпреступнику очень сложно угадать второе значение, зная первое значение. Серийные номера не подойдут. Адреса электронной почты тоже не будут.
- Убедитесь, что не прошедшие проверку подлинности пользователи не могут видеть никаких данных.
- Убедитесь, что аутентифицированные пользователи могут видеть только то подмножество данных, для которых они авторизованы.
Мое предложение избегать параметров GET в стиле REST исходит от нескольких аудиторов безопасности, которые говорят, что вы должны это изменить.
Комментарии:
1. Извините, я новичок в этом, но разве запрос POST не предназначен только для отправки данных в базу данных, например, при создании пользователя, а GET используется, когда вы хотите извлечь данные из БД? Для авторизации используется JWTs.