Arquivo

Posts Tagged ‘mvc’

jQuery DataTables obtendo dados no Api Controller com ASP NET MVC

Conhecimentos necessários:

* Ter conhecimento prévio de como funciona o data tables.

* Referenciar scripts e css necessários.

Página oficial jQuery Data Tables

grid jquery data tables

Grid do jQuery DataTables

Etapas:

  • Criar método para retornar os dados para o jquery data tables no seu controller. A assinatura do método é a seguinte.
  • Código no lado do servidor:
public class DataController : ApiController
{
public dynamic GetJdt(int sEcho,
int iDisplayStart,
int iDisplayLength,
string sSearch,
int iSortCol_0,
string sSortDir_0)
{
// Utilizando LINQ para fazer a consulta em uma Session do NHibernate</pre>
var consulta = sessao.Query<Objeto>().AsQueryable();

 // Seta os termos da busca
 if (!String.IsNullOrEmpty(sSearch))
 {
 consulta =
 consulta.Where(
 wh =>
 wh.Coluna1.ToLower().Contains(sSearch.ToLower()));

 }

// Total de registros para cálculo de paginação
 var quantidadeRegistrosSemFiltro = consulta.Count();

// Ordenação
 string colunaOrdenacao = "Id";
 switch (iSortCol_0)
 {
 case 0:
 colunaOrdenacao = "Id";
 break;
 case 1:
 colunaOrdenacao = "Coluna1";
 break;
 case 2:
 colunaOrdenacao = "Coluna2";
 break;
 case 3:
 colunaOrdenacao = "Coluna3";
 break;
 case 4:
 colunaOrdenacao = "Coluna4";
 break;
 case 5:
 colunaOrdenacao = "Coluna5";
 break;
 }

consulta = consulta.OrderByField(colunaOrdenacao, sSortDir_0 == "asc");
// Aqui eu usei um método de extensão para converter strings em uma expression linq:

//<a href="http://ronniediaz.com/2011/05/24/orderby-string-in-linq-c-net-dynamic-sorting-of-anonymous-types/">http://ronniediaz.com/2011/05/24/orderby-string-in-linq-c-net-dynamic-sorting-of-anonymous-types/</a>

// Adiciona paginação e já faz uma projeção dos dados através do select
 var resultadoConsulta = consulta.Skip(iDisplayStart).Take(iDisplayLength).Select(
 sel =>
 new
 {
 Id = sel.Id,
 Coluna1 = sel.Coluna1,
 Coluna2 = sel.Coluna2,
 Coluna3 = sel.Coluna3,
 Coluna4 = sel.Coluna4,
 Coluna5 = sel.Coluna5
 }
 ).ToArray();

var quantidadeTotalRegistrosAposPaginacao = resultadoConsulta.Count();

// pega o retorno e coloca em uma variável
var retorno = new
 {
 sEcho = sEcho,
 iTotalRecords = quantidadeRegistrosSemFiltro,
 iTotalDisplayRecords = quantidadeTotalRegistrosAposPaginacao,
 aaData = resultadoConsulta
 };

// retorna o objeto que é automaticamente convertido para JSON pelo API controller
return retorno;
}

}
  • Código no lado do cliente:
<script type="text/javascript">// <![CDATA[
 $(document).ready(function(){
 $('.dataTable').dataTable({
 "bJQueryUI": true,
 "bProcessing": true,
 "bServerSide": true,
 "sAjaxSource": "/api/produtos/getjdt",
 "aoColumns": [
 { "mDataProp": "Coluna1" },
 { "mDataProp": "Coluna2" },
 { "mDataProp": "Coluna3" },
 { "mDataProp": "Coluna4" },
 { "mDataProp": "Coluna5"}
 ]
 });
 });

// ]]></script>

Dessa forma o jQuery Data Table vai carregar os dados dinamicamente, com AJAX.

Importante:

  • Número de colunas da tabela deve ser o mesmo retornado nos dados e na criação da data table especificar as colunas através da propriedade aoColumns como mostrado acima., para evitar um erro semelhante a esse:

DataTables warning (table id = ‘myTable’): Requested unknown parameter ‘2’ from the data source for row 0

Referências:
JQuery Datatables warning: Requested unknow parameter…

Using MVC 4 Web Api with jQuery DataTables

Evitando Bind Injection com ASP.NET MVC

O título do post é sensacionalista, mas o conteúdo é sério.
O recurso de model binding nativo do ASP.NET MVC, oferece um sério risco, dependendo da forma que o desenvolvedor utilize o binding automático.

Imaginemos o seguinte senário:

Uma action que grava alterações no nome e e-mail de um usuário do sistema.
Há diversas formas de capturar no servidor os dados enviados pelo cliente.

Exemplo 1: Declarando na assinatura do método os parâmetros correspondentes aos campos postados no form:

public ActionResult Gravar(string Nome, string Email)
{
   // código de persistência
}

Exemplo 2: Obtendo os dados pelo objeto Request que contém os dados postados:

public ActionResult Gravar()
{
   string nome = Request["Nome"];
   string email = Request["Email"];
}

Exemplo 3: Setando o tipo do parâmetro para a classe que contém esses membros.

[HttpPost]
public ActionResult Gravar(User usuarioPostado)
{
   // código de persistência
}

Classe de domínio:

public class User
{
  public int Id { get; set; }
  public string Nome { get; set; }
  public string Email { get; set; }
  public bool IsAdmin { get; set; }
}

imagine que você criou uma view fortemente tipada, usando o gerador automático do Visual Studio, e sua view contém um campo que permite alterar a propriedade IsAdmin.

</pre>
<div class="editor-label">@Html.LabelFor(model => model.IsAdmin)</div>
<div class="editor-field">@Html.EditorFor(model => model.IsAdmin)
 @Html.ValidationMessageFor(model => model.IsAdmin)</div>
<pre>

Certamente você vai remover esse campo, ou marcá-lo como read only e deixá-lo lá na view.

Vulnerabilidade:
Alguém mal-intencionado pode postar essa informação livremente via GET, ou com um pouquinho mais de trabalho via POST, basta saber que existe esse campo no BD, e que o campo tem o nome de “isAdmin”, setar IS ADMIN = TRUE, e OBTER PERMISSÃO DE ADMINISTRADOR no seu sistema quando os dados forem persistidos.

Possíveis defesas:

Defesa 1: Utilizar o atributo Bind na classe de domínio.

[Bind(Exclude = "IsAdmin")] // É possível usar a propriedade Include, que informa quais membros são permitidos, ao invés de quais serão excluídos.
public class User
{
  public int Id { get; set; }
  public string Nome { get; set; }
  public string Email { get; set; }
  public bool IsAdmin { get; set; }
}

Defesa 2: Utilizar o atributo Bind no método de gravação.

[HttpPost]
public ActionResult Gravar([Bind(Exclude = "IsAdmin")] User usuarioPostado)
{
   // código de persistência
}

Defesa 3: Utilizar uma ViewModel para trocar dados entre a view e o seu controller:

public class UserInputViewModel
{
  public int Id { get; set; }
  public string Nome { get; set; }
  public string Email { get; set; }
}

[HttpPost]
public ActionResult Gravar(UserInputViewModel usuarioPostado)
{
   // converte a classe UserInputViewModel => em User
   // Uma dica é usar a biblioteca AutoMapper: https://github.com/AutoMapper/AutoMapper
   // efetua a persistência.
}

Existem mais defesas possíveis, e uma dica interessante que aprendi é:
“Trate qualquer HTTP request como malicioso até que se prove o contrário.”.

Fontes:
IronShay | Mass Assignment Vulnerability in ASP.NET MVC

6 Ways To Avoid Mass Assignment in ASP.NET MVC

Renderizando uma Partial View com Ajax e jQuery MVC 3

11 - 11 3 comentários

Renderizar Partial Views com Ajax é útil pra acelerar e otimizar o carregamento da sua página.

No exemplo temos:

1 controller Home

1 view Mensagem

 

  • Código do Controller:
public class HomeController : Controller {
public ActionResult Mensagem() {
ViewBag.MensagemRenderizar = "Esta mensagem é renderizada na view parcial";
return PartialView();
}

 

  • Código da View:

<h2>@ViewBag.MensagemRenderizar</h2>

  • Código no _Layout.cshtml

<div id = “result”> </div>

<script type="text/javascript">
$(function () {
$('#result').load('/Home/Mensagem');
});
</script>

Utilizando o método Load do jQuery,  é feita uma requisição ajax e retornado o conteúdo da view especificada.

Mais informações: http://api.jquery.com/load/

Evitando Java Script Injection ou HTML injection ASP.NET MVC 3

11 - 11 2 comentários

Evitando cross-site script injection XSS utilizando Html Encoding:

Segue um exemplo:

Controller: Cliente

public string Buscar(string Nome)
{
string nomeBuscado = HttpUtility.HtmlEncode("Nome buscado: " + Nome);
return nomeBuscado;
}

Utilizando o método HttpUtility.HtmlEncode, evita que código do tipo: /Cliente/Buscar?Nome=<script>alert(‘Hacker’)</script> seja passado via parâmetro.

Observação: Por padrão, expressões na view engine Razor são automaticamente HTML encoded.

Ex:
@{
var mensagem = “<script>alert(‘hackeado’)</script>”;
}
<span>@mensagem</span>

resultado:
<span>&lt;script&gt;alert(‘hackeado’);&lt;script&gt;</span>

O Script não será executado.

para permitir a incorporação de texto com código/marcação na view, utilize o método:
<span>@Html.Raw(mensagem)</span>
Nesse caso o alert javascript será exibido.

Ao escrever dentro de código javascript, utilize uma segunda proteção contra XSS, um Encode específico para Javascript:

<script type=”text/javascript”>
$(function () {
var boasvindas = ‘Ola @Ajax.JavaScriptStringEncode(ViewBag.LoginUsuario)’;
$(“#mensagem”).html(boasvindas).show(‘slow’);
});
</script>
guiaecologico.wordpress.com/

Despertando a consciência que preserva!

Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: