在只有纯文本输入的站点上使用 HTML Purifier [英] Using HTML Purifier on a site with only plain text input

查看:23
本文介绍了在只有纯文本输入的站点上使用 HTML Purifier的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我能解决我和一些同事之间的分歧,我将不胜感激.

我们有一个典型的 PHP/LAMP 网络应用程序.

我们希望用户提供的唯一输入是纯文本.我们在任何时候都不会邀请或希望用户输入 HTML.表单元素大多是基本的输入文本标签.可能会有一些文本区域、复选框等.

目前没有清理输出到页面.所有动态内容,其中一些来自用户输入,只是简单地回显到页面上.我们显然需要确保安全.

我的解决方案是在页面上回显时在所有输出上使用 htmlspecialchars.

我同事的解决方案是将 HTML Purifier 添加到数据库层.他们希望在保存到数据库之前通过 HTML Purifier 传递所有用户输入的输入.显然他们已经在其他项目中像这样使用了它,但我认为这是对 HTML Purifier 用途的误解.

我的理解是,只有在允许用户输入 HTML 的站点上使用 HTML Purifier 才有意义.它采用 HTML,并根据白名单和其他规则使其更安全、更干净.

谁对谁错?

还有整个输入或输出转义"问题,但我想这是另一个时间和地点的辩论.

谢谢

解决方案

作为一般规则,应该针对上下文和用例进行转义.

如果您想做的是在 HTML 上下文中输出纯文本(并且您确实这样做了),那么您需要使用转义功能来确保始终在 HTML 上下文中输出纯文本.鉴于基本的 PHP,那确实是 htmlspecialchars($yourString, ENT_QUOTES, 'yourEncoding');.

如果您想要做的是在 HTML 上下文中输出 HTML(您不需要),那么您会希望在输出 HTML 时净化 HTML 以防止它造成损坏 - 在这里你会 $purifier->purify($yourString); 输出.

如果您想通过执行 SQL 语句将纯文本用户输入存储在数据库中(再次,您这样做),那么您应该使用准备好的语句来防止 SQL 注入,或特定于您的数据库的转义函数,例如 <代码>mysql_real_escape_string($yourString).

你应该:

  • 将数据放入数据库时​​转义为 HTML
  • 将数据放入数据库时​​,将数据清理为 HTML
  • 当您将数据作为纯文本输出时,将其清理为 HTML

其中,所有这些都是完全有害的,尽管程度不同.请注意,以下假设数据库是您唯一或规范的数据存储介质(它还假设您以其他方式处理了 SQL 注入 - 如果您不这样做,那将是您的主要问题):

  • 如果在将数据放入数据库时​​转义为 HTML,则依赖于始终将数据输出到 HTML 上下文中的保证;突然间,如果你想直接把它放到一个纯文本文件中按原样打印,你需要在输出之前对数据进行解码.
  • 如果您在将数据放入数据库时​​将数据清理为 HTML,那么您将破坏用户放置在那里的信息.它是一个消息传递系统并且您的用户想要告诉其他人
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆