首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >规范化与输出编码

规范化与输出编码
EN

Security用户
提问于 2012-08-09 01:40:00
回答 2查看 5.5K关注 0票数 8

我正在阅读OWASP的安全编码实践检查列表,在他们的“输入验证”部分中,他们有一项内容如下:

如果必须允许任何潜在危险字符(<>"'%()&+\\'\")作为输入,请确保实现了其他控件,如输出编码。利用规范化来解决双重编码或其他形式的混淆攻击。

  • 什么是“输出编码”,谁能提供一个验证例程如何利用它的具体例子?
  • 什么是“双重编码”,为什么是“混淆攻击”?
  • 什么是“规范化”,为什么要防止双重编码?

对于第三个问题,我发现OWASP为规范化提供了一个相当模糊的定义:将各种数据编码简化为一个简单的表单。但这个定义并不能真正帮助我理解他们在说什么。

我很擅长Java和Python,但可以在任何语言中学习。我只是想想象一下他们在这里说的话,很难看到“森林穿过树林”。提前感谢!

EN

回答 2

Security用户

回答已采纳

发布于 2012-08-09 08:33:51

我认为描述规范化最好的方法是记住它起源于佳能,意思是一篇真实的文字。他们谈论的是将不受信任的数据格式化为明确的表示形式,这样就不会被任何软件过程错误地表示。

第一步是将您的输入保存在某个地方。您的输入可以编码为ASCII、UTF-8、UTF-16或任意数量的其他编码方案。软件必须检测到这一点,并以单一格式适当地转换和存储数据。它现在是在一个明确的单一格式,因此已知是正确的,当解释为这样,即它是经典。这使得以后输出数据时具有绝对的确定性。

例如,如果我将'; DROP TABLE users; --插入到表单中,如果应用程序编写得很糟糕,它可能会导致SQL注入。但是,对于规范化,数据只是数据,不可能表示为SQL查询的一部分。实际上,SQL的规范化形式是参数化查询。此外,必须采取步骤将文本编码转换为单个已知类型,以便只存储有效的编码点。如果不这样做,代码点可能会被误解为不同的字符。

可以给出一个类似的例子,以便输出到HTML中。如果数据库包含<script>alert('xss!');</script>,那么一个天真的应用程序可能会直接将它写到页面上,并引入一个安全问题。但是,如果以输出编码的形式进行适当的规范化,我们就会得到<script>alert('xss!');</script>,浏览器不能曲解它。

双重编码是用来欺骗某些解析器的一种伎俩。攻击者识别您正在使用的编码,然后以这种格式对其数据进行预编码。解析器错误地将数据假定为佳能,并将其作为佳能处理。其结果是数据处理不当,从而发生了漏洞攻击。这是一种混淆攻击,因为攻击者混淆了利用数据,因此编码器不会看到坏的字符。

票数 3
EN

Security用户

发布于 2012-08-09 08:44:56

  • 什么是“输出编码”,谁能提供一个验证例程如何利用它的具体例子?

输出编码意味着对数据进行适当的编码,以适应其所处的上下文。例如,假设您希望动态显示来自不受信任的源的名称:Your name is:<b>Foo bar</b> (如果名称包含html字符),您希望对这些字符进行编码,因此结果是<b>Foo <i> Bar</b>而不是<b>Foo <i> Bar</b>

因此,将<转换为<是html编码的一个例子。但是,如果上下文是html属性,则可能还必须对空格字符进行编码,因为属性可能没有引号,因此空格可能会破坏属性,并且输入可以创建一个新属性:<input value=data>被攻击:<input value=data onclick=javascript:alert(1)/>

  • 什么是“双重编码”,为什么是“混淆攻击”?

当您在URL中键入某些字符时,这些字符会变成URL编码的(通常,虽然在IE中通常不是这样):

  1. 未编码参数:test<script>alert(1)</script>
  2. URL编码参数:test%3Cscript%3Ealert%281%29%3C%2fscript%3E
  3. 双重编码参数:test%253Cscript%253Ealert%25281%2529%253C%252fscript%253E

根据输入参数的处理,双重编码可能通过某些过滤器/验证器,最终破坏它们被回显的上下文(从而导致XSS)。

  • 什么是“规范化”,为什么要防止双重编码?

规范化是以最简单的形式写出某物的行为,因此某物的规范形式是写它的“最简单”形式。要在这个上下文中规范化,它意味着不编码数据,直到它不再改变。

一个三重编码的<-sign,经历了以下转换:

  1. %25253C
  2. %253C
  3. %3C
  4. <

另一个例子可以是,如果输入被写成八进制转义,超长UTF序列和深奥的编码,例如UTF-7。为了消除歧义,规范化将它们转换成一个公共的基础。

票数 5
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/18328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档