1.互聯(lián)網(wǎng)Api接口到底如何保證安全性問(wèn)題?
公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出福海免費(fèi)做網(wǎng)站回饋大家。
2.代碼落地實(shí)戰(zhàn)防御XSS、CSRF攻擊
3.代碼落地如何防御接口數(shù)據(jù)被黑客抓包篡改?
4.接口數(shù)據(jù)加密對(duì)稱(chēng)還是非對(duì)稱(chēng)加密好
XSS攻擊通常指的是通過(guò)利用 網(wǎng)頁(yè) 開(kāi)發(fā)時(shí)留下的漏洞,通過(guò)巧妙的方法注入惡意指令代碼到網(wǎng)頁(yè),使用戶(hù)加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁(yè)程序。這些惡意網(wǎng)頁(yè)程序通常是JavaScript,但實(shí)際上也可以包括 Java 、 VBScript 、 ActiveX 、 Flash 或者甚至是普通的HTML。攻擊成功后,攻擊者可能得到包括但不限于更高的權(quán)限(如執(zhí)行一些操作)、私密網(wǎng)頁(yè)內(nèi)容、會(huì)話(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---用戶(hù)會(huì)話(huà)信息 讓后模擬請(qǐng)求形式使用該jwt登錄。
xss攻擊典型網(wǎng)站:論壇、評(píng)論區(qū)
前端傳遞 js 腳本到服務(wù)器端
后端接口將該腳本存放數(shù)據(jù)庫(kù)中
前端html
將用戶(hù)前端所提交的參數(shù)進(jìn)行過(guò)濾。
html 大于 小于號(hào)
該方式的缺陷:每個(gè)參數(shù)都需要像這樣寫(xiě) 代碼非常冗余
接口接受參數(shù) ?傳遞參數(shù)形式---
傳遞參數(shù)都是json數(shù)據(jù)形式
spring mvc 接受 json數(shù)據(jù)提供 api回調(diào)
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下載地址:
使用Fiddler4篡改請(qǐng)求之前:
使用MD5可以直接驗(yàn)證簽名參數(shù) MD5 屬于單向加密,只能夠暴力破解。
MD5應(yīng)用場(chǎng)景 在nacos分布式配置中心中,使用MD5 比對(duì)文件內(nèi)容是否發(fā)生改變
HasherPro比對(duì)文件內(nèi)容是否發(fā)生改變。
MD5在線(xiàn)暴力破解地址:
String userName= "123456" ;
System. out .println( DigestUtils. md5Hex (userName));
黑客如何破解?自己需要根據(jù)參數(shù)內(nèi)容 生成簽名
如果只是改了參數(shù)內(nèi)容---沒(méi)有用的 所以我們需要該簽名
{"password":"123456","phoneNumber":"phoneNumber","channel":"安卓","equipment":""}
{sign=325ab041d4889825a46d1e1e802ab5de, timestamp=1652537015771}
你開(kāi)放的接口真的就很安全嗎,看看有沒(méi)有做到如下幾點(diǎn)
1.請(qǐng)求身份驗(yàn)證
2.請(qǐng)求參數(shù)校驗(yàn)
3.請(qǐng)求是否唯一
4.請(qǐng)求次數(shù)限制
請(qǐng)求身份驗(yàn)證
基于 AccessKey:為接口調(diào)用放分配AccessKey和SecretKey(不參與傳輸,只用于本地接口加密,不能泄露)
基于token身份驗(yàn)證:
1.用戶(hù)登錄提供認(rèn)證信息(如:賬號(hào)密碼)服務(wù)器驗(yàn)證成功后將用戶(hù)信息保存到token內(nèi)并設(shè)置有效期,再返回token給調(diào)用方
2.調(diào)用方保存token,并在有效期內(nèi)重新?lián)Q取token,保證token是有效的
3.服務(wù)器驗(yàn)證token有效性,無(wú)效則攔截請(qǐng)求返回錯(cuò)誤信息,反之則從token內(nèi)獲取用戶(hù)信息進(jìn)行后續(xù)操作
請(qǐng)求參數(shù)校驗(yàn)
1.校驗(yàn)參數(shù)合理性(如:參數(shù)類(lèi)型,參數(shù)長(zhǎng)度,參數(shù)值校驗(yàn))
2.防止XSS,SQL注入(解決方案:過(guò)濾敏感字符或直接返回錯(cuò)誤信息)
3.校驗(yàn)參數(shù)可靠性是否被篡改(可以將參數(shù)以特定格式排列+秘鑰組成字符串,在進(jìn)行MD5或SHA簽名)
請(qǐng)求是否唯一
前面第3點(diǎn)解決了請(qǐng)求參數(shù)被篡改的隱患,但是還存在著重復(fù)使用請(qǐng)求參數(shù)偽造二次請(qǐng)求的隱患
timestamp+nonce方案
nonce指唯一的隨機(jī)字符串 ,用來(lái)標(biāo)識(shí)每個(gè)被簽名的請(qǐng)求。通過(guò)為每個(gè)請(qǐng)求提供一個(gè)唯一的標(biāo)識(shí)符,服務(wù)器能夠防止請(qǐng)求被多次使用(記錄所有用過(guò)的nonce以阻止它們被二次使用)。
然而,對(duì)服務(wù)器來(lái)說(shuō)永久存儲(chǔ)所有接收到的nonce的代價(jià)是非常大的??梢允褂胻imestamp來(lái)優(yōu)化nonce的存儲(chǔ) 。
假設(shè)允許客戶(hù)端和服務(wù)端最多能存在15分鐘的時(shí)間差,同時(shí)追蹤記錄在服務(wù)端的nonce集合。當(dāng)有新的請(qǐng)求進(jìn)入時(shí),首先檢查攜帶的timestamp是否在15分鐘內(nèi),如超出時(shí)間范圍,則拒絕,然后查詢(xún)攜帶的nonce,如存在已有集合,則拒絕。否則,記錄該nonce,并刪除集合內(nèi)時(shí)間戳大于15分鐘的nonce(可以使用redis的expire,新增nonce的同時(shí)設(shè)置它的超時(shí)失效時(shí)間為15分鐘)。
請(qǐng)求次數(shù)限制
某些資源我們需要限制用戶(hù)的請(qǐng)求次數(shù),同時(shí)也為了防止非人為操作可能導(dǎo)致系統(tǒng)的崩潰
實(shí)現(xiàn)思路如下:
假如我們?cè)试S用戶(hù)每秒鐘最多10次請(qǐng)求,超過(guò)10次則返回“手速太快了,慢點(diǎn)把。?!?/p>
這里我們使用redis輔助我們實(shí)現(xiàn):
以用戶(hù)IP為key,請(qǐng)求次數(shù)為value,有效時(shí)間為1秒
用戶(hù)在每秒的第一次訪問(wèn)的時(shí)候,此時(shí)我們的redis是沒(méi)有key為用戶(hù)ip的數(shù)據(jù)的(因?yàn)槭Я?,或者第一次?qǐng)求)所以我們要初始化當(dāng)前請(qǐng)求用戶(hù)的ip為keyvalue為0到redis數(shù)據(jù)庫(kù)
當(dāng)用戶(hù)在1s內(nèi)再次發(fā)起請(qǐng)求我們就將此ip的請(qǐng)求次數(shù)+1,并判斷請(qǐng)求次數(shù)是否已近=10
=10則返回給用戶(hù)手速太快了!請(qǐng)稍后重試..否則繼續(xù)執(zhí)行后續(xù)操作
具體實(shí)現(xiàn)代碼如下:
如有疑問(wèn)可在下方留言,我會(huì)盡快答復(fù),或者關(guān)注公眾號(hào) 程序員MuziDong 隨時(shí)了解新的動(dòng)態(tài)
API接口,類(lèi)似 ;mch_id=123 ,這個(gè)請(qǐng)求我以商戶(hù)mch_id=123的身份給訂單號(hào)為order_id=123退款,如果服務(wù)器不辯別請(qǐng)求發(fā)起者的身份直接做相應(yīng)的操作,那是及其危險(xiǎn)的。
一般的,在PC端,我們是通過(guò)加密的cookie來(lái)做會(huì)員的辨識(shí)和維持會(huì)話(huà)的;但是cookie是屬于瀏覽器的本地存儲(chǔ)功能。APP端不能用,所以我們得通過(guò)token參數(shù)來(lái)辨識(shí)會(huì)員;而這個(gè)token該如何處理呢?
延伸開(kāi)來(lái),接口的安全性主要圍繞Token、Timestamp和Sign三個(gè)機(jī)制展開(kāi)設(shè)計(jì),保證接口的數(shù)據(jù)不會(huì)被篡改和重復(fù)調(diào)用。
一般來(lái)說(shuō),在前端對(duì)數(shù)據(jù)做加密或者前面,是不現(xiàn)實(shí)的。前后端使用HTTP協(xié)議進(jìn)行交互的時(shí)候,由于HTTP報(bào)文為明文,所以通常情況下對(duì)于比較敏感的信息可以通過(guò)在前端加密,然后在后端解密實(shí)現(xiàn)"混淆"的效果,避免在傳輸過(guò)程中敏感信息的泄露(如,密碼,證件信息等)。不過(guò)前端加密只能保證傳輸過(guò)程中信息是‘混淆’過(guò)的,對(duì)于高手來(lái)說(shuō),打個(gè)debugger,照樣可以獲取到數(shù)據(jù),并不安全,所謂的前端加密只是稍微增加了攻擊者的成本,并不能保證真正的安全。即使你說(shuō)在前端做了RSA公鑰加密,也很有可能被高手獲取到公鑰,并使用該公鑰加密數(shù)據(jù)后發(fā)給服務(wù)端,所以務(wù)必認(rèn)為前端的數(shù)據(jù)是不可靠的,服務(wù)端要加以辯別。敏感信息建議上https。
所以一般建議上https,敏感信息md5混淆,前端不傳輸金額字段,而是傳遞商品id,后端取商品id對(duì)應(yīng)的金額,將金額等參數(shù)加簽名發(fā)送到支付系統(tǒng)。金額可以是明文的。
token授權(quán)機(jī)制 :用戶(hù)使用用戶(hù)名密碼登錄后,后臺(tái)給客戶(hù)端返回一個(gè)token(通常是UUID),并將Token-UserId鍵值對(duì)存儲(chǔ)在redis中,以后客戶(hù)端每次請(qǐng)求帶上token,服務(wù)端獲取到對(duì)應(yīng)的UserId進(jìn)行操作。如果Token不存在,說(shuō)明請(qǐng)求無(wú)效。
弊端 :token可以被抓包獲取,無(wú)法預(yù)防MITM中間人攻擊
用戶(hù)每次請(qǐng)求都帶上當(dāng)前時(shí)間的時(shí)間戳timestamp,服務(wù)器收到請(qǐng)求后對(duì)比時(shí)間差,超過(guò)一定時(shí)長(zhǎng)(如5分鐘),則認(rèn)為請(qǐng)求失效。時(shí)間戳超時(shí)機(jī)制是防御DOS攻擊的有效手段。
將token,timestamp等其他參數(shù)以字典序排序,再加上一個(gè)客戶(hù)端私密的唯一id(這種一般做在服務(wù)端,前端無(wú)法安全保存這個(gè)id)或使用私鑰簽名,將前面的字符串做MD5等加密,作為sign參數(shù)傳遞給服務(wù)端。
地球上最重要的加密算法:非對(duì)稱(chēng)加密的RSA算法。公鑰加密的數(shù)據(jù),可以用私鑰解密;私鑰簽名(加密)的數(shù)據(jù),可以用公鑰驗(yàn)簽。
RSA原理是對(duì)極大整數(shù)做因數(shù)分解,以下摘自維基百科。
暫時(shí)比較忙沒(méi)時(shí)間,將于7月29日晚更新。
來(lái)更新啦。
微信支付安全規(guī)范,可以查看官方文檔
第1點(diǎn)中,其簽名算法最重要的一步,是在最后拼接了商戶(hù)私密的API密鑰,然后通過(guò)md5生成簽名,這時(shí)即使金額是明文也是安全的,如果有人獲取并修改了金額,但是簽名字段他是無(wú)法偽造的,因?yàn)樗麩o(wú)法知道商戶(hù)的API密鑰。當(dāng)然,除了微信支付的拼接API生成簽名的方法,我們也可以通過(guò)java自帶的security包進(jìn)行私鑰簽名。其中nonce隨機(jī)字符串,微信支付應(yīng)該做了校驗(yàn),可以防止重放攻擊,保證一次請(qǐng)求有效,如果nonce在微信支付那邊已經(jīng)存在,說(shuō)明該請(qǐng)求已執(zhí)行過(guò),拒絕執(zhí)行該請(qǐng)求。
阮一峰老師的博客-RSA算法原理:
維基百科:
accesstoken是一種方式,早期簡(jiǎn)單點(diǎn)的有appid,appkey方式,復(fù)雜一點(diǎn)的可以使用RSA加密。
服務(wù)器和APP直接大部分通過(guò)接口調(diào)用,比如用戶(hù)列表。/user/list/
post到/user/list/里面有加密的一個(gè)token這個(gè)是驗(yàn)證是不是一個(gè)合法的訪問(wèn)者。而且現(xiàn)在很多開(kāi)發(fā)平臺(tái)比如微信。