создание достаточного поискового запроса sql - PullRequest
0 голосов
/ 18 ноября 2011

Я пишу запрос, чтобы позволить пользователю искать по тому, что они предоставляют ключевые слова в asp.net, C # и mssql:

 string projectPart = null;
 string categoryPart = null;
 string descriptionPart = null;

 if (this.Textbox_ProjectNr.Text.Trim().Length > 0)
   projectPart = " AND Number='" + this.Textbox_ProjectNr.Text.Trim() + "' ";

 if (this.Textbox_Category.Text.Trim().Length > 0)
   categoryPart = " AND Category LIKE '%" + this.Textbox_Category.Text.Trim() + "%' ";

 if (this.Textbox_pDescription.Text.Trim().Length > 0)
    descriptionPart = " AND ProductDescription LIKE '%" + this.Textbox_pDescription.Text.Trim() + "%' ";

 string query = "SELECT * from Project  = p.ID " + projectPart + descriptionPart + categoryPart;

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

  1. , если пользователь ничего не печатает, он возвращает все данные => Для этого я делаю запрос только тогда, когда одно из полей заполнено.,
  2. если пользователь предоставит несколько ключевых слов "P" для каждого поля, результатом будут миллионы данных.

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

Спасибо, заранее.

Ответы [ 3 ]

3 голосов
/ 18 ноября 2011

Самым важным улучшением является защита вашего кода от атак SQL-инъекций.

Вы не должны объединять необработанные данные в строке SQL. Если кто-то ищет следующий текст, например:

Bwah ha ha'; DROP DATABASE northwind; PRINT'

Это будет добавлено к вашему запросу для получения

SELECT *
FROM mytable
WHERE category LIKE '%Bwah ha ha'; DROP DATABASE northwind; PRINT'%'

Это допустимая команда SQL, которая с радостью выполнит и удалит вашу базу данных (или сделает все, что захочет злоумышленник)

Для получения дополнительной информации см. SQL-инъекция и Santitizng Inputs .

1 голос
/ 18 ноября 2011

Вы должны сделать этот запрос инъекционным доказательством! Не объединяйте введенные пользователем значения, а используйте параметры, например:

SqlCommand cmd = new SqlCommand(@"
    SELECT * from Project 
    WHERE 
    ( Number = @Number OR @Number IS NULL ) AND
    ( Category LIKE @Category OR @Category IS NULL ) AND
    ( ProductDescription LIKE @ProductDescription OR @ProductDescription IS NULL )", conn);
if(!String.IsNullOrEmpty(this.Textbox_ProjectNr.Text.Trim()))
   cmd.Parameters.AddWithValue("@Number", this.Textbox_ProjectNr.Text.Trim());
if(!String.IsNullOrEmpty(this.Textbox_Category.Text.Trim()))
   cmd.Parameters.AddWithValue("@Category", this.Textbox_Category.Text.Trim());
if(!String.IsNullOrEmpty(this.Textbox_pDescription.Text.Trim()))
   cmd.Parameters.AddWithValue("@ProductDescription", this.Textbox_pDescription.Text.Trim());

Кроме того, вы можете добавить некоторую проверку клиента для введенных пользователем значений. Например, запросите более трех (?) Символов перед выполнением этого запроса.

<asp:TextBox ID="Textbox_ProjectNr" runat="server" />
<asp:RegularExpressionValidator ID="Textbox_ProjectNr_Validator" runat="server" 
   ControlToValidate="Textbox_ProjectNr"
   ErrorMessage="Minimum length is 3"
   ValidationExpression=".{3,}" />
0 голосов
/ 18 ноября 2011

Прежде всего, вы должны защитить себя от инъекций sql. Вы не указали, какое соединение с базой данных вы используете, но большинство библиотек позволяют добавлять параметры в другое поле, поэтому они очищаются автоматически. Во-вторых, вы можете (и должны) ограничить количество результатов, используя «LIMIT» (для mysql) или «TOP X», например так: Select * from TableName LIMIT 100 или Select TOP 100 * from TableName

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...