@Nwton

Возможные уязвимости в этом коде?

Никогда лично не сталкивался с ИБ, но интересует пример в лоб.
Допустим, есть node js с сервером, подключенным socket io и базой mongo. В процессе регистрации пользователя, клиент отправляет данные так:
socket.emit('register', {login: login});
На сервере я принимаю их так:
socket.on('register', function(data){
	if(data.login.replace(/[a-zA-Z0-9]/g, '').length != 0)return;
	new User({login: data.login}).save();
});

Опустил пароль, и проверку на наличие пользователя в базе, это не важно. Вопрос в следующем: есть ли в такой цепочке возможность внедрить вредоносный код через строку с данными? И какие средства безопасности/проверки следует добавить?
  • Вопрос задан
  • 731 просмотр
Решения вопроса 3
bingo347
@bingo347 Куратор тега Node.js
Crazy on performance...
Банальный запрос socket.emit('register');уронит ваш сервер с ошибкой, так как data будет undefined (null и undefined не могут иметь свойств)
Аналогично для data.login
Метод replace есть только у строк, вызов не функции так же выкинет ошибку

Правильно как то так:
const LOGIN_REGEX = /[^a-zA-Z0-9]/; //скомпилим регулярку заранее, дабы не компилить при каждом запросе
socket.on('register', function(data){
  if(!data || typeof data.login !== 'string') { return; } //проверка на наличие и правильный тип
  if(data.login.length < 4 || data.login.length > 12) { return; } //проверка на допустимую длину, числа ставьте свои
  if(LOGIN_REGEX.test(data.login)) { return; } // такая проверка в 18 раз быстрее чем у Вас
  new User({login: data.login}).save();
});
Ответ написан
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. Что если login - не строка, буль на пример?
2. Допустим ли логин 0000000?
3. Допустим ли логин из одного символа?
4. Что если в data логина в принципе нет? Emit может быть вызван где угодно.
Ответ написан
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Вообще в целом это же не sql, где можно нагадить изменив строку.

Но могут быть проблемы если допустим login в дальнейшем где-то выводится без использования шаблонизаторов и т.п.
Там может быть банальный <script>
Т.е. xss.

Ну с таким фильтром вроде не пролезет.
Больше я не вижу вариантов для каких-то уязвимостей.

Единственное что здесь можно сделать это заспамить.
Наemitить в этот кусок >9000 фреймов и будет создано столько же пользователей.

Поэтому лучше такие вещи типа регистрации оставить на "обычном бекенде", с возможностью каптчу добавить и т.п.
Хотя и здесь наверно можно все это сделать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
abyrkov
@abyrkov
JavaScripter
По-моему, можно получить ошибку(отправив число, к примеру), хотя сомневаюсь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы