#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
— возможно, больше, но это те, которые приходят на ум