none
Classe dao com segunraça? RRS feed

  • Pergunta

  • Bom dia,

    A minha questão é a seguinte: estou criando um classe responsável pela interação com o Banco de Dados, insert, update etc.

    Como garantir a segurança dos dados inseridos com essa classe?

    Classe:

    using System.Configuration;

    using System.Data;

    using Npgsql;

    namespace Gerenciador_2013.Model

    {

        public class Contexto

        {

            public  NpgsqlConnection conexao;

            public Contexto()

            {

                conexao = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["PostgreSQL"].ConnectionString);

                conexao.Open();

            }

            // Executa um comando no banco de dados sem retorno. Exemplo: faz um insert, update ou delete no banco dados

            public void Executa(string strQuery) {

                NpgsqlCommand cmd = new NpgsqlCommand {

                              CommandText = strQuery,

                              CommandType = CommandType.Text,

                              Connection = conexao

                };

                cmd.ExecuteNonQuery();

            }

            // Esse método retorna valores feitos em consultas.

            public NpgsqlDataReader Consulta(string strQuery) {

                NpgsqlCommand cmd = new NpgsqlCommand(strQuery, conexao);

                return cmd.ExecuteReader();

            }

            // Ao ser chamado se a conexão com o banco de dados estiver aberta ele a fecha.

            public void Dispose() {

                if (conexao.State == ConnectionState.Open)

                    conexao.Close();

            }

        }

    }

     

    Dessa outra forma eu consigo a segurança desejada. Mas tem o inconveniente de escrever as 4 operações (crud) em todas as classes que precisem manipular o Banco de Dados

    ....

    string SQL = "INSERT INTO cidade (cidade) VALUES (@c)";

                NpgsqlCommand cmd = new NpgsqlCommand(SQL, con.conexao);

                cmd.Parameters.AddWithValue("@c", cidades.Cidade);

                return cmd.ExecuteNonQuery();

                con.Dispose();

     ...

    Como posso garantir a segurança no primeiro caso?

    Segurança: SQL injetct etc.

    Att,

     Antonio Flavio



    terça-feira, 5 de novembro de 2013 02:12

Respostas

  • Então, não inconveniência é o correto! Quer segurança, quer conversão, quer manipulação correta então 

    faça um Dao para cada Tabela do seu banco e utiliza Design Patterns para que isso fico reaproveitável!

    Eu fiz um vídeo se for do seu interesse: http://www.youtube.com/watch?v=N6NEo8zf60c

    Ou

    Trabalhe com camada de persistência (ORM) com uma camada de Repositório logo acima!!!


    Fúlvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr quarta-feira, 13 de novembro de 2013 14:43
    quarta-feira, 6 de novembro de 2013 15:11

Todas as Respostas

  • Você pode passar essas querys, para uma procedure no banco de dados e fazer a chamada da mesma no código C#.

    Não tem nada a ver com o SQL Injection mas é uma boa prática que pode adotar.


    Se a sugestão resolver o problema, favor marcar como Resposta.

    terça-feira, 5 de novembro de 2013 10:27
  • Já pensou em usar algum orm?

    Não esqueça de usar o componente </> na barra para posta seu código. Microsoft MCPD,MCTS,MCC

    quarta-feira, 6 de novembro de 2013 14:59
    Moderador
  • Então, não inconveniência é o correto! Quer segurança, quer conversão, quer manipulação correta então 

    faça um Dao para cada Tabela do seu banco e utiliza Design Patterns para que isso fico reaproveitável!

    Eu fiz um vídeo se for do seu interesse: http://www.youtube.com/watch?v=N6NEo8zf60c

    Ou

    Trabalhe com camada de persistência (ORM) com uma camada de Repositório logo acima!!!


    Fúlvio Cezar Canducci Dias

    • Marcado como Resposta Giovani Cr quarta-feira, 13 de novembro de 2013 14:43
    quarta-feira, 6 de novembro de 2013 15:11