项目开发中安全问题及解决方法----请求头中信息仅供参考

发布时间:2024年01月18日

有下面案例:

@Slf4j
@RequestMapping("trustclientip")
@RestController
public class TrustClientIpController {
 HashSet<String> activityLimit = new HashSet<>();
 @GetMapping("test")
 public String test(HttpServletRequest request) {
 String ip = getClientIp(request);
 if (activityLimit.contains(ip)) {
 return "您已经领取过奖品";
 } else {
 activityLimit.add(ip);
 return "奖品领取成功";
 }
 }
 private String getClientIp(HttpServletRequest request) {
 String xff = request.getHeader("X-Forwarded-For");
 if (xff == null) {
 return request.getRemoteAddr();
 } else {
 return xff.contains(",") ? xff.split(",")[0] : xff;
 }
 }
}

?上面代码中的意思是:通过一个 HashSet 模拟已发放过奖品的 IP 名单,每次领取奖品后把 IP 地址加入这个名单中。IP 地址的获取方式是:优先通过 X-Forwarded-For 请求头来获 取,如果没有的话再通过 HttpServletRequest 的 getRemoteAddr 方法来获取。通常我们的应用之前都部署了反向代理或负载均衡器,remoteAddr 获得的只 能是代理的 IP 地址,而不是访问用户实际的 IP。这不符合我们的需求,因为反向代理在转发请求时,通常会把用户真实 IP 放入 X-Forwarded-For 这个请求 头中。这种过于依赖 X-Forwarded-For 请求头来判断用户唯一性的实现方式,是有问题的。

首先我们来看一个正常请求的curl

curl "https://eva2.csdn.net/v3/06981375190026432f77c01bfca33e32/lts/groups/dadde766-b087-42da-8e67-d2499a520ee7/streams/ea448b34-0491-4546-87aa-059120b54c53/logs" ^
  -H "Accept: */*" ^
  -H "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6" ^
  -H "Connection: keep-alive" ^
  -H "Content-Type: application/json" ^
  -H "Lts-Sdk-Request-Id: c51a99cf2f5a4e56beaca85c3369bdcd" ^
  -H "Lts-Sdk-Version: 1.0.15" ^
  -H "Origin: https://www.csdn.net" ^
  -H "Referer: https://www.csdn.net/" ^
  -H "Sec-Fetch-Dest: empty" ^
  -H "Sec-Fetch-Mode: cors" ^
  -H "Sec-Fetch-Site: same-site" ^
  -H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0" ^
  -H "X-Sdk-date: 20240118T105943Z" ^
  -H "sec-ch-ua: ^\^"Not_A Brand^\^";v=^\^"8^\^", ^\^"Chromium^\^";v=^\^"120^\^", ^\^"Microsoft Edge^\^";v=^\^"120^\^"" ^
  -H "sec-ch-ua-mobile: ?0" ^
  -H "sec-ch-ua-platform: ^\^"Windows^\^"" ^
  --data-raw "^{^\^"labels^\^":^{^},^\^"logs^\^":^[^{^\^"contents^\^":^[^{^\^"pid^\^":^\^"www^\^",^\^"ref^\^":^\^"^\^",^\^"curl^\^":^\^"https://www.csdn.net/^\^",^\^"dest^\^":^\^"^\^",^\^"spm^\^":^\^"1000.2115.3001.9884^\^",^\^"t^\^":^\^"1705575583^\^",^\^"eleTop^\^":^\^"0^\^",^\^"cCookie^\^":^\^"c_dl_fref=https://so.csdn.net/so/search;c_dl_um=-;c_dl_prid=1704627495151_519907;c_dl_rid=1705496562373_273536;c_dl_fpage=/download/wodegeCSDN/87669666;c_session_id=10_1705573255584.316953;c_first_ref=default;c_first_page=https^%^3A//www.csdn.net/;c_dsid=11_1705573256310.252504;c_segment=10;c_sid=2235fa0f9f87f6dc41b3037269be4faa;c_pref=https^%^3A//blog.csdn.net/m0_71507863^%^3Fspm^%^3D1010.2135.3001.5343;c_ref=https^%^3A//i.csdn.net/;c_page_id=default;^\^",^\^"__time__^\^":1705575583,^\^"urn^\^":^\^"1705575583388-b300c1b4-17a9-48e5-a3bf-0d36f2eda604^\^",^\^"pv_urn^\^":^\^"1705573256315-c10403b4-98bf-45a8-a3af-5a4e9665d37c^\^",^\^"log_id^\^":^\^"31871^\^",^\^"userAgent^\^":^\^"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0^\^",^\^"cid^\^":^\^"11_77968357048-1649990083180-682266^\^",^\^"uid^\^":^\^"m0_71507863^\^",^\^"sid^\^":^\^"10_1705573255584.316953^\^",^\^"dc_sid^\^":^\^"^\^",^\^"did^\^":^\^"11_77968357048-1649990083180-682266^\^",^\^"utm^\^":^\^"^\^",^\^"platform^\^":^\^"PC^\^",^\^"__client_time__^\^":1705575583389^}^]^},^{^\^"contents^\^":^[^{^\^"pid^\^":^\^"www^\^",^\^"ref^\^":^\^"^\^",^\^"curl^\^":^\^"https://www.csdn.net/^\^",^\^"dest^\^":^\^"^\^",^\^"spm^\^":^\^"1000.2115.3001.9884^\^",^\^"t^\^":^\^"1705575583^\^",^\^"eleTop^\^":^\^"0^\^",^\^"cCookie^\^":^\^"c_dl_fref=https://so.csdn.net/so/search;c_dl_um=-;c_dl_prid=1704627495151_519907;c_dl_rid=1705496562373_273536;c_dl_fpage=/download/wodegeCSDN/87669666;c_session_id=10_1705573255584.316953;c_first_ref=default;c_first_page=https^%^3A//www.csdn.net/;c_dsid=11_1705573256310.252504;c_segment=10;c_sid=2235fa0f9f87f6dc41b3037269be4faa;c_pref=https^%^3A//blog.csdn.net/m0_71507863^%^3Fspm^%^3D1010.2135.3001.5343;c_ref=https^%^3A//i.csdn.net/;c_page_id=default;c_tos=s7gejc;^\^",^\^"__time__^\^":1705575583,^\^"urn^\^":^\^"1705575583390-0cc0348d-29b6-4b60-96d3-f8eba6d5f6f4^\^",^\^"pv_urn^\^":^\^"1705573256315-c10403b4-98bf-45a8-a3af-5a4e9665d37c^\^",^\^"log_id^\^":^\^"31872^\^",^\^"userAgent^\^":^\^"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0^\^",^\^"cid^\^":^\^"11_77968357048-1649990083180-682266^\^",^\^"uid^\^":^\^"m0_71507863^\^",^\^"sid^\^":^\^"10_1705573255584.316953^\^",^\^"dc_sid^\^":^\^"^\^",^\^"did^\^":^\^"11_77968357048-1649990083180-682266^\^",^\^"utm^\^":^\^"^\^",^\^"platform^\^":^\^"PC^\^",^\^"__client_time__^\^":1705575583391^}^]^}^]^}" ^

我们是完全可以更改它的请求头的,比如我们可以通过模拟发送下面的请求头信息来影响业务: curl http://localhost:45678/trustclientip/test -H "X-Forwarded-For:183.84.18.71, 10.253.15.1"

因此,IP 地址或者说请求头里的任何信息,包括 Cookie 中的信息、Referer,只能用作参考,不能用作重要逻辑判断的依据。而对于类似这个案例唯一性的 判断需求,更好的做法是,让用户进行登录或三方授权登录(比如微信),拿到用户标识来做唯一性判断。?

文章来源:https://blog.csdn.net/m0_71507863/article/details/135681876
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。