免费爱碰视频在线观看,九九精品国产屋,欧美亚洲尤物久久精品,1024在线观看视频亚洲

      08.如何保證API接口的安全性問(wèn)題01

      08.如何保證API接口的安全性問(wèn)題01

      1.互聯(lián)網(wǎng)Api接口到底如何保證安全性問(wèn)題?2.代碼落地實(shí)戰(zhàn)防御XSS、CSRF攻擊3.代碼落地如何防御接口數(shù)據(jù)黑客抓包篡改?4.接口數(shù)據(jù)加密對(duì)稱還是非對(duì)稱加密好

      安全架構(gòu)設(shè)計(jì)方案

      如何防御xss攻擊

      XSS攻擊通常指的是通過(guò)利用網(wǎng)頁(yè)開發(fā)時(shí)留下的漏洞,通過(guò)巧妙的方法注入惡意指令代碼到網(wǎng)頁(yè),使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁(yè)程序。這些惡意網(wǎng)頁(yè)程序通常是JavaScript,但實(shí)際上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到包括但不限于更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁(yè)內(nèi)容、會(huì)話和cookie等各種內(nèi)容。 [1]

      腳本攻擊:利用JavaScript 注入 到后臺(tái)數(shù)據(jù)庫(kù)中,在通過(guò)展示數(shù)據(jù)加載該腳本 該腳本中(

      1.使用js獲取cookie信息(jwt)

      2.將該jwt數(shù)據(jù) 上傳黑客服務(wù)器(ajax)

      獲取jwt—用戶會(huì)話信息 讓后模擬請(qǐng)求形式使用該jwt登錄。

      xss攻擊典型網(wǎng)站:論壇、評(píng)論區(qū)

      http://127.0.0.1:8080/getUserInfo?userName=

      http://127.0.0.1:8080/getUserInfo?userName=

      模擬xss攻擊

      前端傳遞 js 腳本到服務(wù)器端

      { “channel”: “”, “equipment”: “”, “password”: “123456”, “phoneNumber”: “15921009758”}

      后端接口將該腳本存放數(shù)據(jù)庫(kù)中

      package com.mayikt.main.api.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.mayikt.common.core.api.BaseApiService;import com.mayikt.common.core.api.BaseResponse;import com.mayikt.main.api.UserLoginLogService;import com.mayikt.main.api.dto.res.UserLoginLogResDto;import com.mayikt.main.api.impl.entity.SysUserLoginLog;import com.mayikt.main.api.impl.mapper.SysUserLoginLogMapper;import org.springframework.beans.BeanUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.CrossOrigin;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.List;/** * @ClassName UserLoginLogImpl */@RestController@CrossOriginpublic class UserLoginLogImpl extends BaseApiService implements UserLoginLogService { @Autowired private SysUserLoginLogMapper sysUserLoginLogMapper; @Override public BaseResponse getUserLoginLog() { // 模擬查詢登錄的日志記錄 List sysUserLoginLogs = sysUserLoginLogMapper.selectList(new QueryWrapper()); List userLoginLogResDtos = new ArrayList(); for (int i = 0; i < sysUserLoginLogs.size(); i++) { UserLoginLogResDto userLoginLogResDto = new UserLoginLogResDto(); BeanUtils.copyProperties(sysUserLoginLogs.get(i), userLoginLogResDto); userLoginLogResDtos.add(userLoginLogResDto); } return setResultSuccessData(userLoginLogResDtos); }}package com.mayikt.main.api;import com.mayikt.common.core.api.BaseResponse;import com.mayikt.main.api.dto.res.UserLoginLogResDto;import org.springframework.web.bind.annotation.GetMapping;import java.util.List;/** * @ClassName UserLoginLogService */public interface UserLoginLogService { @GetMapping("/getUserLoginLog") BaseResponse getUserLoginLog();}

      前端html

      xss模擬攻擊

      防御xss

      方式1

      將用戶前端所提交的參數(shù)進(jìn)行過(guò)濾。

      html 大于> 小于號(hào) <

      String equipment = loginUserReqDto.getEquipment(); loginUserReqDto.setEquipment(StringUtils.isEmpty(equipment) ? null : StringEscapeUtils.escapeHtml(equipment)); SysUserLoginLog sysUserLoginLog = new SysUserLoginLog(sysUser.getId(), IPUtils.getIpAddr(request), new Date(), token, loginUserReqDto.getChannel(), loginUserReqDto.getEquipment());

      該方式的缺陷:每個(gè)參數(shù)都需要像這樣寫 代碼非常冗余

      String str = “”; String s = StringEscapeUtils.escapeHtml(str); System.out.println(s);

      方式2

      接口接受參數(shù) ?傳遞參數(shù)形式—

      傳遞參數(shù)都是json數(shù)據(jù)形式

      spring mvc 接受 json數(shù)據(jù)提供 api回調(diào)

      package com.mayikt.main.security;import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.DeserializationContext;import com.fasterxml.jackson.databind.JsonDeserializer;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.module.SimpleModule;import com.google.common.net.MediaType;import org.apache.commons.lang.StringEscapeUtils;import org.apache.commons.lang.StringUtils;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.ListIterator;/** * 解決post 請(qǐng)求傳遞json數(shù)據(jù) 防御xss攻擊 */@Configurationpublic class WebMvcConfig extends WebMvcConfigurationSupport { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler(“swagger-ui.html”) .addResourceLocations(“classpath:/META-INF/resources/”); registry.addResourceHandler(“/webjars/**”) .addResourceLocations(“classpath:/META-INF/resources/webjars/”); } @Override protected void extendMessageConverters(List messageConverters) { /** * 替換默認(rèn)的MappingJackson2HttpMessageConverter,過(guò)濾(json請(qǐng)求參數(shù))xss */ ListIterator listIterator = messageConverters.listIterator(); while (listIterator.hasNext()) { HttpMessageConverter next = listIterator.next(); if (next instanceof MappingJackson2HttpMessageConverter) { listIterator.remove(); break; } } messageConverters.add(getMappingJackson2HttpMessageConverter()); } public MappingJackson2HttpMessageConverter getMappingJackson2HttpMessageConverter() { // 創(chuàng)建自定義ObjectMapper SimpleModule module = new SimpleModule(); module.addDeserializer(String.class, new JsonHtmlXssDeserializer(String.class)); ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.getApplicationContext()).build(); objectMapper.registerModule(module); // 創(chuàng)建自定義消息轉(zhuǎn)換器 MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); return mappingJackson2HttpMessageConverter; }}/** * 對(duì)入?yún)⒌膉son進(jìn)行轉(zhuǎn)義 */class JsonHtmlXssDeserializer extends JsonDeserializer { public JsonHtmlXssDeserializer(Class string) { super(); } @Override public Class handledType() { return String.class; } @Override public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { String value = jsonParser.getValueAsString(); if (!StringUtils.isEmpty(value)) { return StringEscapeUtils.escapeHtml(value); } return value; }}

      抓包如何防止篡改數(shù)據(jù)

      Fiddler抓包工具的使用

      1.可以使用第三方抓包工具,對(duì)請(qǐng)求前后實(shí)現(xiàn)代理,可以修改參數(shù)請(qǐng)求內(nèi)容和參數(shù)響應(yīng)內(nèi)容,抓包工具h(yuǎn)ttp調(diào)試工具

      2.Fiddler4下載地址:https://pc.qq.com/detail/10/detail_3330.html

      使用Fiddler4篡改請(qǐng)求之前:

      防御篡改數(shù)據(jù)

      使用MD5可以直接驗(yàn)證簽名參數(shù) MD5 屬于單向加密,只能夠暴力破解。

      MD5應(yīng)用場(chǎng)景 在nacos分布式配置中心中,使用MD5 比對(duì)文件內(nèi)容是否發(fā)生改變

      HasherPro比對(duì)文件內(nèi)容是否發(fā)生改變。

      MD5在線暴力破解地址:https://www.cmd5.com/

      String userName=”123456″;System.out.println( DigestUtils.md5Hex(userName));

      黑客如何破解?自己需要根據(jù)參數(shù)內(nèi)容 生成簽名

      如果只是改了參數(shù)內(nèi)容—沒有用的 所以我們需要該簽名

      {“password”:”123456″,”phoneNumber”:”phoneNumber”,”channel”:”安卓”,”equipment”:””}

      {sign=325ab041d4889825a46d1e1e802ab5de, timestamp=1652537015771}

      package com.mayikt.main.security;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.JSONPObject;import org.apache.commons.codec.digest.DigestUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.util.*;/** * 參數(shù)驗(yàn)證簽名 */public class SignUtil { private static Logger logger = LoggerFactory.getLogger(SignUtil.class); /** * 加密密鑰 */ private final static String APP_KEY = “mykey123456”; public final static String SECRET_KEY = “mysecret123456”; /** * 字符編碼 */ private final static String INPUT_CHARSET = “UTF-8”; /** * 超時(shí)時(shí)間 */ private final static int TIME_OUT = 30 * 60 * 1000; /** * 請(qǐng)求參數(shù)Map轉(zhuǎn)換驗(yàn)證Map * * @param requestParams 請(qǐng)求參數(shù)Map * @param charset 是否要轉(zhuǎn)utf8編碼 * @return * @throws UnsupportedEncodingException */ public static Map toVerifyMap(Map requestParams, boolean charset) { Map params = new HashMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { String name = (String) iter.next(); String[] values = requestParams.get(name); String valueStr = “”; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length – 1) ? valueStr + values[i] : valueStr + values[i] + ","; } // 亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用。如果mysign和sign不相等也可以使用這段代碼轉(zhuǎn)化 if (charset) valueStr = getContentString(valueStr, INPUT_CHARSET); params.put(name, valueStr); } return params; } /** * 除去數(shù)組中的空值和簽名參數(shù) * * @param sArray 簽名參數(shù)組 * @return 去掉空值與簽名參數(shù)后的新簽名參數(shù)組 */ public static Map paraFilter(Map sArray) { Map result = new HashMap(); if (sArray == null || sArray.size() <= 0) { return result; } for (String key : sArray.keySet()) { String value = sArray.get(key); if (value == null || value.equals("") || key.equalsIgnoreCase("sign")) { continue; } result.put(key, value); } return result; } /** * 把數(shù)組所有元素排序,并按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串 * * @param params 需要排序并參與字符拼接的參數(shù)組 * @return 拼接后字符串 */ public static String createLinkString(Map params) { return createLinkString(params, false); } /** * 把數(shù)組所有元素排序,并按照“參數(shù)=參數(shù)值”的模式用“&”字符拼接成字符串 * * @param params 需要排序并參與字符拼接的參數(shù)組 * @param encode 是否需要UrlEncode * @return 拼接后字符串 */ public static String createLinkString(Map params, boolean encode) { List keys = new ArrayList(params.keySet()); Collections.sort(keys); String prestr = ""; for (int i = 0; i TIME_OUT) { logger.info(“api is time out”); return false; } return true; } else { return false; } } public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); jsonObject.put(“channel”, “ios”); jsonObject.put(“equipment”, “alert(‘mayikt’)”); jsonObject.put(“password”, “123456”); jsonObject.put(“phoneNumber”, “phoneNumber”); String json = jsonObject.toJSONString(); System.out.println(json); Map stringStringMap = signJson(json); System.out.println(stringStringMap); }}package com.mayikt.main.security;import com.alibaba.fastjson.JSONObject;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import java.io.IOException;import java.io.PrintWriter;@Component@WebFilter()@Slf4jpublic class SignFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 攔截請(qǐng)求,驗(yàn)證json數(shù)據(jù) 簽名 RequestWrapper requestWrapper = new RequestWrapper((HttpServletRequest) request); String json = requestWrapper.getBody(); // 驗(yàn)證token HttpServletRequest req = (HttpServletRequest) request; String sign = req.getHeader(“sign”); String timestamp = req.getHeader(“timestamp”); boolean result = SignUtil.verifyJson(json, sign, timestamp); if (!result) { PrintWriter writer = response.getWriter(); JSONObject data = new JSONObject(); data.put(“code”, “500”); data.put(“msg”, “驗(yàn)證簽名失敗”); writer.println(data.toJSONString()); writer.close(); return; } chain.doFilter(requestWrapper, response); } @Override public void destroy() { }}package com.mayikt.main.security;import lombok.extern.slf4j.Slf4j;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStreamReader;@Slf4jpublic class RequestWrapper extends HttpServletRequestWrapper { private final String body; // 報(bào)文 public RequestWrapper(HttpServletRequest request) throws IOException { super(request); BufferedReader streamReader = new BufferedReader( new InputStreamReader(request.getInputStream(), “UTF-8”)); StringBuilder responseStrBuilder = new StringBuilder(); String inputStr; while ((inputStr = streamReader.readLine()) != null) { responseStrBuilder.append(inputStr); } body = responseStrBuilder.toString(); log.info(“body:{}”, body); } public String getBody() { return body; } @Override public BufferedReader getReader() throws IOException { return new BufferedReader(new InputStreamReader(getInputStream())); } @Override public ServletInputStream getInputStream() throws IOException { final ByteArrayInputStream bais = new ByteArrayInputStream(body.getBytes(“utf-8”)); return new ServletInputStream() { @Override public boolean isFinished() { return false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return bais.read(); } }; }}

      相關(guān)代碼

      m5.rar

      鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
      用戶投稿
      上一篇 2022年7月21日 09:46
      下一篇 2022年7月21日 09:46

      相關(guān)推薦

      • 短視頻策劃內(nèi)容的3個(gè)要點(diǎn)(短視頻策劃內(nèi)容怎么做)

        短視頻在制作時(shí),內(nèi)容框架非常重要。如果直奔主題,然后結(jié)束,聚卓告訴你,這樣的短視頻已經(jīng)過(guò)時(shí)了。現(xiàn)在的短視頻需要框架的,但不是任何框架,它需要一種易于理解和消化的框架。而且,現(xiàn)在大多…

        2022年11月27日
      • 存儲(chǔ)過(guò)程語(yǔ)法(sql server存儲(chǔ)過(guò)程語(yǔ)法)

        今天小編給各位分享存儲(chǔ)過(guò)程語(yǔ)法的知識(shí),其中也會(huì)對(duì)sql server存儲(chǔ)過(guò)程語(yǔ)法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問(wèn)題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過(guò)程基本語(yǔ)法…

        2022年11月26日
      • 小紅書平臺(tái)的一些機(jī)制及玩法詳解(小紅書玩法有哪些)

        關(guān)于小紅書 一:小紅書平臺(tái)的一些機(jī)制 1. 筆記內(nèi)容的CES評(píng)分機(jī)制 2. 筆記流量入口與長(zhǎng)尾效應(yīng) 二:小紅書優(yōu)質(zhì)筆記的特點(diǎn)(分維度、類型分析) 1.筆記的本身架構(gòu)組成 維度 2.…

        2022年11月25日
      • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

        CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

        2022年11月25日
      • 博客營(yíng)銷的3大優(yōu)勢(shì)解析(博客營(yíng)銷怎么做)

        不知不覺已經(jīng)寫了24篇文章,加上這篇是第25篇了,都是自己這幾年來(lái)用過(guò)的營(yíng)銷方法,如果遇到有些不懂的,我會(huì)咨詢我的朋友和同事幫忙,盡量讓每一篇有價(jià)值,哪怕是對(duì)大家有一點(diǎn)點(diǎn)幫助也行,…

        2022年11月25日
      • 什么是內(nèi)容營(yíng)銷策略如何策劃一套成功的內(nèi)容營(yíng)銷策略

        很多時(shí)候,營(yíng)銷人員會(huì)在創(chuàng)作營(yíng)銷內(nèi)容時(shí)感到沮喪,這也是很多企業(yè)至今沒用好數(shù)字化營(yíng)銷工具的重要原因之一。 舉個(gè)例子,您可能會(huì)花上數(shù)小時(shí)期待制作一些令人驚嘆的東西,實(shí)際卻是得到很少的受眾…

        2022年11月25日
      • 直播帶貨詳細(xì)腳本(直播文案策劃怎么寫)

        短視頻運(yùn)營(yíng)策劃方案怎么寫?涉及哪幾個(gè)方面? 我在網(wǎng)上看到好多千篇一律的文章,關(guān)于【短視頻運(yùn)營(yíng)策劃方案】這一塊,基本都是在講賬號(hào)的內(nèi)容本身。 你內(nèi)容做得再好,卻不掌握算法的規(guī)律,能有…

        2022年11月25日
      • 閑魚上怎么賣東西快?閑魚賺錢必知技巧(怎么在閑魚里面賣東西)

        自從閑魚這個(gè)平臺(tái)出現(xiàn)以后,隨著這些年的發(fā)展,閑魚也成為了很多人開店賺錢的重要途徑。一些新人也想在閑魚上試試水,看看能不能賺到錢。如今閑魚上既可以賣二手閑置物品,也可以賣一些新品,那…

        2022年11月25日
      • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

        如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

        2022年11月24日
      • 淘寶直播帶貨技巧分享(淘寶直播復(fù)制粘貼技巧)

        淘寶是大家喜歡的購(gòu)物平臺(tái),不少人會(huì)自己在淘寶選購(gòu),也會(huì)在主播直播間購(gòu)買,價(jià)格更實(shí)惠,現(xiàn)在很多商家都會(huì)開通直播帶貨功能,增加訂單量,那么淘寶直播帶貨有哪些?下面小編為大家?guī)?lái)淘寶直播…

        2022年11月24日

      聯(lián)系我們

      聯(lián)系郵箱:admin#wlmqw.com
      工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息