Как включить несколько полей в QueryParser?

ВАЖНО

. Лучший способ предотвратить SQL Injection - использовать подготовленные выражения вместо экранирования , поскольку демонстрирует принятый ответ .

Существуют библиотеки, такие как Aura.Sql и EasyDB , которые позволяют разработчикам легче использовать подготовленные инструкции. Чтобы узнать больше о том, почему подготовленные операторы лучше в останавливать SQL-инъекцию , см. этот mysql_real_escape_string() обход и недавно зафиксированные уязвимости Unicode SQL Injection в WordPress .

Предотвращение впрыска - mysql_real_escape_string ()

У PHP есть специально созданная функция для предотвращения этих атак. Все, что вам нужно сделать, это использовать функцию функции mysql_real_escape_string.

mysql_real_escape_string берет строку, которая будет использоваться в запросе MySQL, и возвращает ту же строку со всеми попытками внедрения SQL безопасно сбежал. В принципе, это заменит эти неприятные кавычки ('), которые пользователь может ввести с помощью заменителя в MySQL, сэкономленная цитата.

ПРИМЕЧАНИЕ: вы должны подключиться к базе данных, чтобы использовать эту функцию!

// Подключение к MySQL

$name_bad = "' OR 1'"; 

$name_bad = mysql_real_escape_string($name_bad);

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: 
" . $query_bad . "
"; $name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; $name_evil = mysql_real_escape_string($name_evil); $query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; echo "Escaped Evil Injection:
" . $query_evil;

Более подробную информацию вы найдете в MySQL - SQL Injection Prevention .

34
задан peak 17 February 2016 в 15:17
поделиться

3 ответа

Просто создайте строку запроса с каждым термином:

"filename:searchText OR filetext:searchText"

не имеет значения, что Вы передаете как начальное поле в конструкторе QueryParser. Просто удостоверьтесь, что Вы называете.Parse () на Вашей строке запроса для возвращения объекта Запроса выполниться.

, Если Вы хотите использовать "и" поиск:

"+filename:searchText +filetext:searchText"
4
ответ дан Bob King 27 November 2019 в 16:20
поделиться

поскольку каждое поле создает запрос из вышеупомянутого queryparsers, затем добавьте запрос к booleanquery заявлять, что это "должно" произойти.

, С другой стороны, проверяют MultiFieldQueryParser, который является упрощенным способом сделать его.

1
ответ дан Saltire 27 November 2019 в 16:20
поделиться

Есть 3 способа сделать это.

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

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("filename", "<text>"));
Query query2 = new TermQuery(new Term("filetext", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);

Второй Способ использования MultifieldQueryParser , это ведет себя как QueryParser , что позволяет получить доступ ко всему питанию, за исключением того, что она будет искать над несколькими полями.

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                                        new string[] {"filename", "filetext"},
                                        analyzer);

Hits hits = searcher.Search(queryParser.parse("<text>"));

Конечный способ - использовать специальный синтаксис QueryParser . Смотрите здесь .

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);    

Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't 
// prefix it with a field.
string special = "filename:" + text + " OR filetext:" + text;

Hits hits = searcher.Search(queryParser.parse(special));

Ваш другой вариант - создать новое поле при индексировании вашего содержимого под названием FileNameandText, в который можно разместить содержимое и файл и FileText, то вам нужно только поискать одно поле.

77
ответ дан 27 November 2019 в 16:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: