其實這篇原本應該跟昨天那篇一起發的,但昨天我一早就搭高鐵去參加今年 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, "<");
str = str.replace(/>/g, ">");
return str;
}
htmlentities()
、htmlspecialchars()
cgi.escape()
Server.HTMLEncode()
Server.HtmlEncode()
、Microsoft Anti-Cross Site Scripting Library
xssprotect (Open Source Library)
node-validator
使輸出的內容避免被作為HTML解析,即可強行指定輸出內容為文字/JavaScript指令碼(順便指定了內容編碼)。
<?php
header('Content-Type: text/javascript; charset=utf-8');
?>