|
1 | 1 | package com.best.hello.controller; |
2 | 2 |
|
3 | 3 | import io.swagger.annotations.Api; |
4 | | -import org.springframework.web.bind.annotation.RequestMapping; |
5 | | -import org.springframework.web.bind.annotation.RestController; |
| 4 | +import io.swagger.annotations.ApiOperation; |
| 5 | +import org.springframework.ui.Model; |
| 6 | +import org.springframework.web.bind.annotation.*; |
| 7 | + |
| 8 | +import javax.servlet.http.HttpServletRequest; |
| 9 | +import javax.servlet.http.HttpServletResponse; |
| 10 | +import javax.servlet.http.HttpSession; |
| 11 | +import java.util.HashMap; |
| 12 | +import java.util.Map; |
| 13 | +import java.util.UUID; |
6 | 14 |
|
7 | 15 | @Api("跨站请求伪造") |
8 | 16 | @RestController |
9 | 17 | @RequestMapping("/CSRF") |
10 | 18 | public class CSRF { |
| 19 | + @ApiOperation(value = "vul: 危险的转账") |
| 20 | + @GetMapping("/transfer/vul") |
| 21 | + public Map<String, Object> transferMoney(HttpServletRequest request, HttpServletResponse response, HttpSession session) { |
| 22 | + // 从请求中获取转账金额和接收者 |
| 23 | + String from = (String) session.getAttribute("LoginUser"); |
| 24 | + String amount = request.getParameter("amount"); |
| 25 | + String receiver = request.getParameter("receiver"); |
| 26 | + |
| 27 | + Map<String, Object> result = new HashMap<>(); |
| 28 | + result.put("from", from); |
| 29 | + result.put("receiver", receiver); |
| 30 | + result.put("amount", amount); |
| 31 | + result.put("success", true); |
| 32 | + return result; |
| 33 | + } |
| 34 | + |
| 35 | + @ApiOperation(value = "vul: referer绕过", notes = "通过referer限制,只允许本站发起的请求,但是referer可以伪造") |
| 36 | + @GetMapping("/transfer/referer") |
| 37 | + public Map<String, Object> transferMoneySafe(HttpServletRequest request, HttpServletResponse response, HttpSession session) { |
| 38 | + String from = (String) session.getAttribute("LoginUser"); |
| 39 | + String amount = request.getParameter("amount"); |
| 40 | + String receiver = request.getParameter("receiver"); |
| 41 | + Map<String, Object> result = new HashMap<>(); |
| 42 | + // 校验Referer 判断请求是否来自本站 |
| 43 | + String referer = request.getHeader("referer"); |
| 44 | + if (referer == null || !referer.startsWith("http://baidu.com")) { |
| 45 | + result.put("success", false); |
| 46 | + result.put("message", "referer is not valid"); |
| 47 | + return result; |
| 48 | + } |
| 49 | + result.put("from", from); |
| 50 | + result.put("receiver", receiver); |
| 51 | + result.put("amount", amount); |
| 52 | + result.put("success", true); |
| 53 | + return result; |
| 54 | + } |
| 55 | + |
| 56 | + @GetMapping("/transfer/genCSRFToken") |
| 57 | + public Map<String, Object> genCSRFToken(HttpSession session, Model model) { |
| 58 | + String token = UUID.randomUUID().toString(); |
| 59 | + session.setAttribute("csrfToken", token); |
| 60 | + Map<String, Object> result = new HashMap<>(); |
| 61 | + result.put("csrfToken", token); |
| 62 | + return result; |
| 63 | + } |
| 64 | + |
| 65 | + @PostMapping("/transfer/doTransferToken") |
| 66 | + public Map<String, Object> doTransferToken(HttpServletRequest request, HttpSession session) { |
| 67 | + String token = request.getParameter("csrfToken"); |
| 68 | + String sessionToken = (String) session.getAttribute("csrfToken"); |
| 69 | + String from = (String) session.getAttribute("LoginUser"); |
| 70 | + String amount = request.getParameter("amount"); |
| 71 | + String receiver = request.getParameter("receiver"); |
| 72 | + Map<String, Object> result = new HashMap<>(); |
| 73 | + |
| 74 | + // 校验CSRF Token |
| 75 | + if (!token.equals(sessionToken)) { |
| 76 | + result.put("success", false); |
| 77 | + result.put("message", "token is not valid"); |
| 78 | + return result; |
| 79 | + } |
| 80 | + |
| 81 | + result.put("from", from); |
| 82 | + result.put("receiver", receiver); |
| 83 | + result.put("amount", amount); |
| 84 | + result.put("csrfToken", token); |
| 85 | + result.put("success", true); |
| 86 | + return result; |
| 87 | + } |
11 | 88 |
|
12 | 89 | } |
0 commit comments