Mencegah Serangan Injeksi JavaScript (VB)

oleh Stephen Walther

Cegah Serangan Injeksi JavaScript dan Serangan Skrip Lintas Situs terjadi pada Anda. Dalam tutorial ini, Stephen Walther menjelaskan bagaimana Anda dapat dengan mudah mengalahkan jenis serangan ini dengan HTML yang mengodekan 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 untuk 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. Saat pelanggan mengirimkan umpan balik mereka, umpan balik diputar ulang di halaman umpan balik.

Situs Web Umpan Balik Pelanggan

Gambar 01: Situs Web Umpan Balik Pelanggan (Klik untuk melihat gambar ukuran penuh)

Situs web umpan balik pelanggan menggunakan controller dalam Listing 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 antarmuka. 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 tempat semua umpan balik ditampilkan.

Tampilan Index terdapat 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 perulangan For..Each yang mengiterasi semua item umpan balik pelanggan sebelumnya dan menampilkan properti EntryDate dan Message 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 siapa pun mengunjungi situs web umpan balik pelanggan di masa mendatang (lihat Gambar 2).

Injeksi JavaScript

Gambar 02: Injeksi JavaScript (Klik untuk melihat gambar ukuran penuh)

Sekarang, respons awal Anda terhadap serangan injeksi JavaScript mungkin ketidakpedulian. Anda mungkin berpikir bahwa serangan injeksi JavaScript hanyalah jenis serangan perusakan. Anda mungkin percaya bahwa tidak ada yang dapat melakukan sesuatu yang benar-benar jahat dengan melakukan serangan injeksi JavaScript.

Sayangnya, peretas dapat melakukan beberapa hal yang benar-benar jahat dengan menyuntikkan JavaScript ke situs web. Anda dapat menggunakan serangan injeksi JavaScript untuk melakukan serangan Scripting Lintas Situs (XSS). Dalam serangan Pembuatan Skrip 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, kita membahas dua teknik yang dapat Anda gunakan untuk mempertahankan aplikasi MVC ASP.NET Anda dari serangan injeksi JavaScript.

Pendekatan #1: Pengodean HTML dalam Tampilan

Salah satu metode mudah untuk mencegah serangan injeksi JavaScript adalah mengodekan html data apa pun yang dimasukkan oleh pengguna situs web saat Anda memutar ulang data dalam tampilan. Tampilan yang diperbarui Index dalam 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 meng-enkode string dalam HTML? Saat Anda mengodekan string HTML, karakter berbahaya seperti < dan > digantikan oleh referensi entitas HTML seperti &lt; dan &gt;. Jadi ketika string <script>alert("Boo!")</script> dikodekan HTML, string akan dikonversi ke &lt;script&gt;alert(&quot;Boo!&quot;)&lt;/script&gt;. String yang dikodekan tidak lagi dijalankan sebagai skrip JavaScript saat ditafsirkan oleh browser. Sebagai gantinya, Anda mendapatkan halaman yang tidak berbahaya di Gambar 3.

Serangan JavaScript yang Dikalahkan

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 dienkripsi. 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

Daripada mengodekan data ke HTML ketika Anda menampilkannya dalam tampilan, Anda dapat mengodekan data ke HTML sebelum Anda menyimpannya 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 memilih pendekatan pertama yang dibahas dalam tutorial ini dibandingkan dengan pendekatan kedua. Masalah dengan pendekatan kedua ini adalah Anda berakhir dengan data yang dikodekan HTML di database Anda. Dengan kata lain, data di database Anda dikotori dengan karakter aneh.

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 Windows Forms.

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 data yang dikirim pengguna HTML dalam tampilan atau Anda dapat mengodekan HTML yang dikirimkan pengguna data di pengontrol.