为什么需要进行如此多的HTML输入清理?

时间:2010-10-03 13:45:03

标签: html xss sanitization

我在我的html网站上用C实现了一个搜索引擎。我的整个网络都是用C语言编写的。

我理解html输入清理是必要的,因为攻击者可以将这2个html片段输入我的搜索页面,以欺骗我的搜索页面下载并显示外国图像/脚本(XSS):

<img src="path-to-attack-site"/>
<script>...xss-code-here...</script>

通过搜索'&lt;'不会阻止这些攻击吗?和'&gt;'并从搜索查询中剥离它们?这不会导致两个脚本无用,因为它们不会被视为html吗?我已经看到html过滤超出了这个范围,他们绝对过滤掉所有JavaScript命令和html标记!

2 个答案:

答案 0 :(得分:16)

输入消毒本身并非“必要”。

最好删除输入中你从不想要的控制字符之类的内容,当然还有特定字段需要进行特定类型检查(例如,电话号码包含数字)。

但是,为了打败跨站点脚本攻击,在所有表单输入中运行转义/剥离功能绝对是错误的。这很遗憾,但在许多情况下都不足以防止XSS。

HTML-escaping是一个输出问题,必须在输出阶段解决:也就是说,通常在将字符串模板到输出HTML页面时。将<转换为&lt;&转换为&amp;,并在属性值中转义您用作属性定界符的引用,就是这样。不能进行HTML注入。

如果您尝试在表单输入阶段进行HTML转义或过滤,那么每当您输出来自不同来源的数据时,您将会遇到困难,并且您将要破坏用户输入包括<&"字符。

还有其他形式的逃避。如果您尝试使用用户值创建SQL查询,则需要在此时执行SQL字符串文字转义,这与HTML转义完全不同。如果要将提交的值放在JavaScript字符串文字中,则必须执行JSON样式的转义,这也是完全不同的。如果要在URL查询字符串参数中放置值,则需要进行URL转义,而不是HTML转义。处理此问题的唯一合理方法是将字符串保持为纯文本,并仅在将它们输出到HTML等不同上下文时将其转义。

  

通过搜索'&lt;'不会阻止这些攻击吗?和'&gt;'并从搜索查询中删除它们?

是的,如果你还剥掉了&符号和引号。但是,用户将无法在其内容中使用这些字符。想象一下,我们尝试在SO上进行此对话,而无法使用<&"!如果您想在某些上下文(HTML,JavaScript,CSS ...)中使用时删除可能特殊的每个字符,则必须禁止几乎所有标点符号!

<是一个有效的字符,用户应该被允许输入,并且应该在页面上以字面小于号的形式出现。

  

我的整个网络都是用C语言编写的。

我很抱歉。

答案 1 :(得分:-1)

在大多数情况下,编码括号确实足以防止XSS,因为标签之间的任何内容都将显示为纯文本。