Olá Rafael
Imagine que temos uma aplicação que faz cadastro de usuários onde pedimos por exemplo as informações: nome, email, cpf e senha.
Além disso, nessa aplicação temos uma tela onde o usuário pode alterar suas informações cadastrais, porém ele não pode atalizar o campo CPF. Então podemos fazer um formulário onde vamos permitir apenas a entrada das informações nome, email e senha:
<form action="/Usuario/Altera" method="post">
<input name="u.Nome"/>
<input name="u.Email"/>
<input name="u.Senha" type="password"/>
<input type="submit"/>
</form>
Agora no controller vamos receber as informações em um usuário:
public class UsuarioController : Controller
{
public ActionResult Altera(Usuario u)
{
// implementação
}
}
Na implementação do método, podemos por exemplo atualizar todas as informações não nulas que vieram no modelo. Como o formulário não envia o CPF, não atualizaremos essa informação no banco.
Mas o cliente pode modificar o código de um formulário utilizando as ferramentas de desenvolvedor que estão incluidas no navegador. Ele pode por exemplo, inclui no formulário um novo campo com name u.CPF
. Quando esse formulário modificado for enviado para o servidor, o objeto usuário que é recebido pelo controller conterá um valor para o CPF e por isso ele será modificado no banco de dados.
Perceba que o problema foi permitirmos o envio de qualquer parâmetro no formulário. Para evitar esse problema utilizamos o BindAttribute para proibir o envio do CPF:
public class UsuarioController : Controller
{
public ActionResult Altera([Bind(Exclude="CPF")]Usuario u)
{
// implementação
}
}
```
Com isso o usuário não terá o cpf preenchido mesmo quando o parâmetro for enviado na requisição.