ВАЖНО
. Лучший способ предотвратить 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 .
Просто создайте строку запроса с каждым термином:
"filename:searchText OR filetext:searchText"
не имеет значения, что Вы передаете как начальное поле в конструкторе QueryParser. Просто удостоверьтесь, что Вы называете.Parse () на Вашей строке запроса для возвращения объекта Запроса выполниться.
, Если Вы хотите использовать "и" поиск:
"+filename:searchText +filetext:searchText"
поскольку каждое поле создает запрос из вышеупомянутого queryparsers, затем добавьте запрос к booleanquery заявлять, что это "должно" произойти.
, С другой стороны, проверяют MultiFieldQueryParser, который является упрощенным способом сделать его.
Есть 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, то вам нужно только поискать одно поле.