Razor görünümünde kodlanmamış dizeler yayma


81

ScottGu onun blog söylediği gibi yazı «Bir @ bloğunu kullanarak yayılan varsayılan içeriği tarafından XSS saldırısı senaryoları karşı daha iyi koruma için otomatik HTML kodlanmış olduğunu». Sorum şu: HTML kodlanmamış bir dizenin çıktısını nasıl alabilirsiniz?

Basitlik adına, lütfen bu basit duruma sadık kalın:

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}

Yanıtlar:



17

MvcHtmlString'in HTML olarak kodlanmayacak yeni bir örneğini oluşturabilirsiniz.

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Umarım Razor'un geleceğinde daha kolay bir yol olacaktır.

MVC kullanmıyorsanız, şunu deneyebilirsiniz:

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}

2
Aslında new HtmlString()bu tür .NET 4 olduğu için MVC 3'te de kullanabilmelisiniz .
marcind

Aslında! Ancak hepsini tek bir ifadede yazarken MVC'yi daha çok seviyorum. Örneğin @ MvcHtmlString.Create (myString). Kişisel tercih!
aolde

6

yeni HtmlString kesinlikle cevaptır.

Diğer bazı jilet sözdizimi değişikliklerini araştırdık, ancak sonuçta hiçbiri yeni HtmlString'den daha kısa olmadı.

Ancak bunu bir yardımcı olarak özetleyebiliriz. Muhtemelen ...

@Html.Literal("<p>something</p>")

veya

@"<p>something</p>".AsHtml()

1
HTML çıktısını almak için @ = myString eklemek mümkün olabilir mi? Belki WebForms'a çok fazla geri dönüş ...
aolde

2
Büyük bir kullanıcı durumunu kapsamadıkları sözdizimi yapıları eklemekten kaçınmak istiyoruz. Çoğu zaman, dizeler oluşturmak için yardımcı yöntemler kullanacaksınız ve IHtmlString burada mükemmel şekilde çalışıyor. Yardımcı olmadan değişmez bir dizge çıktılamanız gereken garip durumlar için, sizin için bir yöntem sağlayabiliriz: @Literal (foo) veya benzeri.
Andrew Stanton-Nurse

0

Projemizi yeni Razor görünüm motoruna geçirirken de bu sorunla karşılaştım. Benim aldığım yaklaşım biraz farklıydı çünkü C # 'dan JSON verisi oluşturmalıydık ve sayfa yüklendikten sonra bu veriyi çıkarmak istiyorduk.

Sonunda yaptığım şey, cshtml dosyalarının içinde View'e paralel bir RawView uygulamaktı. Esasen, ham bir dize elde etmek için,

@(new HtmlString(View.Foo))

// became
@RawView.Foo

Bu, proje düzeninde birkaç değişiklik gerektirir, bu yüzden burada bununla ilgili bir blog yazısı yazdım . Kısacası, bu, MVC'nin DynamicViewDataDictionary ve RawView içeren yeni bir WebViewPage uygulamasının yinelenen bir uygulamasını gerektirdi. Ayrıca devam ettim ve indeks operatörünü RawView'da uyguladım.

@RawView["Foo"]

Şans eseri, birisinin veriler üzerinde bir anahtar listesi ile döngü yapması gerekir.

Anurse'nin yorumunu okurken, bunu RawView yerine Literal olarak adlandırsaydım muhtemelen daha iyi olurdu.


0

Mono altında ASP.NET MVC ve Razor kullanıyorum.

System.Web.Mvc'nin System.Web.WebPages öğesinden HtmlHelper'ı bazı nedenlerle alamadım.

Ancak, modelin özelliğini RazorEngine.Text.RawString. Şimdi beklendiği gibi çıktı.

Misal

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

Çıktı:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.