Опасения по поводу полнотекстового поиска SQL Server 2008 года

Удаление делает недействительным только итераторы, которые указывают на элементы, которые удалены.

Так в этом случае после удаления *я, я делаюсь недействительным, и Вы не можете сделать инкремента на нем.

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

11
задан Tom H 7 July 2010 в 19:46
поделиться

4 ответа

Недавно я использовал полнотекстовый поиск, поэтому постараюсь ответить на некоторые из ваших вопросов.

• «Я ненавижу динамическое построение sql из-за риска внедрения. Как я могу защититься от этого? "

Я использовал такой метод очистки:

static string SanitizeInput(string searchPhrase)
    {
        if (searchPhrase.Length > 200)
            searchPhrase = searchPhrase.Substring(0, 200);

        searchPhrase = searchPhrase.Replace(";", " ");
        searchPhrase = searchPhrase.Replace("'", " ");
        searchPhrase = searchPhrase.Replace("--", " ");
        searchPhrase = searchPhrase.Replace("/*", " ");
        searchPhrase = searchPhrase.Replace("*/", " ");
        searchPhrase = searchPhrase.Replace("xp_", " ");

        return searchPhrase;
    }

• Следует ли мне использовать FREETEXTTABLE вместо этого? Есть ли способ заставить FREETEXT искать ВСЕ слова вместо ЛЮБЫХ?

Я использовал FREETEXTTABLE, но мне нужно было любое из слов. Насколько я читал об этом (и довольно много читал), вы должны использовать CONTAINSTABLE для поиска ВСЕХ слов или различных комбинаций. FREETEXTTABLE кажется более легким решением, но не тем, что можно выбрать, если вам нужны более глубокие настройки.

3
ответ дан 3 December 2019 в 11:38
поделиться

Дэн, мне нравится ваш метод SanitizeInput. Я переработал его, чтобы сделать его более компактным и немного повысить производительность.

 static string SanitizeInput(string searchPhrase, int maxLength)
        {
            Regex r = new Regex(@";|'|--|xp_|/\*|\*/", RegexOptions.Compiled);
            return r.Replace(searchPhrase.Substring(0, searchPhrase.Length > maxLength ? maxLength : searchPhrase.Length), " ");
        }

        static string SanitizeInput(string searchPhrase)
        {
            const int MAX_SEARCH_PHRASE_LENGTH = 200;
            return SanitizeInput(searchPhrase, MAX_SEARCH_PHRASE_LENGTH);
        }

Я согласен с тем, что FreeTextTable - слишком легкое решение.

2
ответ дан 3 December 2019 в 11:38
поделиться

Все наши поиски ведутся по столбцам в базе данных, которые содержат предопределенные допустимые символы. Наш алгоритм поиска включает это с регулярным выражением, которое допускает только эти предопределенные символы. Благодаря этому экранирование в строке поиска не требуется. Наше регулярное выражение отсеивает любые попытки внедрения в веб-код (asp и aspx). Для стандартных комментариев пользователей мы используем экранирование, которое изменяет все символы, которые могут быть использованы во вред в SQL, ASP, ASPX и Javascript.
Сайт TransStar http://latranstar.tann.com/ использует расширенную форму Soundex для поиска названий улиц, адресов и городов в любой точке Южной Калифорнии. Сам по себе Soundex устраняет необходимость в коде защиты от инъекций, поскольку работает только с буквенными символами.

0
ответ дан 3 December 2019 в 11:38
поделиться

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

Я бы рекомендовал создать поисковый запрос на C #; передача последнего условия поиска в качестве параметра, как уже упоминалось.

Насколько я помню, FREETEXTTABLE использует средства разбиения по словам, чтобы полностью разложить условия поиска на их отдельные компоненты. Однако оператор FREETEXTTABLE автоматически разбивает слова на флективные эквиваленты , так что вы выиграли '

0
ответ дан 3 December 2019 в 11:38
поделиться