在验证用户输入字段时不允许HTML表格的原因是什么?

时间:2009-01-23 03:02:17

标签: xss markdown

我正在编写一些wiki,并通过我的所有语法高亮选项。在wiki语法(mediawiki)和markdown +白名单标签之间进行辩论。我想我更喜欢后者,但我认为我的用户需要表格。为什么Stackoverflow上不允许使用表?

<table> <tr> <td> </td> </tr> </table>

6 个答案:

答案 0 :(得分:4)

它们没有Q&amp; A格式的用途。至少我想不出一个原因,我需要用一张桌子来回答别人的问题,或者自己问一个。

另外,无论如何你都可以这样做:

cell 1-1      cell 1-2
cell 2-1      cell 2-2

编辑:所以在阅读了我的回复评论后,我发现可能会有一些案例表可以提供更好的视觉辅助。所以我打算推荐类似于CSV的降价;我认为这很容易打字和实施。

答案 1 :(得分:2)

如果您的网站是在表格之上构建的,并且您无法编写足以验证用户HTML在语法上是否正确的正则表达式,那么禁用表格将是个好主意,否则您的布局可能会受到影响。

即使您的网站没有放置表格,在评论帖等中有两套格式错误的表格HTML也可能导致您的网站被污损。

答案 2 :(得分:2)

三个原因:

  • 与任意Markdown实现的兼容性,
  • 安全的用户输入,
  • 与布局无关的内容

标准Markdown 支持表格。它就像电子邮件一样。 SO使用标准Markdown,因此没有表格。

Some Markdown扩展支持表格,但它们之间不兼容,这使得Markdown的想法无效,因为内容依赖于特定的Markdown实现。

因此,表格只能用HTML-inside-Markdown制作。哪个也不好。我确信Markdown2PDF,Markdown2TeX和Markdown2TheNextBigML转换器很容易编写。将带有嵌入式HTML的Markdown转换为除HTML之外的任何内容并非易事。因此,如果允许(某些)嵌入式HTML,则无需将所有内容存储在Markdown(纯文本)中。

清理所有用户提交的HTML的另一个原因很明显,正确解析它太困难和昂贵,并且可以打破布局(例如<table width="10000" height="10000">)。

最后,轻量级(纯Markdown)标记有一个巨大的好处:它不依赖于特定的站点布局(屏幕宽度,填充,边距,对齐,列宽等)。因此,如果从现在开始一年后进行SO重新设计,则不需要编辑内容(HTML代码段隐含地依赖于特定的CSS)。额外奖励:更容易在第三方应用程序(如手机客户端)中使用。

答案 3 :(得分:1)

我认为这是武断的。它们可能有很多用途,但似乎这里首选手动对齐固定宽度的文本(我认为这是一种黑客行为)。

就个人而言,我更喜欢BBCode风格的语法。

  • 明确
  • 几乎就像HTML
  • 因为使用括号而不是角度
  • ,所以不能与HTML混淆

“显式”意味着任何预期的效果几乎可以用任何组合表示,并且没有意外的效果(例如在使用许多特殊字符之一时的降价中)。例如,我不知道如何让这个网站以非固定字体(* word *)显示星号中的单词。摩尔斯电码不能使用下划线,因为它也是一个特殊字符。在BBCode中,只有一个特殊字符:[

此外,输入清理变得更加简单。

答案 4 :(得分:1)

考虑到Wisiwyg javascript编辑器(WMD)必须实时呈现您正在输入的内容 (Jeff从一开始就想要的一个重要特征)

因此,我认为表的动态更新过于复杂,无法解析/显示,因为HTML翻译器在您输入时必须解释不完整的表结构。
这意味着要处理像colspan,rowspan,不正确的标题结构等功能。

因此,要获得更好的动态预览体验,表格会完全划伤。

答案 5 :(得分:1)

在许多情况下,表格很有用:数据表格,显示矩阵,显示算法的可能结果等。

我认为你不需要像HTML表那样复杂的东西(带有rowspan和all),普通的CSV对于99%的用例来说已经足够了。它还允许javascript动态渲染器轻松完成其工作。

CSV众所周知,轻巧,易于打字和理​​解。除此之外唯一需要的是CSV数据的开始和结束标记。例如[csv] ... [/ csv]或|| ... ||。这可能是它的样子:

[csv]
**XOR**,**true**,**false**
**true**, false, true
**false**, true, false
[/csv]

这将产生一个像这样的表:

XOR     true    false
true    false   true
false   true    false    

(第一行和第一列用粗体字符表示)