Экранирование ввода для вставки в строку XQuery

Скажем, у меня есть следующий код:

let $search := "placeholder"...
...functx:get-matches-and-non-matches($t,$search)...

Этот код хранится, как это в файле, загружается в строку (с помощью PHP), placeholder заменяется пользовательским вводом, а затем код выполняется.

Очевидно, что " нужно как-то избежать.

Есть ли какие-либо другие вещи, которые необходимо экранировать или удалить, прежде чем ввод пользователя будет безопасным?

Пока я обнаружил, что мне нужно заменить " с " для вещей, чтобы работать, и в процессе также обнаружил, что \ на самом деле должен быть \\ здесь (или \\что делает это "\\\\" в php) и что ускользает { а также } может быть хорошей идеей, потому что они заставляют анализатор регулярных выражений бросать иначе.

1

Решение

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

Как вы, кажется, используете BaseX и PHP, это пример для привязки BaseX PHP:

// create query instance
$input = 'declare variable $name external; for $i in 1 to 10 return element { $name } { $i }';
$query = $session->query($input);
// bind variable
$query->bind("name", "number");
// print results
print $query->execute()."\n";

Если вы используете другой интерфейс для BaseX, регистрация внешних переменных должна быть возможна для всех из них. Другие реализации XQuery также должны предоставлять аналогичные механизмы для связывания переменных, external переменные официально являются стандартом XQuery.

2

Другие решения

Других решений пока нет …