предисловие
Недавно я видел статью, в статье говорилось, что поле ввода былоатака путем внедрения кодаОпасность, я сделал небольшой пример и обнаружил, что есть такая ситуация.
Пример
Давайте сначала рассмотрим небольшой пример, простейшую функцию сообщения, введите информацию в поле ввода, а затем вставьте информацию на страницу:
эффект страницы
ключевой код
<body>
<div id="content"></div>
<input id='input'>
<input type="button" id='button' value="提交">
</body>
<script>
const btn = document.getElementById('button');
const myInput = document.getElementById('input');
const content = document.getElementById('content');
btn.onclick = ()=> {
content.innerHTML = myInput.value
};
</script>
Окно ввода кода Несколько способов, которые могут привести к атаке
Внедрение HTML-кода в поле ввода
Введите в поле ввода<h1>哈哈,你的页面结构被我破坏了</h1>
, а затем отправить, эффект будет следующим:
<script>
Поле ввода этикетки
Введите в поле ввода<script> alert(0); </script>
, затем отправьте.
Мы обнаружим, что нет всплывающего окна, здесь нет исполненияJavaScript
Причина проведения процедуры:HTML 5
не реализованоinnerHTML
вставлен<script>
теги, но вставленные фрагменты видны в структуре кода.
Другие не проходят<script>
Выполнение этикеткиJavaScript
Код программы вводится в поле ввода
Потерпеть неудачу<script>
Выполнение этикеткиJavaScript
По-прежнему существует риск подвергнуться атаке, как в примере, приведенном в MDN:<img src='x' onerror='alert(1)'>
, мы можем видеть, что программа является исполняемой после ввода:
охранять от
Поскольку поле ввода может быть атаковано, мы должны принять меры предосторожности.Vue
За нас взяли лучшую защиту. если не используетсяVue
, есть и подходящие решения.
Принцип предотвращения Vue
Vue
При динамической вставке элемента метка<
,>
и т. д. преобразуются в escape-символы<
,>
ждать, чтобы избежатьJavaScript
выполнение программы с использованиемVue
После вставки кода через поле ввода код вставленной страницы будет экранирован следующим образом:
Без предосторожностей код для вставки страницы выглядит следующим образом:
Собственные средства защиты JavaScript
мы можем использовать иVue
Такой же метод предосторожности<
,>
,&
,'
,"
и другие символы заменены escape-символами, чтобы избежать рисков, которые используются здесьzhangxiangliangодноклассники«30 секунд в день ⏱ Все арестованы»Метод, написанный в статье для обработки:
// 将输入框的字符串通过正则,将符号替换成转义字符
const escapeHTML = str =>
str.replace(/[&<>'"]/g, tag => ({
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
}[tag] || tag));
Суммировать
Хотя есть некоторые способы атаки, которые могут загромождать страницу после редактирования в консоли, если у нас есть способы избежать рисков, то лучше не доставлять неприятностей работе и компании.
использованная литература
30 секунд в день ⏱ Арестуем вместе:nuggets.capable/post/684490…
Элемент MDN.innerHTML:developer.Mozilla.org/this-cn/docs/…