Привязка параметров: что происходит под капотом? - PullRequest
7 голосов
/ 18 августа 2008

.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-инъекций?

Ответы [ 3 ]

5 голосов
/ 18 августа 2008

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

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

0 голосов
/ 18 августа 2008

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

0 голосов
/ 18 августа 2008

Если вы используете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...