Skip to content

https://juejin.cn/post/6844903842635579405

跨站脚本攻击 XSS

https://developer.mozilla.org/zh-CN/docs/Glossary/Cross-site_scripting

类型

  • DOM 型:向页面输入恶意内容,由前端将内容插入 DOM 树中。
js
// 用户向 inputNode 输入 <script>alert('执行成功')</script>
divNode.innerHTML = inputNode.textContent;
  • 反射型:发送携带恶意内容的请求,由后端把恶意内容返回到前端页面中。
js
fetch("http://exmaple.com/search=<script>alert('执行成功')</script>");
  • 存储型:发送携带恶意内容的请求,存储到数据库,后端把恶意内容返回到前端页面中。
js
fetch("http://exmaple.com/add/?data=<script>alert('执行成功')</script>");

防御

  • 内容安全策略 CSP
    • <head> 添加 <meta http-equiv="Content-Security-Policy" content="">
    • 响应头添加 Content-Security-Policy
  • 限制用户输入内容(长度、特殊字符等)
  • 后端设置 cookie 为 HttpOnly,以限制 js 读取

跨站请求伪造 CSRF

https://developer.mozilla.org/zh-CN/docs/Glossary/CSRF

用户没有退出 A 站的情况下访问 B 站,此时 B 站向 A 站发送请求时携带了用户在 A 站的 cookie,达到模拟用户操作的目的。

html
<!-- 访问以下链接时会带上本站 cookie -->
<a href="https://evil.com">诱导点击文字</a>

防御

  • 请求时需要携带 Token
  • 后端设置 cookie 的 Samesite 属性值
    • Strict:任何情况下,cookie 都不能发给第三方主机
    • Lax:HTTP 方法为 GET、HEAD、OPTIONS 时,cookie 可以发给第三方主机

原型污染

  • 更改 __proto__ 属性

https://www.freebuf.com/articles/web/375485.html

点击劫持

使页面中存在一个透明的 iframe 对用户输入进行劫持,可以获取密码。

防御

  • 设置 <iframe>sandboxsecurity 属性,以限制框架页内的 js 执行
  • 响应头设置 X-Frame-Options,以限制框架页的加载