首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用dbms_store.insertXML插入特殊字符

使用dbms_store.insertXML插入特殊字符
EN

Stack Overflow用户
提问于 2016-09-30 07:00:50
回答 1查看 57关注 0票数 0

我正在尝试使用dbms_store.insertXML将一些经过清理的XML插入到一个表中。插入需要存储特殊字符,而不是其转义的等价物。

示例表:

代码语言:javascript
复制
CREATE TABLE xml_test
(
   key_num NUMBER,
   value_desc VARCHAR2 (1000)
);

使用DBMS_XMLSTORE的示例函数:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION fn_insertxml
(
   pi_xmldoc IN CLOB,
   pi_tablename IN VARCHAR2
)
   RETURN NUMBER
IS
   v_ctx_type DBMS_XMLSTORE.ctxtype;
   v_rows NUMBER;
BEGIN
   -- Set the context to the table to be inserted into
   v_ctx_type := DBMS_XMLSTORE.newcontext (pi_tablename);

   -- Insert document
   v_rows := DBMS_XMLSTORE.insertxml (v_ctx_type, pi_xmldoc);

   -- Close the context
   DBMS_XMLSTORE.closecontext (v_ctx_type);

   RETURN v_rows;
END fn_insertxml;

示例代码:

代码语言:javascript
复制
DECLARE
   k_injected_input CONSTANT VARCHAR2 (4000) := q'[<![CDATA[x]]></VALUE_DESC><KEY_NUM>-1</KEY_NUM><VALUE_DESC><![CDATA[example text]';
   k_xml_doc CONSTANT VARCHAR2 (4000) := q'[<ROWSET><ROW num='0'><KEY_NUM><![CDATA[1]]></KEY_NUM><VALUE_DESC><![CDATA[%s]]></VALUE_DESC></ROW></ROWSET>]';

   v_row_num NUMBER;
   v_sanitised_input varchar2(4000);
   v_xml_doc VARCHAR2 (4000);
BEGIN
   --Sanitised input
   v_sanitised_input := DBMS_XMLGEN.CONVERT (k_injected_input, DBMS_XMLGEN.entity_encode);

   --If I insert this as it is, the sanitized input is stored
   v_xml_doc := REPLACE (k_xml_doc, '%s', v_sanitised_input);
   v_row_num := fn_insertxml (v_xml_doc, 'XML_TEST');

   --If I attempt to decode the xml it is open to XML injection (key_num is set to -1)
   v_sanitised_input := DBMS_XMLGEN.CONVERT (v_sanitised_input, DBMS_XMLGEN.entity_decode);
   v_xml_doc := REPLACE (k_xml_doc, '%s', v_sanitised_input);
   v_row_num := fn_insertxml (v_xml_doc, 'XML_TEST');
END;

有人有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-11 08:28:38

解决了问题。

在不太可能的情况下,其他人会遇到这种情况。只要转义字符没有包装在CDATA中,DBMS_XMLSTORE.insertxml就会将它们转换回原始值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39781305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档