【发布时间】:2012-03-16 07:39:01
【问题描述】:
我为用户设置了一个系统,可以将他们的文章提交到我的数据库中。因为它只是 HTML,我不希望他们知道每次有换行符时都要输入 <br />,所以我在输入上使用 PHP 函数 nl2br()。
我还提供了一个文章修改工具,它将把他们的文章带回表单(但是这是一个不同的页面)并允许他们编辑它。在这样做时,<br /> 元素也出现了(仍然有换行符)。为了纠正出现的
元素(无论如何我已经预料到了),我添加了preg_replace('/<br(\s+)?\/?>/i', "\n", mysql_result($result,$i,"content")),这是我在本网站的另一个问题中找到的。它完成了删除<br /> 元素的工作,但是由于它用换行符替换它们,并且换行符本来会保持不变,每次编辑帖子时,都会添加越来越多的换行符,从而使段落间隔更多并且每次更多。这是用户无法理解的。
例如,假设我在文章提交表单中输入以下内容:
Hello, this is my article.
I am demonstrating a new line here.
这将转换为:
Hello, this is my article.<br />
I am demonstrating a new line here.
请注意,即使换行符已转换,文本中仍然存在换行符。在编辑表单中,<br /> 将被转换回换行符,如下所示:
Hello, this is my article.
I am demonstrating a new line here.
因为<br /> 已转换为换行符,但已经有换行符。所以我想我期待的是它最初被转换成这样的东西:
Hello, this is my article.<br />I am demonstrating a new line here.
我想知道...有没有办法阻止nl2br() 函数维护原始换行符?可能与 Windows \r\n 字符有关吗?
【问题讨论】:
-
您可能会遇到一些严重的问题,除非您的用户既擅长 HTML 又绝对值得信赖。因为如果你允许人们将 HTML 上传到你的网站,大部分是未经过滤的,你就会引入一个巨大的 XSS 漏洞,并且可能还有一堆社会工程入口点。
-
为什么一开始提交文章时需要将新行转换为
?您可以在显示文章时对其进行格式化。 -
@tdammers 我目前不过滤它的唯一原因是因为我想允许他们放置以下内容:
<p class='caption'>和<img src='etc' />如果我只能允许他们放置这些,并且仅此而已,我很乐意这样做,因为我非常同意不欢迎将 HTML 提交到我的网站。我应该提一下,那些可以提交文章的人受到仅限邀请的注册过程的限制,但尽管如此,如果有机会,我仍然会解决这个问题。 -
@liaant 这比修改进入数据库的内容要好得多。我不知道为什么我没有想到这一点。
-
@rar: 甚至
也有一些 XSS 的机会,例如
<img src="does_not_exist.jpg" onerror="do_nasty_things()" />