XSS攻击和防御

XSS攻击和防御

XSS:Cross Site Scripting 跨站脚本攻击

存储型XSS

  1. 恶意用户提交了恶意内容到服务器

  2. 服务器没有识别,保存了恶意内容到数据库

  3. 正常用户访问服务器

  4. 服务器在不知情的情况下,给予了之前的恶意内容,让正常用户遭到攻击

反射型

  1. 恶意用户分享了一个正常网站的链接,链接中带有恶意内容
  2. 正常用户点击了该链接
  3. 服务器在不知情的情况,把链接的恶意内容读取了出来,放进了页面中,让正常用户遭到攻击

DOM型

  1. 恶意用户通过任何方式,向服务器中注入了一些dom元素,从而影响了服务器的dom结构
  2. 普通用户访问时,运行的是服务器的正常js代码

xss的防御 可以通过一个插件库 xss
安装
npm i xss

文档xsshttps://www.npmjs.com/package/xss

这个插件 可以自动过滤一些关键词 代码等 防止xss攻击

简单的配置测试

  • 服务端代码
const express = require("express");
const http = require("http");
const path = require("path");
const xss = require("xss");
// express
const app = express();
const server = http.createServer(app);
app.use(express.static(path.resolve(__dirname, "public")));

app.use(express.json());
app.use(express.urlencoded());
const myxss = new xss.FilterXSS({
  onTagAttr(tag, name, value, isWhiteAttr) {
    if (name === "style") {
      return `style="${value}"`;
    }
  },
});
app.use((req, res, next) => {
  for (const key in req.body) {
    const value = req.body[key];
    req.body[key] = myxss.process(value);
  }
  next();
});

const articles = [];
app.post("/api/article/add", (req, res) => {
  articles.push(req.body.content);
  console.log(articles);
  res.send({
    code: 0,
    msg: "",
    data: "ok",
  });
});

app.get("/articles", (req, res) => {
  res.render("articles.ejs", {
    articles,
    redirect: req.query.redirect,
  });
});

// 监听端口
server.listen(5008, () => {
  console.log("server listening on 5008");
});
  • 客户端代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <a href="/articles">文章列表</a>
    <h1>发布文章</h1>
    <textarea id="txtArticle" cols="30" rows="10"></textarea>
    <button>发布</button>
    <script>
      const txt = document.getElementById("txtArticle");
      document.querySelector("button").onclick = function () {
        fetch("/api/article/add", {
          method: "POST",
          headers: {
            "content-type": "application/json",
          },
          body: JSON.stringify({
            content: txt.value,
          }),
        })
          .then((resp) => resp.json())
          .then((resp) => {
            console.log(resp);
          });
      };
    </script>
  </body>
</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值