Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Stephen Walther
JavaScript Ekleme Saldırılarının ve Siteler Arası Betik Saldırılarının size gerçekleşmesini önleyin. Bu öğreticide Stephen Walther, içeriğinizi HTML kodlama yoluyla bu tür saldırıları nasıl kolayca yenebileceğinizi açıklamaktadır.
Bu öğreticinin amacı, ASP.NET MVC uygulamalarınızda JavaScript ekleme saldırılarını nasıl önleyebileceğinizi açıklamaktır. Bu öğreticide web sitenizi JavaScript ekleme saldırısına karşı savunmaya yönelik iki yaklaşım ele alınmaktadır. Görüntülediğiniz verileri kodlayarak JavaScript ekleme saldırılarını önlemeyi öğrenirsiniz. Ayrıca kabul ettiğiniz verileri kodlayarak JavaScript ekleme saldırılarını önlemeyi de öğrenirsiniz.
JavaScript Ekleme Saldırısı nedir?
Kullanıcı girişini kabul edip kullanıcı girişini yeniden dağıtdığınızda, web sitenizi JavaScript ekleme saldırılarına açarsınız. Şimdi JavaScript ekleme saldırılarına açık somut bir uygulamayı inceleyelim.
Bir müşteri geri bildirim web sitesi oluşturduğunuzu düşünün (bkz. Şekil 1). Müşteriler web sitesini ziyaret edebilir ve ürünlerinizi kullanarak deneyimleriyle ilgili geri bildirim girebilir. Bir müşteri geri bildirim gönderdiğinde geri bildirim, geri bildirim sayfasında yeniden görüntülenir.
Şekil 01: Müşteri Geri Bildirim Web Sitesi (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Müşteri geri bildirimi web sitesi, Liste 1'deki öğesini controller kullanır. Bucontroller, ve Create()adlı Index() iki eylem içerir.
Listeleme 1 – HomeController.cs
using System;
using System.Web.Mvc;
using CustomerFeedback.Models;
namespace CustomerFeedback.Controllers
{
[HandleError]
public class HomeController : Controller
{
private FeedbackDataContext db = new FeedbackDataContext();
public ActionResult Index()
{
return View(db.Feedbacks);
}
public ActionResult Create(string message)
{
// Add feedback
var newFeedback = new Feedback();
newFeedback.Message = message;
newFeedback.EntryDate = DateTime.Now;
db.Feedbacks.InsertOnSubmit(newFeedback);
db.SubmitChanges();
// Redirect
return RedirectToAction("Index");
}
}
}
Index() yöntemi görünümü görüntülerIndex. Bu yöntem, geri bildirimi veritabanından Index alarak önceki tüm müşteri geri bildirimlerini görünüme geçirir (LINQ to SQL sorgu kullanarak).
Create() yöntemi yeni bir Geri Bildirim öğesi oluşturur ve bunu veritabanına ekler. Müşterinin forma girdiği ileti, ileti parametresindeki Create() yöntemine geçirilir. Bir Geri Bildirim öğesi oluşturulur ve ileti Geri Bildirim öğesinin Message özelliğine atanır. Geri Bildirim öğesi yöntem çağrısıyla DataContext.SubmitChanges() veritabanına gönderilir. Son olarak, ziyaretçi tüm geri bildirimlerin Index görüntülendiği görünüme geri yönlendirilir.
Görünüm Index , Liste 2'de yer alır.
Liste 2 – Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="CustomerFeedback.Views.Home.Index"%>
<%@ Import Namespace="CustomerFeedback.Models" %>
<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>
<% foreach (Feedback feedback in ViewData.Model)
{%>
<p>
<%=feedback.EntryDate.ToShortTimeString()%>
--
<%=feedback.Message%>
</p>
<% }%>
</asp:Content>
Görünümün Index iki bölümü vardır. En üstteki bölüm gerçek müşteri geri bildirim formunu içerir. Alt bölümde For.. Önceki tüm müşteri geri bildirim öğelerinde döngü oluşturan ve her geri bildirim öğesi için EntryDate ve Message özelliklerini görüntüleyen her döngü.
Müşteri geri bildirimi web sitesi basit bir web sitesidir. Ne yazık ki web sitesi JavaScript ekleme saldırılarına açıktır.
Müşteri geri bildirim formuna aşağıdaki metni girdiğinizi düşünün:
<script>alert("Boo!")</script>
Bu metin, bir uyarı ileti kutusu görüntüleyen bir JavaScript betiğini temsil eder. Birisi bu betiği geri bildirim formuna gönderdikten sonra Boo!gelecekte müşteri geri bildirim web sitesini ziyaret eden herkes tarafından görüntülenir (bkz. Şekil 2).
Şekil 02: JavaScript Ekleme (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Artık JavaScript ekleme saldırılarına ilk yanıtınız ilgisizlik olabilir. JavaScript ekleme saldırılarının yalnızca bir tür yıkıcı saldırı olduğunu düşünebilirsiniz. JavaScript ekleme saldırısı gerçekleştirerek kimsenin gerçekten kötü bir şey yapabileceğinden emin olabilirsiniz.
Ne yazık ki, bir bilgisayar korsanı bir web sitesine JavaScript ekleyerek gerçekten kötü şeyler yapabilir. Siteler Arası Betik Oluşturma (XSS) saldırısı gerçekleştirmek için JavaScript ekleme saldırısı kullanabilirsiniz. Siteler Arası Betik saldırısında gizli kullanıcı bilgilerini çalar ve bilgileri başka bir web sitesine gönderirsiniz.
Örneğin, bir bilgisayar korsanı diğer kullanıcılardan tarayıcı tanımlama bilgilerinin değerlerini çalmak için JavaScript ekleme saldırısı kullanabilir. Parolalar, kredi kartı numaraları veya sosyal güvenlik numaraları gibi hassas bilgiler tarayıcı tanımlama bilgilerinde depolanıyorsa, bilgisayar korsanı bu bilgileri çalmak için JavaScript ekleme saldırısı kullanabilir. Öte yandan, bir kullanıcı JavaScript saldırısıyla ele geçirilen bir sayfada bulunan form alanına hassas bilgiler girerse, bilgisayar korsanı eklenen JavaScript'i kullanarak form verilerini alabilir ve başka bir web sitesine gönderebilir.
Lütfen kork. JavaScript ekleme saldırılarını ciddiye alın ve kullanıcınızın gizli bilgilerini koruyun. Sonraki iki bölümde, ASP.NET MVC uygulamalarınızı JavaScript ekleme saldırılarına karşı savunmak için kullanabileceğiniz iki tekniği ele aacağız.
Yaklaşım 1: Görünümde HTML Kodlaması
JavaScript ekleme saldırılarını önlemenin kolay yöntemlerinden biri, verileri bir görünümde yeniden dağıttığınızda web sitesi kullanıcıları tarafından girilen tüm verileri HTML ile kodlamaktır. Liste 3'teki güncelleştirilmiş Index görünüm bu yaklaşımı izler.
Listeleme 3 – Index.aspx (HTML Kodlanmış)
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="CustomerFeedback.Views.Home.Index"%>
<%@ Import Namespace="CustomerFeedback.Models" %>
<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>
<% foreach (Feedback feedback in ViewData.Model)
{%>
<p>
<%=feedback.EntryDate.ToShortTimeString()%>
--
<%=Html.Encode(feedback.Message)%>
</p>
<% }%>
</asp:Content>
değerinin, değeri feedback.Message aşağıdaki kodla görüntülenmeden önce HTML kodlanmış olduğuna dikkat edin:
<%=Html.Encode(feedback.Message)%>
Html'nin bir dizeyi kodlaması ne anlama gelir? BIR dizeyi HTML ile kodladığınızda ve gibi <> tehlikeli karakterler ve >gibi < HTML varlık başvuruları ile değiştirilir. Bu nedenle, dize <script>alert("Boo!")</script> HTML kodlamalı olduğunda öğesine dönüştürülür <script>alert("Boo!")</script>. Kodlanmış dize artık bir tarayıcı tarafından yorumlandığında JavaScript betiği olarak yürütülür. Bunun yerine, Şekil 3'teki zararsız sayfayı alırsınız.
Şekil 03: Yenilen JavaScript Saldırısı (Tam boyutlu görüntüyü görüntülemek için tıklayın)
Liste 3'teki Index görünümde yalnızca değerinin feedback.Message kodlanmış olduğuna dikkat edin. değeri feedback.EntryDate kodlanmaz. Yalnızca bir kullanıcı tarafından girilen verileri kodlamanız gerekir. Denetleyicide EntryDate değeri oluşturulduğundan, bu değeri HTML kodlamanız gerekmez.
Yaklaşım 2: Denetleyicide HTML Kodlaması
Verileri bir görünümde görüntülediğinizde HTML kodlama verileri yerine, verileri veritabanına göndermeden hemen önce HTML kodlaması yapabilirsiniz. Bu ikinci yaklaşım, Liste 4'teki durumunda controller ele alınmıştır.
Listeleme 4 – HomeController.cs (HTML Kodlanmış)
using System;
using System.Web.Mvc;
using CustomerFeedback.Models;
namespace CustomerFeedback.Controllers
{
[HandleError]
public class HomeController : Controller
{
private FeedbackDataContext db = new FeedbackDataContext();
public ActionResult Index()
{
return View(db.Feedbacks);
}
public ActionResult Create(string message)
{
// Add feedback
var newFeedback = new Feedback();
newFeedback.Message = Server.HtmlEncode(message);
newFeedback.EntryDate = DateTime.Now;
db.Feedbacks.InsertOnSubmit(newFeedback);
db.SubmitChanges();
// Redirect
return RedirectToAction("Index");
}
}
}
İleti değerinin, eylem içindeki Create() veritabanına gönderilmeden önce HTML kodlanmış olduğuna dikkat edin. İleti görünümde yeniden görüntülendiğinde, İleti HTML kodludur ve İletiye eklenen JavaScript yürütülemez.
Genellikle, bu öğreticide ele alınan ilk yaklaşımı bu ikinci yaklaşıma tercih etmelisiniz. Bu ikinci yaklaşımdaki sorun, veritabanınızda HTML kodlanmış verileriyle sonuçlanıyor olmanızdır. Başka bir deyişle, veritabanı verileriniz komik görünümlü karakterlerle kirlenmiştir.
Bu neden kötü? Veritabanı verilerini web sayfası dışında bir şeyde görüntülemeniz gerekirse, sorunlarla karşılaşırsınız. Örneğin, verileri artık Windows Forms bir uygulamada kolayca görüntüleyebilirsiniz.
Özet
Bu öğreticinin amacı, javascript ekleme saldırısı olasılığı hakkında sizi korkutmaktı. Bu öğreticide, ASP.NET MVC uygulamalarınızı JavaScript ekleme saldırılarına karşı savunmaya yönelik iki yaklaşım ele alınmıştı: Görünümde kullanıcı tarafından gönderilen verileri HTML olarak kodlayabilir veya kullanıcı tarafından gönderilen verileri denetleyicide HTML ile kodlayabilirsiniz.