C.16. Secure Middleware
Pada chapter ini kita akan belajar menggunakan library secure untuk meningkatkan keamanan aplikasi web.
C.16.1. Keamanan Web Server
Jika berbicara mengenai keamanan aplikasi web, sangat luas sebenarnya cakupannya, ada banyak hal yang perlu diperhatian dan disiapkan. Mungkin tiga di antaranya sudah kita pelajari sebelumnya, yaitu penerapan Secure Cookie, CORS, dan CSRF.
Selain 3 topik tersebut masih terdapat banyak lagi. Beruntungnya ada library secure. Sesuai tagline-nya, secure library digunakan untuk membantu mengatasi beberapa masalah keamanan aplikasi.
Secure library merupakan middleware, penggunaannya sama seperti middleware pada umumnya.
C.15.2. Praktek
Mari langsung kita praktekan. Buat folder project baru. Di file main tulis kode berikut. Sebuah aplikasi dibuat, isinya satu buah rute /index
yang bisa diakses dari mana saja.
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/index", func(c echo.Context) error {
c.Response().Header().Set("Access-Control-Allow-Origin", "*")
return c.String(http.StatusOK, "Hello")
})
e.Logger.Fatal(e.StartTLS(":9000", "server.crt", "server.key"))
}
Perlu diketahui, aplikasi di atas di-start dengan SSL/TLS enabled. Dua buah file dibutuhkan, yaitu file certificate server.crt
dan file private key server.key
. Silakan unduh kedua file tersebut dari source code di
GitHub, folder chapter-C.16-secure-middleware. Pada chapter C.24. HTTPS/TLS Web Server nantinya akan kita pelajari lebih lanjut mengenai cara generate kedua file di atas hingga cara penggunannya.
Kembali ke pembahasan, sekarang tambahkan secure middleware. Import package-nya, buat instance middleware, lalu registrasikan ke echo.
import (
// ...
"github.com/unrolled/secure"
)
func main() {
// ...
secureMiddleware := secure.New(secure.Options{
AllowedHosts: []string{"localhost:9000", "www.google.com"},
FrameDeny: true,
CustomFrameOptionsValue: "SAMEORIGIN",
ContentTypeNosniff: true,
BrowserXssFilter: true,
})
e.Use(echo.WrapMiddleware(secureMiddleware.Handler))
// ...
}
Pembuatan objek secure middleware dilakukan menggunakan secure.New()
dengan isi parameter adalah konfigurasi. Bisa dilihat ada 5 buah property konfigurasi di-set. Berikut merupakan penjelasan tiap-tiap property tersebut.
◉ Konfigurasi AllowedHosts
AllowedHosts: []string{"localhost:9000", "www.google.com"}
Host yang diperbolehkan mengakses web server ditentukan hanya 2, yaitu localhost:9000 yang merupakan web server itu sendiri, dan google.com. Silakan coba mengakses aplikasi kita ini menggunakan AJAX lewat google.com dan domainnya lainnya untuk mengetes apakah fungsionalitas nya berjalan.
◉ Konfigurasi FrameDeny
FrameDeny: true
Secara default sebuah aplikasi web adalah bisa di-load di dalam iframe yang berada host nya berbeda. Misalnya di salah satu laman web www.kalipare.com ada iframe yang atribut src nya berisi www.novalagung.com, hal seperti ini diperbolehkan.
Perijinan apakah website boleh di-load lewat iframe atau tidak, dikontrol lewat header X-Frame-Options.
Di library secure, untuk men-disable ijin akses aplikasi dari dalam iframe, bisa dilakukan cukup dengan mengeset proerty FrameDeny
dengan nilai true
.
Untuk mengetes, silakan buat aplikasi web terpisah yang mer-render sebuah view. Dalam view tersebut siapkan satu buah iframe yang mengarah ke https://localhost:9000/index
.
◉ Konfigurasi CustomFrameOptionsValue
CustomFrameOptionsValue: "SAMEORIGIN"
Jika FrameDeny
di-set sebagai true
, maka semua host (termasuk aplikasi itu sendiri) tidak akan bisa me-load url lewat iframe.
Dengan menambahkan satu buah property lagi yaitu CustomFrameOptionsValue: "SAMEORIGIN"
maka ijin pengaksesan url lewat iframe menjadi eksklusif hanya untuk aplikasi sendiri.
Untuk mengetes, buat rute baru yang me-render sebuah view. Dalam view tersebut siapkan satu buah iframe yang mengarah ke /index
.
◉ Konfigurasi ContentTypeNosniff
ContentTypeNosniff: true
Property ContentTypeNosniff: true
digunakan untuk disable MIME-sniffing yang dilakukan oleh browser IE. Lebih jelasnya silakan baca X-Content-Type-Options.
◉ Konfigurasi BrowserXssFilter
BrowserXssFilter: true
Property di atas digunakan untuk mengaktifkan header X-XSS-Protection, dengan isi header adalah 1; mode=block
.
C.15.3. Property Library Secure
Selain 5 property yang kita telah pelajari di atas, masih ada banyak lagi konfigurasi yang bisa digunakan.
- AllowedHosts
- HostsProxyHeaders
- SSLRedirect
- SSLTemporaryRedirect
- SSLHost
- SSLHostFunc
- SSLProxyHeaders
- STSSeconds
- STSIncludeSubdomains
- STSPreload
- ForceSTSHeader
- FrameDeny
- CustomFrameOptionsValue
- ContentTypeNosniff
- BrowserXssFilter
- CustomBrowserXssValue
- ContentSecurityPolicy
- PublicKey
- ReferrerPolicy
Lebih mendetailnya silakan langsung cek halaman official library secure di https://github.com/unrolled/secure.