1

以下是用户可以在我的网站上使用的工作流程示例:

  1. 创建一个包含内容的任务:我htmlentities用来对内容进行编码并将其存储在我的数据库中(是的,我决定存储编码的内容);

  2. 用户稍后返回并单击以查看任务。问题是,内容的预览是在禁用的文本区域中完成的。

    • 我尝试htmlentities_decode在 textarea 中打印内容时使用(如果用户输入了不好的东西,XSS 问题);

    • 我只是打印编码的文本,一切都很好。

  3. 用户点击EDIT,这将使textarea可编辑

  4. 用户点击SAVE

这是我的主要问题,因为我在打印之前没有解码文本,它仍然是编码的,当用户保存它时,它会被重新编码。所以,前面的内容是双重编码的。

因此,如果用户第一次输入如下内容:

blablabla  </textarea/> yeah!

然后,它被编码,结果是:

blablabla  &lt;/textarea/&gt; yeah!

然后,当我显示它时,它会显示为用户之前输入的内容,但如果他保存它,结果是:

blablabla &amp;lt;/textarea/&amp;gt; yeah!

因此,如果他再次显示它,它不会很好地显示(并且随着用户不断编辑他的任务,它也会在我的数据库中占用越来越多的空间)。

好吧,我相信这是很多人都遇到过的问题,但我找不到任何好的解决方案。

顺便说一句,我正在使用htmlentitieswith ENT_QUOTES

4

2 回答 2

0

啊,这是我的主要问题,因为我在打印之前没有解码文本,它仍然是编码的,当用户保存它时,它会被重新编码。所以,前面的内容是双重编码的。

这实际上是正确的,您不应该在打印之前解码文本。实际上,在 HTML 页面中输出时必须进行 HTML 编码。当用户提交它时,它仍然没有被编码,因为浏览器已经解释了 HTML 实体。

除非...您在 DOM 中创建一个 TEXT_NODE 并将编码数据分配给它(在 textarea 中)?在这种情况下,浏览器将不会解释 HTML 实体,您最终将重新提交已编码的数据。innerHTML如果是这种情况,请改为分配给属性。但是,在提交数据之前,最终用户(在第一次编辑时)在表单中可以清楚地看到 HTML 实体,这似乎不是这种情况?

于 2012-08-02T15:54:12.540 回答
0

嗯,我解决了我的问题。我没有注意到,但对于第一个条目,我使用的是 htmlentities(),而在编辑时,我使用的是 Zend escape() 函数。仅使用 htmlentities() 解决了这个问题。我不知道 ZF 的 escape() 函数是如何工作的,但我以后不会使用它:p

谢谢你的回答:)

无论如何,所以,我想知道 htmlentities_decode() 函数,应该在什么情况下使用它?当我获取表单并像这样打印它时,我使用 htmlentities(),我从不使用 htmlentities_decode()。这正常吗?所以我想知道这个功能是做什么用的?

再次感谢!

于 2012-08-06T13:05:24.413 回答