Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Stephen Walther
Cegah Serangan Injeksi JavaScript dan Serangan Scripting Lintas Situs terjadi pada Anda. Dalam tutorial ini, Stephen Walther menjelaskan bagaimana Anda dapat dengan mudah mengalahkan jenis serangan ini dengan mengodekan HTML konten Anda.
Tujuan dari tutorial ini adalah untuk menjelaskan bagaimana Anda dapat mencegah serangan injeksi JavaScript di aplikasi MVC ASP.NET Anda. Tutorial ini membahas dua pendekatan untuk mempertahankan situs web Anda terhadap serangan injeksi JavaScript. Anda mempelajari cara mencegah serangan injeksi JavaScript dengan mengodekan data yang Anda tampilkan. Anda juga mempelajari cara mencegah serangan injeksi JavaScript dengan mengodekan data yang Anda terima.
Apa itu Serangan Injeksi JavaScript?
Setiap kali Anda menerima input pengguna dan memutar ulang input pengguna, Anda membuka situs web Anda ke serangan injeksi JavaScript. Mari kita periksa aplikasi konkret yang terbuka untuk serangan injeksi JavaScript.
Bayangkan Anda telah membuat situs web umpan balik pelanggan (lihat Gambar 1). Pelanggan dapat mengunjungi situs web dan memasukkan umpan balik tentang pengalaman mereka menggunakan produk Anda. Ketika pelanggan mengirimkan umpan balik mereka, umpan balik diputar ulang di halaman umpan balik.
Gambar 01: Situs Web Umpan Balik Pelanggan (Klik untuk melihat gambar ukuran penuh)
Situs web umpan balik pelanggan menggunakan controller di Daftar 1. Ini controller berisi dua tindakan bernama Index() dan Create().
Daftar 1 – HomeController.vb
Public Class HomeController
Inherits System.Web.Mvc.Controller
Private db As New FeedbackDataContext()
Function Index()
Return View(db.Feedbacks)
End Function
Function Create(ByVal message As String)
' Add feedback
Dim newFeedback As New Feedback()
newFeedback.Message = Server.HtmlEncode(message)
newFeedback.EntryDate = DateTime.Now
db.Feedbacks.InsertOnSubmit(newFeedback)
db.SubmitChanges()
' Redirect
Return RedirectToAction("Index")
End Function
End Class
Metode Index() menampilkan Index tampilan. Metode ini meneruskan semua umpan balik pelanggan sebelumnya ke Index tampilan dengan mengambil umpan balik dari database (menggunakan LINQ ke kueri SQL).
Metode ini Create() membuat item Umpan Balik baru dan menambahkannya ke database. Pesan yang dimasukkan pelanggan dalam formulir diteruskan ke Create() metode dalam parameter pesan. Item Umpan Balik dibuat dan pesan ditetapkan ke properti item Message Umpan Balik. Item Umpan Balik dikirimkan ke database dengan DataContext.SubmitChanges() panggilan metode . Akhirnya, pengunjung dialihkan kembali ke Index tampilan di mana semua umpan balik ditampilkan.
Tampilan Index terkandung dalam Daftar 2.
Daftar 2 – Index.aspx
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="CustomerFeedback.Index"%>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<h1>Customer Feedback</h1>
<p>
Please use the following form to enter feedback about our product.
</p>
<form method="post" action="/Home/Create">
<label for="message">Message:</label>
<br />
<textarea name="message" cols="50" rows="2"></textarea>
<br /><br />
<input type="submit" value="Submit Feedback" />
</form>
<% For Each feedback As CustomerFeedback.Feedback In ViewData.Model%>
<p>
<%=feedback.EntryDate.ToShortTimeString()%>
--
<%=feedback.Message%>
</p>
<% Next %>
</asp:Content>
Tampilan Index memiliki dua bagian. Bagian atas berisi formulir umpan balik pelanggan yang sebenarnya. Bagian bawah berisi For.. Setiap perulangan yang mengulang semua item umpan balik pelanggan sebelumnya dan menampilkan properti EntryDate dan Pesan untuk setiap item umpan balik.
Situs web umpan balik pelanggan adalah situs web sederhana. Sayangnya, situs web terbuka untuk serangan injeksi JavaScript.
Bayangkan Anda memasukkan teks berikut ke dalam formulir umpan balik pelanggan:
<script>alert("Boo!")</script>
Teks ini mewakili skrip JavaScript yang menampilkan kotak pesan pemberitahuan. Setelah seseorang mengirimkan skrip ini ke dalam formulir umpan balik, pesan Boo!akan muncul setiap kali ada yang mengunjungi situs web umpan balik pelanggan di masa mendatang (lihat Gambar 2).
Gambar 02: JavaScript Injection (Klik untuk melihat gambar ukuran penuh)
Sekarang, respons awal Anda terhadap serangan injeksi JavaScript mungkin apatis. Anda mungkin berpikir bahwa serangan injeksi JavaScript hanyalah jenis serangan defacement . Anda mungkin percaya bahwa tidak ada yang dapat melakukan sesuatu yang benar-benar jahat dengan melakukan serangan injeksi JavaScript.
Sayangnya, seorang peretas dapat melakukan beberapa hal yang benar-benar jahat dengan menyuntikkan JavaScript ke situs web. Anda dapat menggunakan serangan injeksi JavaScript untuk melakukan serangan Cross-Site Scripting (XSS). Dalam serangan Scripting Lintas Situs, Anda mencuri informasi pengguna rahasia dan mengirim informasi ke situs web lain.
Misalnya, peretas dapat menggunakan serangan injeksi JavaScript untuk mencuri nilai cookie browser dari pengguna lain. Jika informasi sensitif -- seperti kata sandi, nomor kartu kredit, atau nomor jaminan sosial - disimpan di cookie browser, maka peretas dapat menggunakan serangan injeksi JavaScript untuk mencuri informasi ini. Atau, jika pengguna memasukkan informasi sensitif dalam bidang formulir yang terkandung dalam halaman yang telah disusupi dengan serangan JavaScript, maka peretas dapat menggunakan JavaScript yang disuntikkan untuk mengambil data formulir dan mengirimkannya ke situs web lain.
Harap takut. Lakukan serangan injeksi JavaScript dengan serius dan lindungi informasi rahasia pengguna Anda. Di dua bagian berikutnya, kami membahas dua teknik yang dapat Anda gunakan untuk mempertahankan aplikasi MVC ASP.NET Anda dari serangan injeksi JavaScript.
Pendekatan #1: Pengodean HTML di Tampilan
Salah satu metode mudah untuk mencegah serangan injeksi JavaScript adalah mengodekan data apa pun yang dimasukkan oleh pengguna situs web saat Anda memutar ulang data dalam tampilan. Tampilan yang diperbarui Index di Daftar 3 mengikuti pendekatan ini.
Daftar 3 – Index.aspx (Dikodekan HTML)
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="false" CodeBehind="Index.aspx.vb" Inherits="CustomerFeedback.Index"%>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<h1>Customer Feedback</h1>
<p>
Please use the following form to enter feedback about our product.
</p>
<form method="post" action="/Home/Create">
<label for="message">Message:</label>
<br />
<textarea name="message" cols="50" rows="2"></textarea>
<br /><br />
<input type="submit" value="Submit Feedback" />
</form>
<% For Each feedback As CustomerFeedback.Feedback In ViewData.Model%>
<p>
<%=feedback.EntryDate.ToShortTimeString()%>
--
<%=Html.Encode(feedback.Message)%>
</p>
<% Next %>
</asp:Content>
Perhatikan bahwa nilai feedback.Message html dikodekan sebelum nilai ditampilkan dengan kode berikut:
<%=Html.Encode(feedback.Message)%>
Apa artinya html mengodekan string? Saat Anda mengodekan STRING HTML, karakter berbahaya seperti < dan > digantikan oleh referensi entitas HTML seperti < dan >. Jadi ketika string <script>alert("Boo!")</script> dikodekan HTML, string akan dikonversi ke <script>alert("Boo!")</script>. String yang dikodekan tidak lagi dijalankan sebagai skrip JavaScript saat ditafsirkan oleh browser. Sebagai gantinya, Anda mendapatkan halaman yang tidak berbahaya di Gambar 3.
Gambar 03: Serangan JavaScript yang Dikalahkan (Klik untuk melihat gambar ukuran penuh)
Perhatikan bahwa dalam Index tampilan di Daftar 3 hanya nilai feedback.Message yang dikodekan. Nilai feedback.EntryDate tidak dikodekan. Anda hanya perlu mengodekan data yang dimasukkan oleh pengguna. Karena nilai EntryDate dihasilkan di pengontrol, Anda tidak perlu mengodekan html nilai ini.
Pendekatan #2: Pengodean HTML di Pengontrol
Alih-alih data pengodean HTML saat Anda menampilkan data dalam tampilan, Anda dapat mengodekan data HTML tepat sebelum Anda mengirimkan data ke database. Pendekatan kedua ini diambil dalam kasus controller dalam Daftar 4.
Daftar 4 – HomeController.cs (Dikodekan HTML)
Public Class HomeController
Inherits System.Web.Mvc.Controller
Private db As New FeedbackDataContext()
Function Index()
Return View(db.Feedbacks)
End Function
Function Create(ByVal message As String)
' Add feedback
Dim newFeedback As New Feedback()
newFeedback.Message = Server.HtmlEncode(message)
newFeedback.EntryDate = DateTime.Now
db.Feedbacks.InsertOnSubmit(newFeedback)
db.SubmitChanges()
' Redirect
Return RedirectToAction("Index")
End Function
End Class
Perhatikan bahwa nilai Pesan dikodekan HTML sebelum nilai dikirimkan ke database dalam Create() tindakan. Ketika Pesan diputar ulang dalam tampilan, Pesan dikodekan HTML dan JavaScript apa pun yang disuntikkan dalam Pesan tidak dijalankan.
Biasanya, Anda harus mendukung pendekatan pertama yang dibahas dalam tutorial ini melalui pendekatan kedua ini. Masalah dengan pendekatan kedua ini adalah Anda berakhir dengan data yang dikodekan HTML di database Anda. Dengan kata lain, data database Anda terganggu dengan karakter yang tampak lucu.
Mengapa ini buruk? Jika Anda perlu menampilkan data database dalam sesuatu selain halaman web, maka Anda akan mengalami masalah. Misalnya, Anda tidak dapat lagi dengan mudah menampilkan data dalam aplikasi Formulir Windows.
Ringkasan
Tujuan dari tutorial ini adalah untuk menakut-nakuti Anda tentang prospek serangan injeksi JavaScript. Tutorial ini membahas dua pendekatan untuk mempertahankan aplikasi MVC ASP.NET Anda terhadap serangan injeksi JavaScript: Anda dapat mengodekan HTML yang dikirimkan pengguna data dalam tampilan atau Anda dapat mengodekan HTML yang dikirimkan pengguna data di pengontrol.