我是否需要确保输出数据是有效的UTF-8?

时间:2009-07-04 18:07:58

标签: php utf-8

我有一个网站告诉输出是UTF-8,但我从来没有确定它是。我应该使用正则表达式或Iconv库将UTF-8转换为UTF-8(留下无效序列)吗?如果我不这样做,这是一个安全问题吗?

4 个答案:

答案 0 :(得分:2)

首先,我永远不会盲目地将其编码为UTF-8(可能),因为这会导致无效的字符,就像你说的那样。在尝试这样的事情之前,我当然会尝试检测内容的字符集是否 UTF-8。

其次,如果有问题的内容来自您可以控制和控制字符集的来源,例如使用UTF-8的文件或在表格和连接中使用UTF-8的数据库,我会相信这个来源,除非有些东西给我提示我不能,并且有一些时髦的东西。如果内容来自您控制范围之外的或多或少的随机位置,那么更有理由检查它并可能尝试从其他字符集重新编码og变换(如果您可以检测到它)。所以底线是:这取决于。

至于这是一个安全问题与否,我不会这么认为(至少我不能想到任何可以利用这种情况的情况)但是我会留给其他人来确定这一点。

答案 1 :(得分:1)

不是安全问题,但如果发送无效的UTF-8字节流,您的用户(尤其是非英语用户)会非常恼火。

在最好的情况下(大多数浏览器都这样做),所有无效字符串都会消失或显示为乱码。最糟糕的情况是浏览器退出解释您的页面并说出“无效编码”之类的内容。这就是例如Linux上的一些文本编辑器(即gedit)。

好吧,保持现实:如果你有一个以英语为中心的网站,而不是非常依赖一些数学字符或Unicode箭头,它几乎没有任何区别。但是如果你服务,例如,一个中国网站,你可以完全搞砸它。

干杯,

答案 2 :(得分:1)

每个人都把乱七八糟的东西搞砸了,所以一般情况下你不能相信任何外部来源。验证提供的输入确实对其声称使用的字符集有效是一种很好的做法。幸运的是,使用UTF-8,您可以对有效性做出相当安全的断言。

答案 3 :(得分:0)

如果用户可以发送任意字节,那么是的,不确保有效的utf8输出存在安全隐患。但是,根据您存储数据的方式,还有一些安全隐患,即无法确保输入上的有效utf8数据(例如,可以创建适用于utf8的this SQL injection attack变体输入是否允许utf8无效utf8),所以你真的应该使用iconv在输入时将utf8转换为utf8,并且只是避免在输出时验证utf8的整个问题。

要检查输出是否有效utf-8的两个主要安全原因是避免“过长”字节序列 - 也就是说,字节序列的情况意味着某些字符,如“<”,但是以多个字节编码 - 并避免无效的字节序列。过长的编码问题很明显 - 如果您的过滤器将“<”更改为“&lt;”,则可能无法转换表示'<'的序列,但写得与众不同。请注意,所有当前生成的浏览器都会将超长序列标记为无效,但有些人可能会使用旧浏览器。

无效序列的问题是某些utf-8解析器将允许无效序列吃掉跟随无效序列的一些有效字节。如果每个人都有一个当前的浏览器,那么这不是问题,但是......