在将数据输出回文本区域时,如何正确清理从文本区域接收的数据?

Posted

技术标签:

【中文标题】在将数据输出回文本区域时,如何正确清理从文本区域接收的数据?【英文标题】:How do I properly sanitize data received from a text area, when outputting it back into the text area? 【发布时间】:2010-10-10 05:52:02 【问题描述】:

用户将在文本区域中输入文本。然后将其直接插入到 mysql 数据库中。我在上面使用了 trim、htmlentities、mysql_real_escape_string 并且我启用了魔术引号。将该数据输出回文本区域时,我应该如何对其进行清理?

感谢您的帮助。我从来没有太确定这样做的正确方法......

【问题讨论】:

我建议禁用魔术引号,它只会在以后引起问题。 【参考方案1】:

保存时不应使用htmlentities。显示时应使用htmlentities。经验法则是在需要之前不要对数据进行编码/清理。如果您在保存时对其执行htmlentities,那么当用户想要编辑输入时您必须对文本执行html_entity_decode。因此,您可以根据需要进行消毒,仅此而已。保存时,你需要清理 SQL 注入,所以你 mysql_real_escape_string 它。显示的时候,你需要清理XSS,所以你htmlentities它。

另外,我不确定您是否看到了 Darryl Hein 的评论,但您确实不希望启用 magic_quotes。 They are a bad, bad, thing 自 php 5.3 起已弃用,将在 PHP 6 中完全消失。

【讨论】:

这应该是我采取的唯一预防措施吗? 如果您可以在任何字符串中都不允许使用 HTML,仅此而已。如果您希望 HTML 被允许,那么您将走上一条非常危险的白名单之类的道路。 顺便说一句,这在 BBCode 解析时也成立吗? 好吧,为此我会破例。由于留言板有时会非常繁忙,因此必须在每次页面查看时翻译 BBCode 会非常昂贵。此时最好有一个encoded_field和一个raw_field,前者显示,后者在编辑时显示。【参考方案2】:

除了 Paolo 关于何时使用 htmlentities() 的回答之外,除非您使用的是旧版本的 PHP,否则清理插入 mysql 数据库的正确方法是使用 Prepared Statements,它们是 @ 的一部分987654322@。这取代了使用 mysql_real_escape_string() 的任何需要。

除此之外,我认为您已经掌握了一些内容。

【讨论】:

请注意,使用准备好的语句是不够的,您必须使用绑定参数。 IOW:使用“?”在 SQL 字符串中,并使用 stmt->bind_param() 发送数据 在正常工作流程中,您不想在到达准备语句之前捕获无效文本吗?在这种情况下,不适合使用mysql_real_escape_string

以上是关于在将数据输出回文本区域时,如何正确清理从文本区域接收的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 从文本区域解析文本中的 \n 符号

HTML5如何从文本区域中获取选定的文本

ko.JS 数据绑定从文本区域获取输入 - 不捕获 /n

十. 图形界面(GUI)设计7.文本框和文本区的输入输出

jQuery - 从文本区域中删除用户输入文本

离开文本区域时按钮单击未触发