转义插入XQuery字符串的输入

时间:2015-06-03 17:13:27

标签: php escaping xquery basex

说我有以下代码:

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

此代码以这样的形式存储在文件中,加载到字符串中(通过PHP),placeholder被用户输入替换,然后代码被执行。

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

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

到目前为止,我发现我需要将"替换为"才能使用,并且在此过程中还发现\实际上需要\\这里(或\\,它在php中使它成为"\\\\")并且逃避{}可能是一个好主意,因为它们会使正则表达式解析器失效。

1 个答案:

答案 0 :(得分:2)

如果不需要动态构造查询,则必须花费大量精力进行转义以防止代码注入(并且仍然可能忽略某个参数)。请考虑使用外部绑定变量,这可以与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标准。