1

在我的网站上有一个标题应该显示“欢迎用户名。”。

<span>Welcome <?php echo $username; ?>.</span>

问题是如果用户将他的名字更改为 U+202Eusername(其中 U+202E 是从右到左的覆盖字符,或 RLO),所有布局都会中断。

它不是显示“Welcome emanresu .”,而是显示“Welcome .emanresu ”或“ .emanresu Welcome”或类似的内容。我尝试在用户名后添加一个 U+202C(流行定向格式或 PDF)字符,它起作用了。像这样:

<span>Welcome <?php echo $username; ?>&#x202c;.</span>

但是,如果用户名有多个 RLO 字符,则会再次中断。所以我应该做的是将 RLOs 字符与 PDFs 字符匹配,但我不确定如何做到这一点。根据 W3C 规范,没有解决方案。我在这里错过了什么吗?

4

4 回答 4

2

您可能对 HTML5 标签感兴趣<bdi>

详情:http ://rishida.net/blog/?p=564

于 2011-08-27T10:35:55.553 回答
1

为什么不在 $username 中搜索此字符,如果找到,请更改<span><span dir="rtl">. 还将这些字符替换为 $username 中的空白

于 2011-08-27T10:44:48.390 回答
0

W3C 的解决方案是您应该从称为“<a href="http://www.w3.org/TR/unicode-xml/" rel="nofollow noreferrer">不合适的组中过滤掉 RLO 和其他字符用于标记”。

同时过滤掉其他不需要的控制代码,如 ASCII 0x00–0x1F(可能包括或不包括换行符)和 0x7F-0x9F。有关背景,请参阅此问题

(您也应该使用echo htmlspecialchars($username);。也许您的用户名不能包含<,或者&但在输出阶段依赖这不是一个好主意。习惯于调用htmlspecialchars所有输出到页面的内容;定义一个快捷方式必要时为它工作。)

于 2011-08-28T11:11:36.020 回答
0

了解 Unicode 中的双向 (BIDI) 文本

这篇文章是一篇非常有趣的关于 bidi 问题的一般性读物,在结尾附近还有一个名为“过滤用户输入”的部分,似乎正在谈论您正在谈论的问题。

于 2011-08-27T11:12:06.093 回答