utilizando o cmd.Parameters.AddWithValue - consigo bloquear invasão por sql injection?

.NET

18/09/2013

Se sim, quais outras dicas vc podem dar de segurança, em post, Request.querystring..., ? ASP.Net com C# e MySQL.
Alexandre Alves

Alexandre Alves

Curtidas 0

Respostas

Joel Rodrigues

Joel Rodrigues

18/09/2013

Sim, consegue evitar SQL Injection, pois os tipos dos parâmetros são adequados aos tipos das colunas e a instrução SQL fica por conta do ADO.NET.
Além disso, uma boa prática é efetuar validações, inclusive usando RegEx.
GOSTEI 0
Fernanda Acacia

Fernanda Acacia

18/09/2013

um pergunta extremamente basica, para evitar sql injection é somente para sistemas web ou desktop tambem?
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

18/09/2013

Fernanda, qualquer sistema que utilize SQL está passível de sofrer injeção de SQL.
GOSTEI 0
Thiago Jesus

Thiago Jesus

18/09/2013

Se sim, quais outras dicas vc podem dar de segurança, em post, Request.querystring..., ? ASP.Net com C# e MySQL.


Uma técnica válida é sempre utilizar Getters and Setters para acessar os dados da sua classe. Para operações SQL sempre utilize uma camada de acesso, por exemplo o padrão DAO.
Quando você trabalhar com Formulários Persistentes NUNCA realize operações SQL diretamente do formulário, pois se um TextBox estiver diretamente ligado a uma operação SQL é fácil de rodar SQL Injection, e isso não é apenas para .NET e sim para qualquer linguagem de programação.
Envie as informações do formulário para uma classe Model contendo Getters and Setters e a partir dai trabalhe com uma camada de acesso do tipo DAO.

Classe Model
Observação: Getters and Setters utilizando propriedades automáticas no C# é uma das coisas mais elegantes da linguagem
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Contatos
{
    class LoginMODEL
    {
        public string Usuario { get; set; }
        public string Senha { get; set; }
    }
}



Classe DAO.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace Contatos
{
    class LoginDAO
    {
        public Boolean Logar(LoginMODEL login)  método público passar um objetos Model como parâmetro
        {
            Boolean resultado = false;

            SqlConnection conn = new SqlConnection(@"Server =(LocalDB)\v11.0;Database = banco; Integrated Security = SSPI;");
            SqlCommand sql = new SqlCommand("Select * from Usuarios Where " +
                                            "Usuario = @usuario And Senha = @senha", conn);
            sql.Parameters.AddWithValue("@usuario", login.Usuario); // Primeiro parâmetro recebe o conteúdo de login.Usuario
            sql.Parameters.AddWithValue("@senha", login.Senha); // Segundo parâmetro recebe o conteúdo de login.Senha
            conn.Open();
            SqlDataReader reader = sql.ExecuteReader();
            while (reader.Read())
            {
                resultado = true;

            }
            return resultado;
        }
    }
}



Este é um exemplo bem simples.
A plataforma .NET é maravilhosa!
GOSTEI 0
POSTAR