国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

記一次Nodejs安全工單的處理過程_20171226

gnehc / 2372人閱讀

摘要:事件原因之前使用開發(fā)的一個(gè)網(wǎng)站。事件的處理方法在公司是有專門的安全組來做安全這塊兒工作的。第一時(shí)間對這個(gè)接口進(jìn)行了下線處理,然后評估了安全的解決方案,再次上線該接口。這些機(jī)器也肯定是經(jīng)過做特殊的隔離處理的沒有敏感的公司信息資源。

事件原因:

之前使用Nodejs開發(fā)的一個(gè)網(wǎng)站。在網(wǎng)站上有一個(gè)頁面有個(gè)功能,允許用戶上傳圖片或者粘貼一張圖片鏈接。服務(wù)端讀取用戶上傳的圖片信息或者是請求用戶填寫的圖片鏈接獲取圖片信息。

如果是用戶使用上傳功能,前端可以在input控件上做下限制上傳文件的類型,后端再做下校驗(yàn),以保障獲取圖片文件的合法(或者是安全)。

如果是用戶填寫的圖片鏈接,其中隱藏的安全隱患就比較大了。如果用戶填寫不是正常的httphttps或者是ftp類的鏈接,而是curl這種可以在服務(wù)端執(zhí)行的命令,服務(wù)端拿到用戶的鏈接不作處理直接請求的話,可能會(huì)對公司造成不可估量的額損失(比如:內(nèi)網(wǎng)服務(wù)器信息泄露、更嚴(yán)重是內(nèi)網(wǎng)服務(wù)器被攻擊)。

事件的處理方法:

在公司是有專門的安全組來做Web安全這塊兒工作的。這個(gè)事件發(fā)生的時(shí)候,我首先是短信收到了服務(wù)器的報(bào)警,線上出現(xiàn)了大量的FATAL日志。這個(gè)時(shí)候立刻是登上服務(wù)器排查,緊接著就被公司的安全組某位同事在內(nèi)部聊天工具上通知,網(wǎng)站收到了ssrf(服務(wù)器端請求偽造)攻擊。第一時(shí)間對這個(gè)接口進(jìn)行了下線處理,然后評估了安全的解決方案,再次上線該接口。

那么在服務(wù)端具體的防范ssrf攻擊的方法時(shí)什么呢,請接著往下看。

服務(wù)端的解決方案

ssrf具體原理就是在服務(wù)端偽造請求,請求服務(wù)器的資源。上面的案例場景我也提到了。我有個(gè)功能是會(huì)請求一張外網(wǎng)圖片鏈接獲取圖片信息的。而用戶填寫的這個(gè)圖片鏈接很可能就是違法的請求。當(dāng)我服務(wù)端拿到這個(gè)鏈接后,并沒有按照預(yù)期去請求外網(wǎng)資源,而是請求了內(nèi)網(wǎng)服務(wù)的資源。這樣我的服務(wù)器就被攻擊。

那么什么原因可能造成ssrf漏洞呢:

web服務(wù)存在請求外網(wǎng)資源的功能

請求的url參數(shù)是外接用戶可以控制的

服務(wù)端在請求外網(wǎng)資源前,沒有做域名和IP校驗(yàn)(是否請求的是內(nèi)網(wǎng)資源)

僅僅通過正則匹配來判斷IP段(域名指向的也可能是內(nèi)網(wǎng)IP,如果IP是十進(jìn)制表示法沒有問題,但I(xiàn)P還有十六進(jìn)制和十進(jìn)制、二進(jìn)制表示法)

由上面提到的原因其實(shí)已經(jīng)可以知道一些解決方法:

1.校驗(yàn)用戶填寫鏈接的協(xié)議頭

在拿到用戶填寫的鏈接時(shí)做下校驗(yàn)。看是否是合法的httphttpsftp協(xié)議頭。當(dāng)然這個(gè)校驗(yàn)為了減輕服務(wù)器壓力應(yīng)該在前端和后端都校驗(yàn)。如不過不是合法的請求協(xié)議頭直接拒絕和返回請求資源失敗的錯(cuò)誤消息。(偽代碼如下)

const allowReqprotocol = [
        "http", 
        "https",
        "ftp",
    ];

const reqProtocol = request.protocol;

// 強(qiáng)制校驗(yàn)用戶輸入圖片鏈接的協(xié)議頭是否為自己網(wǎng)站允許的協(xié)議頭
if (allowReqprotocol.indexOf(reqProtocol) < 0) {
    yog.log.warning(imgUrl);
    res.json(errorMsg.imgTypeError());
    return;
}
2.檢驗(yàn)用戶請求的IP指向的是否為內(nèi)網(wǎng)ip

上面已經(jīng)介紹過僅僅通過正則沒辦法完全校驗(yàn)是否是合法的IP段。其實(shí)還有一種方法就是把我們的IP段轉(zhuǎn)化為int來進(jìn)行判斷。剛好npm上有個(gè)包ip-to-int可以滿足我們的需求。我們可以把兩者結(jié)合起來一起來判斷請求鏈接的IP是否為內(nèi)網(wǎng)IP。

const dns = require("dns");
const url = require("url");
const ipToInt = require("ip-to-int");

const parseUrl = url.parse(rqUrlString);
const hostname = parseUrl.hostname; 

// 使用Nodejs的dns模塊根據(jù)域名解析出域名對應(yīng)的ip地址
dns.lookup(hostname, (err, address, family) => {

    //加入我的內(nèi)網(wǎng)IP段為 180.xxx.xxx.xxx  180.255.255.255
    const ipRegx = /^180./;
    const ipArr = [ipToInt(180.0.0.0).toInt(), ipToInt(180.255.255.255).toInt()];

    
    if(ipRegx.test(address) || ipRang(address)){
        // 拒絕請求
    } else {
        // 繼續(xù)請求
    }
});


// 判斷一個(gè)ip是否在一個(gè)數(shù)組之間
function ipRang(ip, array) {
    
    // ip在給定的ip段之間
    return true;
    // ip不在給定的ip段之間
    return false;
}

3.最后的檢驗(yàn)

經(jīng)過上面的檢驗(yàn)已經(jīng)基本上可以保證如果有請求外網(wǎng)的Url ,請求的在服務(wù)端執(zhí)行以后指向的也是外網(wǎng)資源。那么當(dāng)資源到達(dá)服務(wù)端以后,為了保障資源的安全性。我們對請求的內(nèi)容做最后的校驗(yàn)。比如我僅僅是想請求圖片資源,而且是限制了幾種格式。比如:png、jpg、jpeg。

    const allowImgContentType = [
        "image/jpeg",
        "image/png",
        "image/gif"
    ];
    
    
   if( allowImgContentType.indexOf(response.headers["content-type"]) < 0){
   
    // 返回的內(nèi)容為非法資源
   }
4.假如允許請求內(nèi)網(wǎng)資源

上面的方法基本上都是如果請求的是內(nèi)網(wǎng)資源都是直接拒絕掉了。但是假如有請求內(nèi)網(wǎng)的需求怎么辦呢。如果內(nèi)網(wǎng)的資源對外部開發(fā),肯定也是特定的機(jī)器。這些機(jī)器也肯定是經(jīng)過op做特殊的隔離處理的、沒有敏感的公司信息資源。那么當(dāng)我們的請求到達(dá)公司內(nèi)網(wǎng)后怎么保證該請求始終請求的是特定的IP呢?

其實(shí)我們只需要將請求的鏈接的host和在header投中和請求機(jī)器的ip做下綁定就好。

// 通過dns模塊解析出host對應(yīng)的ip  這里是address
// 并且通過url模塊解析出port path 和querystring 重新拼接請求的url

const bindURLString = `${parseUrl.protocol}//${address}:${reqUrlPort}${pathName}?${queryString}`;

// 然后在請求發(fā)出去的時(shí)候設(shè)置下header頭,下面是我使用request模塊發(fā)出請求時(shí)設(shè)置參數(shù)

const options = {
   "url": bindURLString,
   "encoding": "binary",
   "rejectUnauthorized": false,        
   "headers": {
       "Host": bindDnsObj.hostname    //這里綁定請求的host
   }
};

這樣做就是強(qiáng)制請求去請求特定的機(jī)器。而不會(huì)請求其它機(jī)器。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/90442.html

相關(guān)文章

  • 我是如何使用React+Redux構(gòu)建大型應(yīng)用的

    摘要:所以前端工程師不僅僅是寫好頁面和做好兼容性。對前端工程師的技術(shù)能力也會(huì)帶來考驗(yàn)。這里想要說的是,如果使用了,使用了服務(wù)端渲染,對于前端工程師的個(gè)人素質(zhì)要求會(huì)比較高,因?yàn)樾枰幚砗芏喾?wù)端的問題。 背景 我們團(tuán)隊(duì)有個(gè)項(xiàng)目由于開發(fā)時(shí)間較長,且是前后端雜糅的開發(fā)方式,維護(hù)成本很高,在線上暴露的問題很多。而且因?yàn)閷恿斯疽话俣鄺l產(chǎn)品線,每天都會(huì)接到大量的客訴和產(chǎn)品線反饋的問題。2017年11...

    canopus4u 評論0 收藏0
  • 項(xiàng)目總結(jié) 20171226

    摘要:借助預(yù)加載圖片詳情文檔地址項(xiàng)目中為了確保頁面顯示時(shí),圖片已經(jīng)全部加載完畢,因此需要提前加載圖片,加載圖片的過程使用進(jìn)度條顯示。第二個(gè)參數(shù)表示是否搜索其子目錄。并在同元素或父級添加了時(shí),元素顯示。 showImg(https://segmentfault.com/img/bV0ZzM?w=395&h=640); 1. 借助require.context預(yù)加載圖片 詳情文檔地址 項(xiàng)目中為了...

    張金寶 評論0 收藏0
  • 一次翻譯站經(jīng)歷

    摘要:做這個(gè)記錄之前,剛完成使用作為公司前端項(xiàng)目的持續(xù)交付工具的實(shí)踐,打算寫的教程前先把官方文檔扒下來做個(gè)翻譯站。在實(shí)踐一番后,卡在不能頻密調(diào)取翻譯這塊上,項(xiàng)目無法進(jìn)行下去。 做這個(gè)記錄之前,剛完成使用drone作為公司前端項(xiàng)目的持續(xù)交付工具的實(shí)踐,打算寫的教程前先把官方文檔扒下來做個(gè)翻譯站。在實(shí)踐一番后,卡在不能頻密調(diào)取google翻譯這塊上,項(xiàng)目無法進(jìn)行下去。最后覺得經(jīng)歷的過程涉及的內(nèi)容...

    seasonley 評論0 收藏0
  • 一次mpa多頁面應(yīng)用處理

    摘要:起因由于國內(nèi)的搜索引擎對單頁面應(yīng)用支持不友好,所以一般網(wǎng)站的網(wǎng)站做的是多頁面應(yīng)用選擇做網(wǎng)站當(dāng)然是世界最好的語言啦,開始也是想這樣做的,但是在寫這篇文章的時(shí)候,自己是一枚前端開發(fā),考慮到可維護(hù)性,其他的前端未必能看懂代碼,所以還是在方面選型, 起因 由于國內(nèi)的搜索引擎對單頁面應(yīng)用支持不友好,所以一般網(wǎng)站的網(wǎng)站做的是多頁面應(yīng)用 選擇 做網(wǎng)站當(dāng)然是世界最好的語言PHP啦,開始也是想這樣做的,...

    lei___ 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<