以下是用户可以在我的网站上使用的工作流程示例:
创建一个包含内容的任务:我使用htmlentities
对内容进行编码并将其存储在我的数据库中(是的,我决定存储编码的内容);
用户稍后返回并点击查看任务。问题是,内容的预览是在禁用的textarea中完成的。
我在textarea中打印内容时尝试使用htmlentities_decode
(如果用户输入了错误内容,则会出现XSS问题);
我只是打印编码文本,一切都很好。
用户点击编辑,这将使textarea
可编辑
用户点击 SAVE 。
这是我的主要问题,因为我在打印之前没有解码文本,它仍然是编码的,当用户保存它时,它会被重新编码。因此,之前的内容是双重编码的。
因此,如果用户第一次输入如下内容:
blablabla </textarea/> yeah!
然后,它被编码,结果是:
blablabla </textarea/> yeah!
然后,当我显示它时,它显示为用户先前输入的但是如果他保存它,结果是:
blablabla &lt;/textarea/&gt; yeah!
因此,如果他再次显示它,它就不能很好地显示(当用户继续编辑他的任务时,它在我的数据库中也会占用越来越多的空间。)
嗯,我确信很多人都遇到过这个问题,但我找不到任何好的解决方案。
顺便说一下,我正在使用htmlentities
和ENT_QUOTES
。
答案 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()。这是正常的吗?所以我想知道这个函数用于什么?
再次感谢!