XSS在使用OpenCPU和knitr打印用户提供的数据时出现问题



我正在使用openCPU和knitr在调查后生成自定义反馈。为此,我基本上让调查开发人员指定 rmd 文件。在此用例中,调查开发人员是受信任的,但调查对象可能不受信任。

我现在正在考虑XSS。这不是一个大问题,因为用户反馈当然通常只会显示给输入显示数据的用户,但当然像"<"这样的字符将用于非恶意原因,我想提前考虑并探索自由混合 R 与 Web 应用程序的一些考验和磨难。

在我看来,Knitr 和 R 通常不是由不受信任的用户和 XSS 制作的。OpenCPU纠正了将AppArmored-R作为API运行的许多安全问题,但我想知道像我这样的最大灵活性方法是否也可以证明。

可以区分受信任和不受信任标记的可能点:

  1. 在编织之前,即我将转义的用户数据传递给 rmd 文件。缺点:一个忘乎所以的调查开发人员可能会意外地逃脱它,或者因为它在某些情况下很烦人。
  2. 在针织过程中。我想这将是理想的,但我不知道这是否可能,特别是如果调查开发人员可能会更改块设置。
  3. 针织后。我认为不可能在事后区分受信任和不受信任的标记。

一些代码可以粘贴到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在他的页面上有一些例子。

我不是 100% 确定我理解你的担忧。如果你担心XSS,你担心用户在降价中包含javascript标签,对吗?

```{r}
userdata = '<script>alert("I am evil")</script>'
```
```{r,results='asis'}
cat(userdata)
```

您可以通过转义 html 字符来防止这种情况。我认为在降价定义中有一节是关于这一点的。因此,您需要转义所有用户输入,无论是在将它插入数据库还是在提取它时:

escape <- function(x){
  x <- gsub("<", "&lt;", x);
  x <- gsub(">", "&gt;", x);
  x <- gsub("&", "&amp;", x);
  x
} 

尝试运行以下命令:

```{r output}
escape <- function(x){
  x <- gsub("&", "&amp;", x);
  x <- gsub("<", "&lt;", x);
  x <- gsub(">", "&gt;", x);
  x
} 
```
```{r}
userdata = escape('<script>alert("I am evil")</script>')
```
```{r,results='asis'}
cat(userdata)
```

这应该处理任何代码注入。我不太确定__bold__示例是一个问题,因为 afaics 这不能用于 XSS 攻击,因为没有脚本。但是,如果你想防止用户也弄乱布局,那么你应该转义我猜的所有降价字符。

最新更新