Ответ 1
Это потому, что атрибут id небезопасен.
Это не мой ответ, но он ответит на ваш вопрос: https://security.stackexchange.com/questions/88973/why-do-id-attributes-need-stricter-validation
Для id
и name
эти атрибуты часто используются в качестве опорных точек в DOM.
Если злоумышленник может обманывать эти контрольные точки, она может обмануть существующие сценарии в получении и настройке значений из других мест, кроме тех, которые были разработаны, что может быть опасно в зависимости от используемого контекста.
Отметьте меня: остальная часть его сообщения говорит об атрибуте имени, но вы получите идею за всем этим, если вы еще не на что выше
Это также относится к форматам HTML, где name
используется для идентификации пары имя/значение. Например, если веб-сайт не кодирует конкретное поле формы при его выводе, но так как поле формы генерируется сервером и форма защищена от CSRF с помощью токенов, он не может быть использован обычными средствами. Однако злоумышленник может заставить пользователя посетить URL-адрес с параметром, который используется в name
, содержащий полезную нагрузку XSS для выполнения при отправке формы.
например. Обычное использование:
https://example.com/product?item_name=watch&qty=1
который отображает форму
<form>
<input type="hidden" name="watch" value="1" />
<input type="hidden" name="shop_name" value="Bob Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />
<input type="submit" value="Click here to buy" />
</form>
И затем выводится как
Thank you for buying from Bob Supplies.
Однако злоумышленник может отправить ссылку пользователю так:
https://example.com/product?item_name=shop_name&qty=<script>alert('xss')</script>
Поскольку приложение правильно кодирует HTML в этот момент, оно отображает форму как
<form>
<input type="hidden" name="shop_name" value="<script>alert('xss')</script>" />
<input type="hidden" name="shop_name" value="Bob Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />
<input type="submit" value="Click here to buy" />
</form>
Затем он выводится как
Thank you for buying from <script>alert('xss')</script>.
так как на этой странице HTML не кодирует параметр shop_name
, потому что он является доверенным, и среда приложения всегда принимает первое значение в случае дубликатов. Очень надуманный, но это было первое, что попало мне в голову, чтобы продемонстрировать смысл.