Removendo validação de input de método no ASP.NET MVC4

Quando trabalhamos com ASP.NET MVC4 os submit de formulários são automaticamente tratados pelos Framework para evitar code injection.

Porem em alguns casos queremos ser capazes de submeter diretamente código HTML ou outros tipos de textos. No código em exemplo, estou mostrando a maneira como montei para gravar uma assinatura de e-mail em formato HTML.

Em muitos tutorias na internet é recomendado que se altere o web-config, eu não gosto desta abordagem pois não quero alterar o comportamento de toda a minha aplicação, somente um método em particular.

Para isso tenho o exemplo abaixo. Neste caso, sempre uso o [HttpPost] para evitar de o usuário ficar enviando diversas requisições via GET.

public class Perfil{
	[HttpPost]
    [ValidateInput(false)]
    public ActionResult Assinatura(string assinatura, int codigoUsuario)
    {
    	try{
    		if (SalvarNovaAssinaturaDeEmail(assinatura, codigoUsuario))
	        {
	            return RedirectToAction("Index");
	        }
	        else
	        {
	            throw new Exception("Não foi possivel salvar a assinatura");
	        }
    	}catch(Exception ex){
    		//Logica em caso de erro aqui
    		throw ex;
    	}
    }
    public bool SalvarNovaAssinaturaDeEmail(string assinatura, int codigoUsuario){
    	//Logica do metodo
    	return true;
    }
}

Algo que pode acontecer quando é salvo código HTML no banco de dados é no momento em que o recuperamos e tentamos usa-lo na view, ele não é diretamente embutido no código, ele é primeiro transformado em uma string, e esta é então exibida na tela.

Para evitar este comportamento do ASP.NET MVC4 podemos fazer uso do seguinte recurso.

@if (!string.IsNullOrWhiteSpace(Model.Assinatura))
{
    <div id="visualiza-assinatura">
        @Html.Raw(Model.Assinatura)
    </div>
}

Novamente, dicas e sugestões do código, fique a vontade para comentar.

Leave a Reply

Your email address will not be published. Required fields are marked *