Внедрение HTML в Node, Express и MongoDB. (движок шаблонов EJS)

#javascript #html #node.js #mongodb #ejs

#javascript #HTML #node.js #mongodb #ejs

Вопрос:

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

У меня огромный недостаток в моем приложении.В тот момент, когда кто-то вводит HTML / CSS / JS в мое поле ввода, изменения отображаются на реальном веб-сайте. Я провел мозговой штурм по этому поводу, но не смог найти решение этой проблемы.

Как я могу определить, вводит ли пользователь HTML или CSS, и как я могу преодолеть эту халатность пользователя. Поскольку введенный контент сохраняется в базе данных, он отображается каждый раз. Пожалуйста, помогите, ребята! Позвольте решениям вливаться.

Заранее благодарю вас.

Ответ №1:

EJS уже имеют встроенный механизм для защиты от внедрения HTML. <%= Тег экранирует HTML. Например:

 <% var x = '<div>HTML Injection!</div>' %>
<%= x %>
  

Отобразит что-то похожее на:

 amp;<HTML Injection!amp;>
  

Таким образом, вывод должен быть безопасным, даже если это будет выглядеть так, как будто кто-то вводит код.

Единственный способ, которым внедрение HTML может работать в EJS, — это если вы намеренно разрешаете это, используя <%- вместо <%= или переопределяя escape параметр.

Если вам действительно нужно использовать <%- , то EJS перестанет защищать вас от внедрения HTML и предположит, что вы знаете, что делаете. В этом случае вы несете ответственность за предотвращение внедрения HTML. Вы можете вручную сделать то, что EJS делает для вас, заменив < на amp;< и > на amp;> или полностью удалив HTML-теги из пользовательского ввода:

 const some_input = req.query.some_data;

escaped_html_input = some_input.replace(/</g, 'amp;<').replace(/>/g, 'amp;>');

deleted_html_input = some_input.replace(/<. ?>/g, '');

save(escaped_html_input);

// or save(deleted_html_input);
  

Комментарии:

1. Большое тебе спасибо, брат! Именно то, что я хотел. Еще раз спасибо. У меня было еще одно сомнение, предотвращает ли это также внедрение базы данных, может ли пользователь в любом случае ввести код для получения моих данных?

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

3. В этом случае вы можете делать то, что делают Facebook apps или Shopify: запрещать (например, удалять) определенные теги скрипта. Я бы сразу запретил img (возможность эксфильтрации данных на внешний сервер, как в img src="myserver.com/some/php/script" ), script , link , iframe и object — возможно, больше, но это те, которые приходят на ум