我正在使用mysqli开发一个php聊天系统,其中一个聊天代码就像Facebook一样<3
。
问题
我的问题是,当我没有为成员发送的消息添加条带标记时,如果成员发布<script> alert('What is this'); ?>
,则会显示原始文本。但是当我添加
<?php $message = strip_tags($message); ?>
...它会从邮件中删除标记,但也会中断<3
。我也尝试了htmlentities和htmlspecialchars,但他们都将<3
转换为html格式。
问题
如何从标记中删除邮件,但仍允许使用不匹配的<
代码,例如<3
?例如,<script>
应该被允许但不是 </script>
,并且不应该允许<?php ?>
,但<anything
应该是允许的。
答案 0 :(得分:1)
我知道这不是你问的问题。但也许htmlentities()
可能适合你。
它会将一些特殊字符转换为HTML实体,因此它会按字面打印<string>
,但不会执行它。
<?php $message = htmlentities($message); ?>
如果您的消息是:
<script> alert('What is this');</script>
它不会创建弹出窗口,它会在屏幕上显示代码本身。
答案 1 :(得分:1)
您可以尝试将<3
替换为<3
,而strip_tags不会破坏它。
您可以在此处查看html代码表:http://www.ascii.cl/htmlcodes.htm
答案 2 :(得分:0)
(警告:我从未使用过PHP或MSQLI,所以我可能不知道我在说什么。)
在将字符串传递给tag-stripper之前,您是否考虑过预处理消息以扫描它们是否希望从标记剥离中“保存”?
我不知道tag-stripper是如何工作的,但我想它包含了一些逃避<
字符的方法,因此它们不会被识别为标签。如果您在消息字符串中搜索序列<3
并插入\
以使它们变为\<3
,那么该标记剥离器会做什么?这符合您的需求吗?
如果没有办法逃避特殊代码,您可以简单地用不像HTML的东西替换它们。例如,
用户留言:I <3 <b>You</b>!
预处理版本(搜索和替换):I ###HEART### <b>You</b>!
传递给tag-stripper:I ###HEART### You!
最后,用心脏符号替换###HEART###
。
编辑:根据Petroff的回答,使用<3
(这是<3
的html代码)可能更好。
如果您输出的符号是unicode点,例如如果<3
应该成为U-2665
,为什么不首先执行 搜索和替换? unicode点不包含<
,因此不会被识别为标记。