2

我正在使用 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在他的页面上有一些例子

4

1 回答 1

1

我不是 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__示例如何引起关注,因为由于没有脚本,因此无法将其用于 XSS 攻击。但是,如果您也想防止用户弄乱布局,那么我猜您应该转义所有降价字符。

于 2013-11-06T16:07:26.720 回答