JsonRequestBehavior'ı AllowGet olarak ayarlarken hangi 'hassas bilgiler' ifşa edilebilir?


112

URLTarayıcımın adres çubuğundan bir yenisini her test ettiğimde aynı eski hatayı alıyorum returning Json(yerleşikMVC JsonResult helper ) :

Bu istek engellendi çünkü hassas bilgiler, bir GET request. İzin vermek için GET requests, set JsonRequestBehavioriçinAllowGet .

Alındığında homurdanmak ve Fiddler'ı bir gönderi isteği yapmak için ateşlemek yerine, bu sefer, bir GETisteğin tam olarak ne olduğunu merak ediyorum, bir isteğin göstermediğini açığa çıkarır POSTmı?

Yanıtlar:


82

Web sitenizin bir GetUserweb yöntemi olduğunu varsayalım:

http://www.example.com/User/GetUser/32

bir JSON yanıtı döndürür:

{ "Name": "John Doe" }

Bu yöntem yalnızca POST isteklerini kabul ederse, içerik yalnızca http://www.example.com/User/GetUser/32POST yöntemi kullanılarak bir AJAX isteği yapılırsa tarayıcıya döndürülür . CORS uygulamadıysanız , tarayıcının verileri sizinkine bu isteği yapan diğer etki alanlarından koruyacağını unutmayın.

Bununla birlikte, GET isteklerine izin verdiyseniz ve POST yerine GET ile yukarıdakine benzer bir AJAX isteğinde bulunduysanız, kötü niyetli bir kullanıcı scriptHTML'de bir etiket kullanarak JSON'nuzu kendi sitelerinin bağlamına dahil edebilir . örneğin www.evil.com:

<script src="http://www.example.com/User/GetUser/32"></script>

Bu JavaScript www.evil.com, web yönteminizin döndürdüğü nesneyi okumanın bir yolu olmaması gerektiğinden işe yaramaz olmalıdır. Ancak, tarayıcıların eski sürümlerindeki hatalar nedeniyle (örn. Firefox 3), JavaScript prototip nesnelerinin yeniden tanımlanması ve www.evil.comyönteminizin döndürdüğü verilerinizin okunmasını mümkün kılması mümkündür . Bu, JSON Hijacking olarak bilinir.

Bunu önlemenin bazı yöntemleri için bu gönderiye bakın . Ancak, modern tarayıcıların (Firefox, Chrome, IE) sonraki sürümlerinde bilinen bir sorun değildir.


25
Güzel gönderi, ancak denetleyiciye bir [Authorize] etiketi eklerseniz güvenlik konusunda endişelenmenize gerek yoktur. Umarım bu kod birisine yardımcı olur Json (returnMsg, JsonRequestBehavior.AllowGet)
Dhanuka777

17
@ Dhanuka777: Maalesef doğru değil. CSRF saldırıları, yöntemin yan etkileri varsa (örn. www.example.com/User/DeleteUser/32), İstek kurbanın makinesinden geldiklerinden kimlik doğrulama için gerekli çerezleri içereceğinden mümkün olabilir . [Authorize]olmaz kurtarmayacaksa ya çok eski bir tarayıcı diye burada ayrıntılı saldırıdan - bu kendilerini ziyaret kullanıcı www.evil.comisteği öylesine www.evil.comkolaylaştırır www.example.comyetkilendirme çerez içerecektir.
SilverlightFox

1
Eylemin herhangi bir yan etkisi varsa, asla GET yöntemi kullanılarak çalıştırılmamalıdır - kural, GET'i yalnızca verileri okumak için kullanmaktır ve tüm yan etkili işlemler POST, PUT, DELETE, vb. Kullanmalıdır. Başka bir deyişle, I sadece bu 'hassas bilgi' hata mesajının yanıltıcı olduğunu düşünün. Geliştirici GET yöntemini kullanılması gerektiği şekilde kullanırsa, her şey yolunda demektir! :)
ps_ttf

1
Hala ne fark yarattığından emin değilim. Gönderi gibi değil, almaktan daha korumalı veya şifreli değil. Hala sadece düz metindir. Herhangi bir araçla gönderi yapmak kadar kolay bir şekilde istek gönderebilir ve yine de aynı düz metin bilgilerini geri alabilirim. Kötü niyetli bir kullanıcı, bir gönderi yapmak için herhangi bir sunucu tarafı kodunu kendi sitesinde de kolayca yazabilir.
computrius

1
@Castrohenge: Hayır, çünkü bu, src komut dosyası için GET isteği ile gönderilmeyecek bir başlığın ayarlanmasını gerektirir.
SilverlightFox

111

dönüşünüzde aşağıdakileri kullanın:

return this.Json("you result", JsonRequestBehavior.AllowGet);

7
Bu aslında OP sorusuna nasıl cevap veriyor? Bütün bu cevap herkese istisnayı nasıl
aşacağını anlatmaktır

2
Evet kullan .. Boş bir yakalamayla yakalamaya çalışmak gibi. Bu adamları KULLANMAYIN (riskleri anlamadan önce). -1'd
sotn

6
En azından sonuçlarını açıklamadan insanlara bir güvenlik uyarısını görmezden gelmelerini söylemek sorumsuzluktur. -1
Eduardo Wada

58

Varsayılan olarak, ASP.NET MVC çerçevesi, kötü niyetli bir kullanıcının JSON Hijacking olarak bilinen bir işlem aracılığıyla yüke erişme şansı olduğundan, bir GET isteğine bir JSON yükü ile yanıt vermenize izin vermez. Bir GET isteğinde JSON kullanarak hassas bilgileri döndürmek istemezsiniz.

Bir GET'e yanıt olarak JSON göndermeniz gerekiyorsa ve hassas verileri ifşa etmiyorsanız, davranışa JsonRequestBehavior.AllowGetikinci bir parametre olarak ileterek açıkça izin verebilirsiniz .Json yönteme .

Gibi

  [HttpGet] //No need to decorate, as by default it will be GET
  public JsonResult GetMyData(){  
    var myResultDataObject = buildMyData(); // build, but keep controller thin
    // delegating buildMyData to builder/Query Builder using CQRS makes easy :)
    return Json(myResultDataObject, JsonRequestBehavior.AllowGet);
  }

İşte Phil Haack'tan Json'u JSON Hijackingneden GET yöntemiyle kullanmama konusunda ilginç bir makale.


2
Harika gönderi. HTTPS kullanmanız için iyi bir neden.
pqsk

6
HTTPS'nin burada yardımcı olduğunu sanmıyorum.
Sean McMillan

10

MVC uygulamasından istemciye bir json nesnesi döndürmek istediğimizde, bir nesne döndürürken JsonRequestBehavior.AllowGet öğesini açıkça belirtmeliyiz. Sonuç olarak, sorunun üstesinden gelmek için json verilerini aşağıdaki gibi döndürüyorum:

    return Json(yourObjectData, JsonRequestBehavior.AllowGet);

7

Json Yanıtı için JsonRequestBehavior.AllowGet'i şu şekilde kullanmanız gerekir:

return Json(YourObject, JsonRequestBehavior.AllowGet);

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.