Запретить SQL-инъекцию в операторе SELECT - PullRequest
1 голос
/ 08 декабря 2011

Я использую VS2005 C # ASP.NET и SQL Server 2005.

У меня есть функция search на моей странице asp, и я чувствую, что мой запрос SELECT уязвим для внедрения SQL.

Это мой текущий SELECT оператор:

string LoggedInUser = (User.Identity.Name);

SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE1] where [" + DropDownList1.Text + "] like '%" + searchTB.Text + "%' AND [empUser] LIKE '%"+LoggedInUser+"%'";
SqlDataSource1.DataBind();

* где searchTB - мое текстовое поле поиска; DropDownList1 моя категория поиска; LoggedInUser - имя пользователя, вошедшего в систему.


Я реализовал параметр вместо конкатенации в одном из моих операторов INSERT :

string sql = string.Format("INSERT INTO [TABLE2] (Username) VALUES (@Username)");
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.AddWithValue("Username", usernameTB.Text);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();

Я бы хотел изменить свой оператор SELECT , как мой оператор INSERT , используя вместо этого параметр. Могу ли я узнать, как мне это изменить?

Спасибо

Ответы [ 5 ]

4 голосов
/ 08 декабря 2011

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

SqlDataSource s = new SqlDataSource();
s.SelectParameters.Add("paramName", "paramValue");

Существуют и другие коллекции параметров для удаления, обновления и вставки.

s.DeleteParameters
s.UpdateParameters
s.InsertParameters

Дополнительная информация:

MSDN: свойство SqlDataSource.SelectParameters

Программно с использованием SqlDataSource

надеюсь, что это поможет

2 голосов
/ 08 декабря 2011

См. Использование параметров с элементом управления SqlDataSource

И Свойство SqlDataSource.SelectParameters

Вы можете указать SelectParameters Свойство для SqlDataSource для использования параметризованного SQL-запроса

2 голосов
/ 08 декабря 2011

Напишите метод, который получает источник данных и используйте параметры sql для запроса. Здесь - хороший пример того, как добавить параметры в объект команды

SqlCommand command = new SqlCommand(commandText, connection);
command.Parameters.Add("@ID", SqlDbType.Int);
command.Parameters["@ID"].Value = customerID;

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

1 голос
/ 08 декабря 2011

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

switch (DropDownList1.Text)
{
    case "ValidField1":
    case "ValidField2":
    ...
        break;
    default: 
        throw new ArgumentException(...); // or prevent query execution with some other statement
}

SqlDataSource1.SelectCommand = "SELECT * FROM [TABLE1] where [" + DropDownList1.Text + "] like @value AND [empUser] LIKE @user";
SqlDataSource1.SelectParameters.Add("value", "%" + searchTB.Text + "%");
SqlDataSource1.SelectParameters.Add("user", "%"+LoggedInUser+"%");
SqlDataSource1.DataBind();
0 голосов
/ 08 декабря 2011
  1. Вы можете просто использовать выражение фильтра для источника данных SQL Выражение фильтра источника данных SQL

  2. Вы можете написать свой собственный метод выбора функции с источником данных / datatable

...