您好,登錄后才能下訂單哦!
Web安全問題,很多時候會被人所忽略,安全漏洞造成了很多不必要的維護和開發任務,產生的問題有時候更是致命的。 實際上,只要我們養成一些習慣,知道一些安全問題的基本原理,可以很大程度避免問題的出現,這也是一個優秀Web程序員的必備素質。
什么是UI變量?凡是出現在HTML中由后端輸出(或由JSON渲染)的變量都可稱之為UI變量,它可以是PHP變量、Smarty變量、JSP變量或前端模版變量等等。
有些模版自帶了轉義功能,比如Smarty可以對HTML或JavaScript轉義:
Data: <h2>"Ricky"</h2> Template: <{$name|escape:html|escape:javascript}> Output: <h2>"Ricky"<\/h2>
Mustache默認自動對HTML轉義(雙花括號是wiki的語法,所以本文Mustache模版標簽用{<>}表示):
Data: <h2>Ricky</h2> Template: {<name>} Output: <h2>Ricky<\/h2>
如果不想轉義,可以使用3個花括號:{`name`}
注意:當沒有使用具有轉義功能的模版時,一定要在程序中對UI變量進行轉義。對后端傳來的數據,都采取不信任的策略。
根據UI變量出現的位置不同,轉義規則也不同,常見的有以下幾種情況:
實例:
<div>{<content>}</div> <input type='checkbox' value='{<value1>}' /> <input type="text" value="{<value2>}" />
轉義規則:
字符 | 轉義 | 漏洞實例 |
---|---|---|
< | < | {<content>} = <h2>I am bigger</h2> |
> | > | |
' | ' | {<value1>} = '/><script>alert(0)</script>… |
" | " | {<value2>} = "/><script>alert(0)</script>… |
& | & (可選) | 如果不轉義,則用戶可以輸入不可見字符,如: 如果轉義,則用戶輸入的某些字符不能正確顯示,如:© |
實例:
<script> var email = '{<email>}'; var name = "{<name>}"; /*{<sex>} will not use */ </script>
轉義規則:
字符 | 轉義 | 漏洞實例 |
---|---|---|
' | \' | {<email>} = ';alert(0);… |
" | \" | {<name>} = ";alert(0);… |
\ | \\ | {<name>} = \ 報錯:unterminated string literal |
/ | \/ | {<name>} = ";</script><script>alert(0);… {<sex>} = */alert(0);… |
\n | \n | {<email>} = a@a.com b@b.com 報錯:unterminated string literal |
\r | \r |
注意:注釋也會存在漏洞,代碼上線前要進行壓縮,去掉注釋。
實例:
<script> $("#tip").innerHTML = "您好!" + "{<username>}"; </script>
轉義規則:
字符 | 轉義 | 漏洞實例 | |
---|---|---|---|
先進行HTML轉義,再進行JavaScript轉義 | |||
< | < | {<username>} = ";</script><script>document.body.innerHTML = "<h2>Ricky</h2> | |
> | > | ||
' | \' | ||
" | \" | ||
\ | \\ | ||
/ | \/ | ||
\n | \n | ||
\r | \r |
實例:
<input type="button" value="提交" />
轉義規則:
字符 | 轉義 | 漏洞實例 |
---|---|---|
先進行JavaScript轉義,再進行HTML轉義 | ||
' | \' | {<data>} = ')"/><input name=" |
" | \" | |
\ | \\ | |
/ | \/(可選) | |
\n | \n | |
\r | \r | |
< | < | |
> | > |
注意:實際開發中,應使用事件綁定,避免這種寫法。
實例:
<a >進入旭日</a>
轉義規則:
字符 | 轉義 | 漏洞實例 |
---|---|---|
非字母、數字字符 | encodeURIComponent | {<path>} = "></a>… |
實例:
<script> var url = location.href; //var cookie = document.cookie; $("#Show").html(encodeHTML(url)); </script>
說明:從cookie或頁面的url中獲取的數據都是不可信任的,可能包含惡意代碼。
實例:
<script> document.write('<input type="hidden" name="url" value="' + location.href + '" />'); </script>
正確寫法:
<input type="hidden" name="url" value="" /> <script> document.getElementsByName("url").value = location.href; </script>
說明:直接向頁面輸出帶有url的HTML,可能會執行含惡意代碼。
說明:當域為a.sogou.com的A頁面內嵌域為b.sogou.com的B頁面時,可以通過設置domain為sogou.com使兩個頁面進行通信。但這樣的設置使安全隱患得以擴大化,如果B頁面存在XSS漏洞,那么就可以通過B頁面操控正常的A頁面。
說明:Json數據的Response要設置contentType為“text/javascript”,避免未設置或者設置成“text/html”。否則容易注入JavaScript腳本,并當著普通頁面來運行。
做跨域通信通常會用到Flash,這需要在server部署一個crossdomain.xml文件,通常為:
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>
這表示允許任何域的Flash對本server進行訪問,如果Flash是用戶上傳的,就可能包含惡意代碼。
解決辦法:只允許搜狗域的Flash訪問
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*.sogou.com" /> </cross-domain-policy>
如果展現來自用戶上傳的Flash,需要設置一下2個參數:
allowScriptAccess: "never" //絕對禁止Flash與頁面元素及腳本的通訊
allowNetworking: "none" //禁止任何的網絡通訊
不要使用iframe或者其他形式隨意嵌套第三方頁面,第三方頁面會包含不可控的因素,譬如含有***瀏覽者的惡意代碼。如果第三方頁面存在漏洞,***者可以通過***第三方來實現***父頁面。
盡量使用POST提交
添加refer的檢查
form表單提交添加圖形驗證碼
添加token驗證
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。