如何解决如何在 Oracle 中将字符串参数正确传递给 XPATH?
如何将字符串参数传递给 EXTRACTVALUE
?
例如:
EXTRACTVALUE(fooColumn,'/foo/bar[@baz = "arg"]/@value')
如何用实参 "arg"
替换 :arg
?
简单的解决方案:
EXTRACTVALUE(fooColumn,'/foo/bar[@baz = "' || :arg || '"]/@value')
这里如何防止可能的“XPath”注入? 是否有 XPath 转义函数?
解决方法
EXTRACTVALUE
已弃用,您应该改用 XMLQUERY
或 XMLTABLE
。
您可以尝试使用 DBMS_ASSERT
包:
CREATE FUNCTION enquote_name (
name IN VARCHAR2
) RETURN VARCHAR2
IS
BEGIN
-- Wrap it in a function call to use the PL/SQL FALSE literal.
RETURN DBMS_ASSERT.ENQUOTE_NAME(name,FALSE);
END;
/
那么:
SELECT XMLQUERY(
('/foo/bar[@baz='||ENQUOTE_NAME(:arg)||']/@value')
PASSING fooColumn
RETURNING CONTENT
) AS value
FROM table_name
或
SELECT EXTRACTVALUE( foocolumn,'/foo/bar[@baz='||ENQUOTE_NAME(:arg)||']/@value')
AS value
FROM table_name
表:
CREATE TABLE table_name ( foocolumn ) AS
SELECT XMLTYPE(
'<foo><bar baz="abc" value="123" /><bar baz="def" value="456" /></foo>'
)
FROM DUAL;
输出,当 :arg
为 def
时:
VALUE |
---|
456 |
如果您尝试将 :arg
用作 'abc"][@value="123'
,则查询返回零行(或引发 EXTRACTVALUE
的异常);但是,如果您尝试传递相同的值而不将其包装在对 ENQUOTE_NAME
的调用中(并包括 ENQUOTE_NAME
将添加的双引号),那么它将执行您试图避免的 XPATH 注入。
dbfiddle here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。