说我有以下代码:
let $search := "placeholder"
...
...functx:get-matches-and-non-matches($t,$search)...
此代码以这样的形式存储在文件中,加载到字符串中(通过PHP),placeholder
被用户输入替换,然后代码被执行。
显然,"
需要以某种方式进行转义。
在任何用户输入安全之前,还有其他需要转义或删除的内容吗?
到目前为止,我发现我需要将"
替换为"
才能使用,并且在此过程中还发现\
实际上需要\\
这里(或\\
,它在php中使它成为"\\\\"
)并且逃避{
和}
可能是一个好主意,因为它们会使正则表达式解析器失效。
答案 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标准。