这是因为 id 属性不安全。
这不是我的答案,但它会回答你的问题:https://security.stackexchange.com/questions/88973/why-do-id-attributes-need-stricter-validation
对于id 和name,这些属性经常被用作DOM 中的参考点。
如果攻击者可以欺骗这些参考点,她可能会欺骗现有脚本从设计之外的地方获取和设置值,根据使用的上下文,这可能很危险。
来自我的注意:他的帖子的其余部分讨论了 name 属性,但如果你还没有通过上面的内容,你就会明白这一切背后的想法
这也适用于使用name 标识名称/值对的HTML 表单。例如,如果一个网站在输出时没有对特定的表单字段进行编码,但是由于表单字段是服务器生成的,并且通过使用令牌来保护表单免受 CSRF 的影响,它不能通过正常方式被利用。但是,攻击者可能能够诱使用户访问带有在 name 中使用的参数的 URL,其中包含要在提交表单时执行的 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's Supplies" />
<input type="hidden" name="anti-csrf" value="asdjasodhoai" />
<input type="submit" value="Click here to buy" />
</form>
然后得到输出为
Thank you for buying from Bob's 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's 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>.
因为这个页面没有对 shop_name 参数进行 HTML 编码,因为它是受信任的,并且应用程序框架总是采用第一个值以防重复。非常做作,但这是我脑海中第一个证明这一点的事情。