我正在使用 openCPU 和 knitr 在调查后生成自定义反馈。为此,我基本上让调查开发人员指定 rmd 文件。在这个用例中,调查开发人员是受信任的,但调查人员可能不是。
我现在正在考虑 XSS。这不是一个大问题,因为用户反馈当然通常只会显示给输入显示数据的用户,但当然像“<”这样的字符将用于非恶意原因,我想提前考虑一下探索将 R 与 Web 应用程序自由混合的一些试验和磨难。
在我看来,Knitr 和 R 通常不是由不受信任的用户和 XSS 制作的。OpenCPU 纠正了将 AppArmored-R 作为 API 运行的许多安全问题,但我想知道像我这样的最大灵活性方法是否也可以得到证明。
可以区分可信和不可信标记的可能点:
- 在编织之前,即我将转义的用户数据传递给 rmd 文件。缺点:一个健忘的调查开发人员可能会意外地逃脱它,或者因为它在某些情况下很烦人。
- 在编织过程中。我想这将是理想的,但我不知道这是否可能,特别是如果调查开发人员可能会改变块设置。
- 编织后。我认为事后区分可信和不可信标记是不可能的。
一些代码粘贴到OpenCPU 的 knitr 应用程序中:
```{r}
good_userdata = 'I like brackets [].'
bad_userdata = 'some text should not be
[linked](javascript:location.href=\'http://example.com?secrets\';), <s>struck</s> or __bold__'
escape_html = highr:::escape_html
escape_md <- function(x){
x <- gsub('\\[', '\\\\[', x);
x <- gsub('_', '\\\\_', x);
x
}
good_userdata_escaped = escape_md(escape_html(good_userdata))
bad_userdata_escaped = escape_md(escape_html(bad_userdata))
```
## let's say survey devs wants to print text like this
```{r}
cat(good_userdata_escaped)
cat(bad_userdata_escaped) # doesn't know about text like this
```
## gets annoyed, does
```{r}
good_userdata_escaped <- gsub('\\\\', '', good_userdata_escaped);
bad_userdata_escaped <- gsub('\\\\', '', bad_userdata_escaped);
```
##
so that this looks nice
```{r}
cat(good_userdata_escaped)
```
## later renders the same text inline, so that is evaluated as markdown
`r good_userdata_escaped # doesn't look dangerous`
`r bad_userdata_escaped`
编辑 2
抱歉,我只提供了一些 HTML 标签,认为可能的 XSS 攻击很明显。Michel Fortin在他的页面上有一些例子。