【问题标题】:Will UTF-8 character encoding pose any security implication in web application?UTF-8 字符编码是否会对 Web 应用程序造成任何安全隐患?
【发布时间】:2014-07-20 17:16:15
【问题描述】:

我们在 tomcat 下部署了一个 Servlet/Jsp Web 应用程序。引起我们注意的是,截至今天,它不支持扩展的 ASCII 字符,即支持包含“扩展 ASCII”字符的用户输入,例如 é ü ç。我们不需要支持国际化。

我的调查和原型设计表明,我们的服务器(servlet/jsp)端应该为请求和响应显式设置字符编码为“UTF-8”。然后事情就会奏效。 (这是一种简化。我知道有很多层。但在我们的例子中这是违规者。我们现有的服务器端代码忽略了字符编码)。

到目前为止一切顺利。然而,字符编码的处理对 Web 应用程序具有安全隐患。当我阅读 OWASP 时,大多数与 unicode 相关的安全问题或攻击似乎都与旧的 UTF-8 解析器有关。但这仍然是现代浏览器(https://www.owasp.org/index.php/Canonicalization,_locale_and_Unicode)的问题吗?这是 OWASP 的摘录。

只要允许输入数据,就可以使用 Unicode 输入数据以伪装恶意代码并允许各种攻击

简而言之,如果我们想将 servlet 中的字符编码从默认(根据 servlet 规范“ISO-8859-1”)更改为“UTF-8”,我们会不会引起任何新的安全问题?或者任何关于具体攻击示例的指针,以及服务器端代码如何保护自己。

【问题讨论】:

    标签: security tomcat servlets web-applications utf-8


    【解决方案1】:

    无论有什么问题,您的代码可能已经很容易受到它们的攻击,因为它忽略了 unicode 编码,因为无论您是否愿意,浏览器都会向您发送 unicode(如果用户将其粘贴到表单中,例如粘贴他们从 MS Word 复制的文本,其中将包含那些花引号)。问题基本上是如果您出于安全原因检查某些字符,但没有意识到有大量的 unicode 字符可以在稍后的步骤中转换为该字符,而您在这一步中缺少这些字符。就像由于某种原因您正在检查 " 但没有考虑到大引号。

    【讨论】:

    • 对于您引用的具体示例,我不清楚为什么 unicode 字符会在应用程序代码级别的安全检查之后进行转换?以下是我认为的事件顺序:
    • (a)在应用程序代码调用“request.getParameter(xxx)”之前,它必须知道“字符编码”。如果未指定,则 servlet 规范默认为 ISO-8859-1。容器必须解码用户输入参数值 (b) 然后应用程序代码可以根据需要进行安全检查。因此,根据我的理解,在容器级别执行的“unicode 解码或任何解码”会在应用程序级别的安全检查之前发生?
    • 也许我明白你的意思:既然浏览器无论如何都可以发送 unicode 字符,那么如果服务器端不知道 unicode,那么容器级解码将无法正确解码用户输入,因此应用程序级安全检查可能会错过一些检查。请指教。
    • 例如,如果您没有在数据库上使用准备好的语句,而是使用双引号而不是单引号作为字符串引号。如果您喜欢sql="select * from table where x=\""+param+"\"";,则数据库服务器可能会将参数中的 unicode 大引号转换为常规引号。也许您甚至尝试将参数中的所有引号替换为其他内容。它会失败。这就是为什么准备好的语句是要走的路的原因之一。
    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2012-10-29
    • 2010-12-01
    • 1970-01-01
    • 2015-04-15
    • 2011-02-28
    相关资源
    最近更新 更多