强制 read_xml 将字符串解释为文字 XML
Force read_xml to interpret string as literal XML
我一直在努力强制 read_xml
函数(xml2
包)将我的字符输入视为文字字符串。显然,如果输入看起来不像 XML,它会尝试将其作为 url 以及本地文件名打开。这把我吓坏了,即使它不是一个明显的安全漏洞(但我绝对可以看到它存在的情况)。所以,简而言之,我如何强制函数将我的输入解释为文字 xml 文本,并禁用 url/filename 查找的可能性?
我不想使用 XML
包,因为它显然是孤立的。
查看 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"))
一种方法是将您的文字文本显式强制转换为 raw
值并调用 read_xml
:
xml2::read_xml(charToRaw(lit))
因为这就是 read_xml
在内部对文字 XML 字符串所做的事情。然而,缺少任何标签 read_xml
将 总是 失败,因为它需要至少一个周围的标签。但至少这可以防止 read_xml
意外打开文件。
我一直在努力强制 read_xml
函数(xml2
包)将我的字符输入视为文字字符串。显然,如果输入看起来不像 XML,它会尝试将其作为 url 以及本地文件名打开。这把我吓坏了,即使它不是一个明显的安全漏洞(但我绝对可以看到它存在的情况)。所以,简而言之,我如何强制函数将我的输入解释为文字 xml 文本,并禁用 url/filename 查找的可能性?
我不想使用 XML
包,因为它显然是孤立的。
查看 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"))
一种方法是将您的文字文本显式强制转换为 raw
值并调用 read_xml
:
xml2::read_xml(charToRaw(lit))
因为这就是 read_xml
在内部对文字 XML 字符串所做的事情。然而,缺少任何标签 read_xml
将 总是 失败,因为它需要至少一个周围的标签。但至少这可以防止 read_xml
意外打开文件。