Привязка параметров:Что происходит под капотом?

StackOverflow https://stackoverflow.com/questions/14934

  •  08-06-2019
  •  | 
  •  

Вопрос

.NET, Java и другие высокоуровневые API баз данных на различных языках часто предоставляют методы, известные как подготовленные инструкции и привязка параметров, в отличие от отправки простых текстовых команд на сервер базы данных.Что я хотел бы знать, так это то, что происходит, когда вы выполняете оператор, подобный этому:

SqlCommand cmd = new SqlCommand("GetMemberByID");
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@ID", memberID);
para.DbType = DbType.Integer;
cmd.Parameters.Add(param);

Я знаю, что это лучшая практика.Таким образом, атаки с использованием SQL-инъекций сводятся к минимуму.Но что именно происходит под капотом, когда вы выполняете эти инструкции?Является ли конечный результат по-прежнему безопасной строкой SQL?Если нет, то каков конечный результат?И достаточно ли этого для предотвращения атак с использованием SQL-инъекций?

Это было полезно?

Решение

Страница руководства по MySQL в подготовленных инструкциях содержится много информации (которая должна применяться к любой другой СУБД).

По сути, ваш оператор анализируется и обрабатывается заранее, а параметры отправляются отдельно вместо того, чтобы обрабатываться вместе с кодом SQL.Это исключает атаки с использованием SQL-инъекций, поскольку SQL анализируется еще до того, как параметры будут заданы.

Другие советы

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

Если вы используете MS SQL, загрузите профилировщик, и вы увидите, какие инструкции SQL генерируются при использовании параметризованных запросов.Вот пример (я использую Enterprise Libary 3.1, но результаты те же, используя SqlParameters напрямую) для SQL Server 2005:

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
  db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
  db.AddInParameter(cmd, "Did", DbType.Int32, 500204);

  DataSet ds = db.ExecuteDataSet(cmd);
}

Это порождает:

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(9),
  @Did int',
  @DomName=N'xxxxx.net',
  @Did=500204

Вы также можете увидеть здесь, что если символы кавычек были переданы в качестве параметров, то они экранируются соответствующим образом:

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(10),
  @Did int',
  @DomName=N'''xxxxx.net',
  @Did=500204
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top