Это Sql-инъекционный код Asp.net? - PullRequest
3 голосов
/ 05 июля 2011

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

Решение: я создал запрос SQLCommand с параметрами, затем япоместил SQLCommand.CommandText в строку, и я вернул ее (бизнес-логике, которая будет обрабатывать запрос)

Основной вопрос: является ли это SQL-инъекцией?

Пример кода:

sQuery = "select * from xy where x like '%@txtNameParameter%'";

SqlCommand cmd = new SqlCommand(sQuery);

cmd.Parameters.Add("@txtNameParameter", SqlDbType.VarChar);
cmd.Parameters["@txtNameParameter"].Value = txtName.Text;

string query = cmd.CommandText;
return query;

Подвопрос, если основной вопрос в порядке: Нужно ли указывать в параметрах также значения радиокнопок и выпадающих меню или они являются инъекционными?

1 Ответ

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

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

Вы можете изменить эту строку кода на:

sQuery = "select * from xy where x like '%'+@txtNameParameter+'%'";

Что бы SQL выглядел следующим образом:

select * from xy where x like '%'+@txtNameParameter+'%'

Это просто объединение строк вместо, где в SQL-команде в любом случае ожидается строка.

Однако ваше описание того, что вы делаете с этим впоследствии, возможно, выбрасывает все это из воды.Я не могу понять, почему вы хотите отправить только предложение where запроса на бизнес-уровень.

Кроме того, предложение WHERE с подстрокой не будет содержать данные, которые вы вводите в параметр.Таким образом, вы не получаете больше пользы, чем просто возвращение

return "where x like '%@txtNameParameter%'";

Значение параметра потеряно.

...