İş yerinde geliştirmekte olduğumuz projelerde şimdiye kadar MVC Framework Preview 3 kullanmaktaydık. ASP.NET ten farklı çalışma mekanizması nedeniyle yukardaki hatayı sık sık alır ve ValidateRequest = false yapmamıza rağmen sorunu aşamazdık. Çünkü post edilen bilgi önce kontroller a düşmekte ve exception oluşmaktaydı.
Peki temel olarak bu hatanın nedei neydi. Önce bunu bir hatırlayalım.
ASP.NET kullanan yazılımcılar form alanlarından gelebilecek zararlı kodlara karşı daha fazla korunmaya sahiptirler. Yapılabilecek XSS (Cross site script) saldırılarını önlemek yapılan tüm istekler bir geçerlilik kontrolü (validation) işleminden geçer. Bu işlemde temel olarak script bloklarını başlatan ve bitiren taglerde yer alan < ve > işaretleri aranır. Bulunduğu zaman da “System.Web.HttpRequestValidationException” oluşturulur.
Bu sorunu geçiştirmek için sayfa seviyesinde ya da uygulama seviyesinde (ki bu hiç mi hiç tavsiye edilmez.) Geçerlilik kontrolünü kapatabilirsiniz. Bu durumda dış kaynaklardan gelen tüm girdileri zararlı olabilecek metinlere, karakterlere karşı kontrol etmeniz ve filtrelemeniz gerekmektedir.
Bizim durumumuzda ise hiçbir şekilde bu geçerlilik kontrolü geçiştirilememekteydi. Ta ki MVC 1.0 çıkana kadar. Aslında bu özellik Preview 4 ile birlikte gelmesine rağmen biz 3 den direkt olarak MVC 1.0 a atladığımızdan burada farkına varabildik.
Bu yenilik sayesinde controller class tanımımız ya da herhangi bir controller action metod tanımımız için “istek geçerlilik kontrolü”nü devre dışı bırakabiliyoruz.
Şöyle ki:
[ValidateInput(false)]
Bu öznitelik (attribute) sayesinde konulduğu yere göre ilgili controller sınıfının tüm metodları ya da sadece belirli action metodları için bu özellik iptal edilebilmekte.
sınıf Seviyesinde kullanım
[ValidateInput(false)]
public class BilgilerController : Controller
{}
Controller Action seviyesinde kullanım
[ValidateInput(false)]
public class BilgilerController : Controller
{
return View("abc");
}
Böylece ilgili sayfalarda HTML kod kabul eden editör vb. kontroller kullanabiliyoruz. Tabi tekrar hatırlatalım. Bu durumda gelen içeriğin güvenli olup olmadığının denetlenmesi ya da filtrelenmesi yazılımcı tarafından gerçekleştirilmek zorunda…
Kolay gelsin…