我在我的html网站上用C实现了一个搜索引擎。我的整个网络都是用C语言编写的。
我理解html输入清理是必要的,因为攻击者可以将这2个html片段输入我的搜索页面,以欺骗我的搜索页面下载并显示外国图像/脚本(XSS):
<img src="path-to-attack-site"/>
<script>...xss-code-here...</script>
通过搜索'&lt;'不会阻止这些攻击吗?和'&gt;'并从搜索查询中剥离它们?这不会导致两个脚本无用,因为它们不会被视为html吗?我已经看到html过滤超出了这个范围,他们绝对过滤掉所有JavaScript命令和html标记!
答案 0 :(得分:16)
输入消毒本身并非“必要”。
最好删除输入中你从不想要的控制字符之类的内容,当然还有特定字段需要进行特定类型检查(例如,电话号码包含数字)。
但是,为了打败跨站点脚本攻击,在所有表单输入中运行转义/剥离功能绝对是错误的。这很遗憾,但在许多情况下都不足以防止XSS。
HTML-escaping是一个输出问题,必须在输出阶段解决:也就是说,通常在将字符串模板到输出HTML页面时。将<
转换为<
,&
转换为&
,并在属性值中转义您用作属性定界符的引用,就是这样。不能进行HTML注入。
如果您尝试在表单输入阶段进行HTML转义或过滤,那么每当您输出来自不同来源的数据时,您将会遇到困难,并且您将要破坏用户输入包括<
,&
和"
字符。
还有其他形式的逃避。如果您尝试使用用户值创建SQL查询,则需要在此时执行SQL字符串文字转义,这与HTML转义完全不同。如果要将提交的值放在JavaScript字符串文字中,则必须执行JSON样式的转义,这也是完全不同的。如果要在URL查询字符串参数中放置值,则需要进行URL转义,而不是HTML转义。处理此问题的唯一合理方法是将字符串保持为纯文本,并仅在将它们输出到HTML等不同上下文时将其转义。
通过搜索'&lt;'不会阻止这些攻击吗?和'&gt;'并从搜索查询中删除它们?
是的,如果你还剥掉了&符号和引号。但是,用户将无法在其内容中使用这些字符。想象一下,我们尝试在SO上进行此对话,而无法使用<
,&
或"
!如果您想在某些上下文(HTML,JavaScript,CSS ...)中使用时删除可能特殊的每个字符,则必须禁止几乎所有标点符号!
<
是一个有效的字符,用户应该被允许输入,并且应该在页面上以字面小于号的形式出现。
我的整个网络都是用C语言编写的。
我很抱歉。
答案 1 :(得分:-1)
在大多数情况下,编码括号确实足以防止XSS,因为标签之间的任何内容都将显示为纯文本。