我一直在努力迫使read_xml
函数(xml2
包)将我的字符输入视为文字字符串。显然,如果输入看起来不够像XML,它将尝试以url和本地文件名打开它。即使这不是一个明显的安全漏洞,这也吓坏了我(但我绝对可以看到它的情况)。因此,简而言之,如何强制该函数将我的输入解释为文字xml文本,并禁止进行url /文件名查找的可能性?
我不希望使用XML
软件包,因为它显然是孤立的。
答案 0 :(得分:2)
查看xml2:::read_xml.character
的源,如果它包含任何<
或>
符号,它将把数据作为原始输入。然后,它将值传递到read_xml.raw
。您可以编写自己的包装程序以确保始终如此。
read_xml_literal <- function(x, ..., as_html=FALSE, options = "NOBLANKS") {
if (length(x) == 0) {
stop("Document is empty", call. = FALSE)
}
options <- xml2:::parse_options(options, xml2:::xml_parse_options())
if (grepl("<|>", x)) {
xml2:::read_xml.raw(charToRaw(enc2utf8(x)), "UTF-8", ...,
as_html = as_html, options = options)
} else {
stop("Input does not '<' or '>'")
}
}
这可行
read_xml_literal("<foo><bar /></foo>")
这不是
read_xml_literal(xml2_example("cd_catalog.xml"))
答案 1 :(得分:1)
一种方法是将您的文字文本显式强制为raw
值,并使用该值调用read_xml
:
xml2::read_xml(charToRaw(lit))
因为这是read_xml
在内部对文字XML字符串所做的工作。但是,缺少标签read_xml
将会总是失败,因为它期望至少有一个周围的标签。但这至少可以防止read_xml
意外打开文件。