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