转义输入以插入 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 标准。
假设我有以下代码:
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 标准。