在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 4.3 預(yù)防跨站腳本
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫進(jìn)行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計一個Web框架
14.3 表單及驗證支持
12 部署與維護(hù)
10 國際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯誤處理,調(diào)試和測試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項目規(guī)劃
13.4 日志和配置設(shè)計
7.6 字符串處理
13.2 自定義路由器設(shè)計
6.3 session存儲
3.4 Go的http包詳解
8.2 WebSocket
10.3 國際化站點
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯誤處理
9.5 存儲密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯誤處理
6 session和數(shù)據(jù)存儲
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結(jié)
3.2 Go搭建一個Web服務(wù)器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫
4.6 小結(jié)
8.4 RPC

4.3 預(yù)防跨站腳本

現(xiàn)在的網(wǎng)站包含大量的動態(tài)內(nèi)容以提高用戶體驗,比過去要復(fù)雜得多。所謂動態(tài)內(nèi)容,就是根據(jù)用戶環(huán)境和需要,Web應(yīng)用程序能夠輸出相應(yīng)的內(nèi)容。動態(tài)站點會受到一種名為“跨站腳本攻擊”(Cross Site Scripting, 安全專家們通常將其縮寫成 XSS)的威脅,而靜態(tài)站點則完全不受其影響。

攻擊者通常會在有漏洞的程序中插入JavaScript、VBScript、 ActiveX或Flash以欺騙用戶。一旦得手,他們可以盜取用戶帳戶信息,修改用戶設(shè)置,盜取/污染cookie和植入惡意廣告等。

對XSS最佳的防護(hù)應(yīng)該結(jié)合以下兩種方法:一是驗證所有輸入數(shù)據(jù),有效檢測攻擊(這個我們前面小節(jié)已經(jīng)有過介紹);另一個是對所有輸出數(shù)據(jù)進(jìn)行適當(dāng)?shù)奶幚恚苑乐谷魏我殉晒ψ⑷氲哪_本在瀏覽器端運行。

那么Go里面是怎么做這個有效防護(hù)的呢?Go的html/template里面帶有下面幾個函數(shù)可以幫你轉(zhuǎn)義

  • func HTMLEscape(w io.Writer, b []byte) //把b進(jìn)行轉(zhuǎn)義之后寫到w
  • func HTMLEscapeString(s string) string //轉(zhuǎn)義s之后返回結(jié)果字符串
  • func HTMLEscaper(args ...interface{}) string //支持多個參數(shù)一起轉(zhuǎn)義,返回結(jié)果字符串

我們看4.1小節(jié)的例子

fmt.Println("username:", template.HTMLEscapeString(r.Form.Get("username"))) //輸出到服務(wù)器端
fmt.Println("password:", template.HTMLEscapeString(r.Form.Get("password")))
template.HTMLEscape(w, []byte(r.Form.Get("username"))) //輸出到客戶端

如果我們輸入的username是<script>alert()</script>,那么我們可以在瀏覽器上面看到輸出如下所示:

http://wiki.jikexueyuan.com/project/go-web-programming/images/4.3.escape.png?raw=true" alt="" />

圖4.3 Javascript過濾之后的輸出

Go的html/template包默認(rèn)幫你過濾了html標(biāo)簽,但是有時候你只想要輸出這個<script>alert()</script>看起來正常的信息,該怎么處理?請使用text/template。請看下面的例子:

import "text/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")

輸出

Hello, <script>alert('you have been pwned')</script>!

或者使用template.HTML類型

import "html/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", template.HTML("<script>alert('you have been pwned')</script>"))

輸出

Hello, <script>alert('you have been pwned')</script>!

轉(zhuǎn)換成template.HTML后,變量的內(nèi)容也不會被轉(zhuǎn)義

轉(zhuǎn)義的例子:

import "html/template"
...
t, err := template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
err = t.ExecuteTemplate(out, "T", "<script>alert('you have been pwned')</script>")

轉(zhuǎn)義之后的輸出:

Hello, &lt;script&gt;alert(&#39;you have been pwned&#39;)&lt;/script&gt;!