与ajax可编辑textarea的htmlentities

时间:2012-08-02 14:37:12

标签: php jquery textarea html-entities

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

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

  2. 用户稍后返回并点击查看任务。问题是,内容的预览是在禁用的textarea中完成的。

    • 我在textarea中打印内容时尝试使用htmlentities_decode(如果用户输入了错误内容,则会出现XSS问题);

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

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

  4. 用户点击 SAVE

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

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

    blablabla  </textarea/> yeah!
    

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

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

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

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

    因此,如果他再次显示它,它就不能很好地显示(当用户继续编辑他的任务时,它在我的数据库中也会占用越来越多的空间。)

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

    顺便说一下,我正在使用htmlentitiesENT_QUOTES

2 个答案:

答案 0 :(得分:0)

  

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

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

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

答案 1 :(得分:0)

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

谢谢你的回答:)

无论如何,我想知道,htmlentities_decode()函数,应该在哪种情况下使用?当我获得表单并将其打印出来时,我的htmlentities(),我从不使用htmlentities_decode()。这是正常的吗?所以我想知道这个函数用于什么?

再次感谢!