XSS adalah salah satu security issue yang biasa terjadi ketika membuat website, XSS adalah celah keamanan, dimana orang bisa secara sengaja memasukkan parameter yang mengandung JavaScript agar dirender oleh halaman website kita. Biasanya tujuan dari XSS adalah mencuri cookie browser pengguna yang sedang mengakses website kita. XSS bisa menyebabkan akun pengguna kita diambil alih jika tidak ditangani dengan baik.
Auto Escape
Berbeda dengan bahasa pemrogaman lain seperi PHP, pada golang template, masalah XSS sudah diatasi secara otomatis, golang template memiliki fitur Auto Escape, dimana dia bisa mendeteksi data yang perlu ditampilkan di template, jika mengandung tag-tag html atau script, secara otomatis akan di escape.
Untuk mencobanya, silakan buat template baru dengan nama post.gohtml
dan isikan kode program berikut
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{.Title}}</title>
</head>
<body>
<h1>{{.Title}}</h1>
{{.Body}}
</body>
</html>
Selanjutnya buat file baru untuk kode program handler dan unit test nya xss_test.go
dan masukkan baris kode berikut ini
package belajar_golang_web
import (
"fmt"
"io"
"net/http"
"net/http/httptest"
"testing"
)
func TemplateAutoEscape(writer http.ResponseWriter, request *http.Request) {
myTemplates.ExecuteTemplate(writer, "post.gohtml", map[string]interface{}{
"Title": "Template Auto Escape",
"Body": "<p>Ini adalah Body</p>",
})
}
func TestTemplateAutoEscape(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "http://localhost:8080", nil)
recorder := httptest.NewRecorder()
TemplateAutoEscape(recorder, request)
body, _ := io.ReadAll(recorder.Result().Body)
fmt.Println(string(body))
}

Coba jalankan baris kode diatas, dan perhatikan hasil output dari tag <p>
nya sudah di escape

Mematikan auto escape
Jika kita mau, auto escape juga bisa dimatikan, namun kita perlu memberitahu template secara eksplisit ketika kita menambahkan template data. Kita bisa menggunakan sebperti berikut
template.HTML
, jika ini adalah data HTMLtemplate.CSS
, jika ini adalah data CSStemplate.JS
, jika ini adalah data Javascript
package belajar_golang_web
import (
"fmt"
"html/template"
"io"
"net/http"
"net/http/httptest"
"testing"
)
func TemplateAutoDisabled(writer http.ResponseWriter, request *http.Request) {
myTemplates.ExecuteTemplate(writer, "post.gohtml", map[string]interface{}{
"Title": "Template Auto Escape",
"Body": template.HTML("<p>Ini adalah Body</p>"),
})
}
func TestTemplateAutoEscapeDisabled(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "http://localhost:8080", nil)
recorder := httptest.NewRecorder()
TemplateAutoDisabled(recorder, request)
body, _ := io.ReadAll(recorder.Result().Body)
fmt.Println(string(body))
}

Masalah XSS (Cross Site Scripting)
Saat kita mematikan fitur auto escape, bisa dipastikan masalah XSS akan mengintai kita, jadi pastikan kita benar-benar percaya terhadap sumber data yang kita matikan auto escapenya.
Penutup
Pada artikel kali ini kita telah belajar tentang XSS Cross Site Scripting pada golang web. Dan pada artikel selanjutnya saya akan membahas redirect pada golang web.