Лучшие практики для использования SqlCommand - PullRequest
1 голос
/ 28 июля 2011

Я хотел бы убедиться, что при использовании SqlCommand я использую лучшие практики, особенно в отношении безопасности.

Соображения, в которых я не уверен:

  1. Это так?ОК, чтобы вручную построить строку, добавив?Если нет, то как мне это сделать?
  2. Какие классы мне стоит использовать вместо этого?

Ответы [ 7 ]

5 голосов
/ 28 июля 2011

Если ваш первый вопрос говорит о построении SQL путем непосредственного включения значений , это почти наверняка не хорошо.Он открывает для вас атаки SQL-инъекций, а также проблемы с преобразованиями (например, необходимость получить правильный формат даты / времени).

Вместо этого следует использовать параметризованный запрос , иустановить значения в параметрах.См. Документацию для SqlCommand.Parameters для примера.

Из интереса, есть ли у вас особая причина для использования SQL напрямую вместо использования одного из множества ORM?(LLBL, Entity Framework, NHibernate, LINQ to SQL, SubSonic, Massive, SimpleData, Dapper ...)

2 голосов
/ 28 июля 2011

Мой совет: будь ленивым. Написание объемного кода - это хороший способ сделать ошибки «мертвого мозга» (неправильный тип данных, нулевые проверки, отсутствующие Dispose () и т. Д.), И он обладает нулевым преимуществом по сравнению со многими вспомогательными инструментами. *

Лично я большой поклонник брезгливости (но я несколько предвзят), что облегчает задачу:

int customerId = ...
var orders = connection.Query<Order>(
    @"select * from Customers where CustomerId = @customerId",
    new { customerId });

Что сделает для вас параметризацию и материализацию без боли и тупо быстро.

Для других сценариев, в частности, когда вы хотите использовать методы OO для обновления системы, ORM, такой как EF или L2S, сэкономит вам время работы (и даст вам лучшую проверку типов через LINQ).

2 голосов
/ 28 июля 2011

Я бы сказал, что использование параметров является одним из наиболее важных аспектов безопасности. Это предотвратит SQL-инъекцию в вашу базу данных. Следующая команда SQLCommand является примером того, как я мог бы ее создать (в VB.NET, извинений - пока нет знаний C #;))

Dim cmd as New SqlCommand("sp_StoredProcedure", Conn)
cmd.commandType = commandtypes.storedprocedure
cmd.parameters.add("@ID",sqldbtype.int).value = myID
cmd.executenonquery

И пример встроенного SqlCommand:

Dim cmd as New SqlCommand("SELECT Name, Message FROM [Table] WHERE ID=@ID", Conn)
cmd.commandType = commandtypes.storedprocedure
cmd.parameters.add("@ID",sqldbtype.int).value = myID
cmd.executenonquery
0 голосов
/ 24 мая 2017

Я думаю, что это лучшее решение

    SqlConnection cn = new SqlConnection(strCn);
        try
        {
            using (SqlCommand cmd = new SqlCommand("select * from xxxx", cn))
            {
                cn.Open();

                //do something

                cn.Close();
            }
        }
        catch (Exception exception)
        {
            cn.Close();
            throw exception;
        }
0 голосов
/ 29 июля 2011

Вы всегда должны использовать практику применения наименьших привилегий к соединениям с базой данных, связываясь с базой данных с помощью хранимых процедур.

Store Procs

using System.Data;
using System.Data.SqlClient;
using (SqlConnection connection = new SqlConnection(connectionString))
{
  DataSet userDataset = new DataSet();
  SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure", connection);
  myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
  myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
  myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
  myCommand.Fill(userDataset);
}
  • учетные данные для строки подключения к базе данных: A. Интегрированная безопасность для корпоративной / внутренней сети B. Сохраняйте ее в зашифрованном виде в реестре или в файле провайдеров хостинга.

  • Всегда следите захакеры пытаются загрузить кросс-скрипты в ваши формы.

  • Всегда проверяйте ввод для SQL-инъекций.

0 голосов
/ 28 июля 2011

Если вы беспокоитесь о безопасности, я рекомендую вместо этого создавать ваши запросы как хранимые процедуры внутри базы данных SQL Server (чтобы не беспокоиться о внедрении SQL), а затем из внешнего кода просто сгенерируйте хранимую процедуру SQL, добавьте параметры, и сделайте это таким образом.

Эта статья должна помочь вам с настройкой.

0 голосов
/ 28 июля 2011

В зависимости от того, когда я выполняю POC или небольшие небольшие проекты, я обычно строю свои строки вручную, но когда я нахожусь в проекте для работы, у нас есть шаблон для использования БД и подключения, который я должен использовать, и не могу явно показать здесь.

Но я думаю, что это нормально - создавать вручную для базовых операций в небольшом проекте или POC.

  • Редактировать: Как сказал Джон, хотя вы всегда должны использовать что-то вроде SqlCommand.Parameters при сборке собственной команды,Извините, если я не был ясен.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...