在我的网站上有一个标题,应显示“欢迎用户名。”。
<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; ?>‬.</span>
但是,如果用户名有多个RLO字符,则会再次中断。所以我应该做的是将RLO字符与PDF字符匹配,但我不知道如何做到这一点。根据W3C规范,没有解决方案。 我在这里错过了什么吗?
答案 0 :(得分:2)
您可能对HTML5代码<bdi>
感兴趣。
答案 1 :(得分:1)
为什么不在$ username中搜索此字符,如果找到,则将<span>
更改为<span dir="rtl">
。同样用$ username
答案 2 :(得分:0)
Understanding Bidirectional (BIDI) Text in Unicode
这篇文章是关于比迪烟问题的一个非常有趣的一般读物,也有一个名为“过滤用户输入”的部分,接近结尾,似乎正在谈论你正在谈论的问题。
答案 3 :(得分:0)
W3C的解决方案是,你应该过滤出来自名为“Not suitable for use in markup”的群组中的RLO和其他角色。
在过滤掉其他不需要的控制代码(如ASCII 0x00-0x1F(可能包括或排除换行符)和0x7F-0x9F)的同时执行此操作。有关背景信息,请参阅this question。
(您也应该使用echo htmlspecialchars($username);
。也许您的用户名不能包含<
或&
,但在输出阶段依赖这不是一个好主意。当然,在页面上的所有内容上调用htmlspecialchars
;必要时为它定义一个快捷函数。)