1 ответ

Лучший ответ

Как правило, вам следует избегать синтаксического анализа произвольной строки, введенной пользователями. Обычно этого можно избежать, разработав соответствующее программное обеспечение.

В любом случае, просто извлеките язык из выражения:

make_function(alist(a = 1, b = 2), parse(text = 'a^b')[[1]])

Изменить:

Просто чтобы показать, как вы можете проверить белый список (без регулярного выражения):

whitelist <- c("+", "*", "-", "/", "^", "**", "%%", "%/%", "sin", "cos", "tan", "abs") #etc.
expr <- parse(text = "cos(x)^sin(x)*abs(x)")
foo <- function(e) if (length(e) > 1) lapply(as.list(e), foo) else return(e)
funs <- unlist(foo(expr[[1]]))
funs <- funs[vapply(funs, function(x) {x <- eval(x); is.function(x) | is.primitive(x)}, FUN.VALUE = TRUE)]
all(vapply(funs, function(x) as.character(x) %in% whitelist, FUN.VALUE = TRUE))

Анализ и оценка произвольного кода в публичном блестящем приложении представляет собой угрозу безопасности. Эта проверка гарантирует, что можно использовать только предопределенный набор функций. Если вы не избегаете меньших рисков, вы можете вместо этого просто использовать черный список (запрещающие функции, такие как system, system2, shell и т. Д.).

4
Roland 16 Окт 2019 в 07:43