2

我正在研究StackQL.net,它只是一个简单的网站,允许您在 StackOverflow 公共数据集上运行临时 tsql 查询。它很丑(我不是平面设计师),但它有效。

我做出的选择之一是我不想对帖子正文的全部内容进行 html 编码。这样,您可以从查询中的帖子中看到一些格式。它甚至会加载图像,我可以接受。

但我担心这也会使<script>标签保持活动状态。有人可以在 stackoverflow 答案中植入恶意脚本;他们甚至可以立即删除它,所以没有人看到它。人们第一次访问时尝试的最常见的查询之一是简单的Select * from posts,因此只要稍加计时,这样的脚本最终可能会在几个人的浏览器中运行。在更新到(希望即将发布的)10 月数据导出之前,我想确保这不是问题。

确保仅对脚本标签进行编码的最佳、最安全的方法是什么?

4

6 回答 6

3

您可能需要修改HTMLSanatize 脚本以适应您的目的。它由 Jeff Atwood 编写,允许显示某些类型的 HTML。由于它是为 Stack Overflow 编写的,因此也符合您的目的。

我不知道它是否与 Jeff 当前部署的内容“最新”,但这是一个很好的起点。

于 2009-09-29T13:48:59.553 回答
2

不要忘记onclick, onmouseover, etc 或 javascript:psuedo-urls ( <img src="javascript:evil!Evil!">) 或 CSS ( style="property: expression(evil!Evil!);") 或...</p>

除了简单的脚本元素之外,还有许多攻击媒介。

实施白名单,而不是黑名单。

于 2009-09-29T13:44:21.030 回答
1

如果消息是 XHTML 格式,那么您可以进行 XSL 转换并编码/剥离您不想要的标签和属性。如果您使用 TinyMCE 或 CKEditor 之类的东西来提供输出 XHTML 的所见即所得编辑器,它会变得容易一些。

于 2009-09-29T13:45:04.333 回答
0

简单地破坏<script>标签怎么样?只为那个标签转义<>以 结尾&lt;script&gt;,可能是一种简单易行的方法。

当然链接是另一个向量。您还应该禁用 的每个实例,以及以*href='javascript:'开头的每个属性。on

可以肯定的是,从轨道上对其进行核打击。

于 2009-09-29T13:45:03.390 回答
0

但我担心这也会使<script标签保持活动状态。

哦,这只是可能导致跨站点脚本编写的 HTML“恶意内容”的开始。还有事件处理程序;内联、嵌入和链接的 CSS(表达式、行为、绑定)、Flash 和其他可嵌入插件、用于利用站点的 iframejavascript:以及其他危险方案(比您想象的要多!)在每个可以接受 URL 的地方,元刷新, UTF-8 overlongs, UTF-7 mis-sniffing, data binding, VML 和其他非 HTML 内容,被许可浏览器解析为脚本的损坏标记...

简而言之,任何使用简单正则表达式清理 HTML 的快速修复尝试都会失败。

要么转义所有内容,以便将任何 HTML 显示为纯文本,要么使用完整的基于解析器和白名单的清理程序。(并保持最新,因为即使这也是一项艰巨的工作,而且其中经常有新发现的漏洞。)

但是您不是使用与 SO 本身相同的 Markdown 系统来呈现帖子吗?那将是显而易见的事情。我不能保证 Markdown 中没有允许跨站点脚本的漏洞(过去肯定有过,而且可能还有一些更晦涩的漏洞,因为它是一个相当复杂的系统)。但至少你不会比 SO 更不安全!

于 2009-09-29T14:05:09.483 回答
-1

使用正则表达式将脚本标签替换为编码标签。这将过滤其中包含“脚本”一词的标签HtmlEncode。因此,所有的脚本标签,例如<script>,</script>等等<script type="text/javascript">都将被编码,并且不会对字符串中的其他标签进行编码。

Regex.Replace(text, @"</?(\w+)[^>]*>",
            tag => tag.Groups[1].Value.ToLower().Contains("script") ? HttpUtility.HtmlEncode(tag.Value) : tag.Value,
            RegexOptions.Singleline);
于 2018-07-23T09:16:20.503 回答