iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 10
1
自我挑戰組

到處挖坑,現在該來還(填)願(坑)ㄌ !!!系列 第 10

『 Day 10 』Web Security - A7 . Cross-Site Scripting (XSS) - 下篇

  • 分享至 

  • twitterImage
  •  

廢話 ヽ(=^・ω・^=)丿

其實這篇原本應該跟昨天那篇一起發的,但昨天我一早就搭高鐵去參加今年 DEVCORE 第一次舉辦的 Conference。繼續將 Buffet 吃好吃滿,晚上順便和 TDOH 的朋友吃個飯、敘敘舊和在新光三越打文章(?。

我覺得我應該之後來寫一篇參加的心得( No Flag )

以上 就醬紙~


防護建議

- 白名單模式

白名單模式僅允許部分標記和屬性,不在這個白名單中的將被統統篩掉。不過這種方式很麻煩,需要你解析HTML的樹狀結構,然後進行篩選,最後將安全的內容顯示出來。同時,因其撰寫難度較高,使用者輸入的形式也更為受限。

function filter(html)
{
    if (!html)
        return "";
    /**
     * 此處填補與解析HTML樹狀結構有關的程式碼。
     **/
    /*白名單。*/
    var whiteList =
        {
            "html": [""],
            "body": [""],
            "head": [""],
            "div": ["class", "id"],
            "img": ["src"],
            "a": ["href"],
            "font": ["size", "color"]
        };

    $("*").each(function (index, elem)
    {
        /*若沒在白名單中匹配到待處理的標記,則將其移除。*/
        if (!whiteList[elem.name])
        {
            $(elem).remove();
            return;
        }
        for (var attr in elem.attributes)
        {
            if (whiteList[elem.name].indexOf(attr) === -1)
            {
                /**
                 * 此處填補針對未匹配到的屬性的處理步驟。
                 **/
            }
        }
    });

    return $.html();
}

這裡不建議使用「黑名單」,是因為黑名單容易遭到繞過,諸如「JavaScript」這個字串,有心人士就可以產生在 HTML 中等價,但字串形式並不為「JavaScript」的寫法,像是用十六進位字元來表示其中的每一個字。由於改寫的形式太多,故利用黑名單模式來篩選危險內容幾乎是不可能的事。

- 跳脫字元

對使用者輸入的內容執行跳脫處理在進行儲存,如

function escape(str)
{
    str = str.replace(/</g, "&lt");
    str = str.replace(/>/g, "&gt");

    return str;
}

- 過濾特殊字元

- 使用HTTP頭指定類型

使輸出的內容避免被作為HTML解析,即可強行指定輸出內容為文字/JavaScript指令碼(順便指定了內容編碼)。

<?php
   header('Content-Type: text/javascript; charset=utf-8');
?>

參考


上一篇
『 Day 9 』Web Security - A7 . Cross-Site Scripting (XSS) - 上篇
下一篇
『 Day 11』Web Security - A8 . 反序列化漏洞
系列文
到處挖坑,現在該來還(填)願(坑)ㄌ !!!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言