咨詢
交流群
電話

如何處理跨站腳本攻擊(XSS)

文檔 > 使用心得 2019-06-06 12:03 閱讀

跨站腳本攻擊(XSS)是網站制作中最常見的漏洞之一。原理非常簡單,就是在用戶輸入一些代碼,這些代碼會導致瀏覽器執行一些腳本,從而達到攻擊目的。

這些攻擊性代碼通常要使用" < >來達到攻擊目的。

比如:您搜索的內容是: ${question},其中${question}是用戶輸入的內容。

如果用戶輸入<script>alert(1);</script>,這時頁面會就執行這段腳本代碼。

或者您的搜索內容是 <input type="text" value="${question}">,如果用戶輸入" onclick="alert(1);。

最終頁面為您的搜索內容是 <input type="text" value="" onclick="alert(1);">,此時點擊這個輸入框會觸發onclick事件,從而達到攻擊目的。

由此可知處理" < >等特殊字符,是防止跨站腳本攻擊(XSS)攻擊的關鍵??梢酝ㄟ^HTML轉義來處理這些問題,HTML轉義會將" < >轉義為&quot; &lt; &gt;,從而防止這些攻擊。

FreeMarker HTML轉義:${username?html}。

如上例,不應在頁面直接輸出用戶輸入的內容,而應先轉義再輸出。如:

  • 您搜索的內容是: ${question?html}
  • 您的搜索內容是 <input type="text" value="${question?html}">

跨站腳本攻擊(XSS)無處不在,每個變量都需要小心的加上轉義代碼,容易遺漏。FreeMarker提供了一種對整個頁面一次性加上轉義的方法。

escape(轉義標簽)

為了避免跨站腳本攻擊(XSS),通常會對輸出的內容做HTML轉義,比如${foo?html}。但是所有變量都要做這個轉義不僅麻煩,還容易遺忘。另外FreeMarker空值處理也很麻煩且容易遺忘,比如${foo!}、${(user.username)!}。

使用excape標簽可以很好的解決這個問題。

[#escape x as (x)!?html]
    ...
    ${user.username}
    ...
[/#escape]

只要被這個標簽包含的代碼,都相當于加上了${(foo.bar)!?html},如${user.username}相當于${(user.username)!?html}。即包含了空值處理,也包含了HTML轉義處理。

noescape(不轉義標簽)

在escape標簽內有對象不需要轉義時,可以用noescape標簽。

[#escape x as (x)!?html]
    ...
    [#noescape]${text}[/#noescape]
    ...
[/#escape]

注意事項:必須對所有頁面都加上轉義代碼,包括包含文件。比如頁面A加上了escape轉義代碼并不代表這個頁面可以高枕無憂,如果頁面A中使用include標簽包含了頁面B,而頁面B中并沒有加escape轉義代碼,則仍然有跨站腳本攻擊(XSS)的風險。應該在頁面B也加入escape轉義代碼。最為常見的是分頁模板page.html沒有加上轉義代碼,而分頁模板可能被很多頁面包含。

丹东市| 禄丰县| 玛沁县| 沁阳市| 盐城市| 临城县| 平遥县| 元江| 友谊县| 剑河县| 新闻| 柳林县| 霞浦县| 永福县| 林周县| 惠来县| 蓬安县| 瑞丽市| 延吉市| 瓮安县| 郓城县| 浦东新区| 黔东| 兴义市| 隆安县| 安龙县| 安国市| 北票市| 桂阳县| 华亭县| 深泽县| 松阳县| 临汾市| 盐山县| 顺平县| 托里县| 平舆县| 双柏县| 迭部县| 房产| 禹州市|