转义输入以插入 XQuery 字符串

Escaping input for insertion into XQuery string

假设我有以下代码:

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

这段代码像这样存储在一个文件中,被加载到一个字符串中(通过 PHP),placeholder 被用户输入替换,然后代码被执行。

显然," 需要以某种方式进行转义。

在确保用户输入安全之前,是否还有任何其他内容需要转义或删除?

到目前为止,我发现我需要将 " 替换为 " 才能正常工作,并且在此过程中还发现 \ 实际上需要 [=16] =] 这里(或 \,这使得 "\\" 在 php 中)并且转义 {} 可能是个好主意,因为它们使否则正则表达式解析器会抛出。

如果不需要,请不要动态构造查询,您将不得不花费大量精力进行转义以防止代码注入(并且仍然可能在某处忽略参数)。考虑改用外部绑定变量,这可以与 SQL.

中的准备语句进行比较

您似乎使用 BaseX 和 PHP,这是 example for the BaseX PHP binding:

// 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 标准。