使用htmlpurifier进行输入或输出转义/过滤
我正在使用javascript所见即所得编辑器处理来自公众的用户输入,并计划使用htmlpurifier清理文本。使用htmlpurifier进行输入或输出转义/过滤
我认为在输入上使用htmlpurifier就足够了,将清理过的输入存储在数据库中,然后在不进一步转义/过滤的情况下输出。但我听到其他意见,你应该总是逃避输出。
有人可以解释为什么我应该需要清理输出,如果我已经清理输入?
我假设您的所见即所得编辑器生成HTML,然后验证并放入数据库。在这种情况下,验证已经发生,因此不需要验证两次。
至于“逃避输出”,这是另一回事。你不能逃避生成的HTML,否则你将不会有格式化的文本,并且标签将是可见的。当您不希望所述输出干扰页面的标记时,使用转义输出。
我想补充一点,您必须非常小心您在验证阶段允许的内容。你可能只想要允许一些HTML标签和属性。
咒语总是逃避你的输出,这是一个文本到HTML的转换,是一个很好的和合理的默认回退到在网络空间工作时。在HTML Purifier的情况下,你特别打破了这个好建议,因为你确实正在执行HTML到HTML的转换,并将HTML视为Text再次没有意义。
为了100%安全起见,请使用HTMLPurifier两次。将HTML保存到数据库之前以及在将其输出到屏幕之前。
这种解决方案的巨大缺点是性能。在过滤HTML时,HTMLPurifier超慢,您可能会遇到更长的页面处理时间。
如果您在输出某些内容之前只执行1-2次筛选,但是如果您对每个请求执行10次筛选,我们宁愿在输出大量文本时不要使用HTMLPurifier。
HTMLPurifier每个请求处理时间花费了60%,我们希望实现低响应时间和更高UX。
这取决于你的情况。如果你在输出之前可以使用HTMLPurifier,那就去做吧 - 这会更好,而且你总是可以控制你想要允许的标签(对于新的甚至是存储在你的数据库中的旧内容)。
感谢您的发布 - 但是您能否解释一个案例,我需要这样做两次? 例如,如果我这样做: $ id =(int)$ _ POST ['id']; $ db-> query(“select * from users where id =”.int_val($ id)); 我在安全方面获得了什么? – Yehosef 2010-05-24 14:15:16
第二次过滤(在输出之前)对于有人侵入您的数据库服务器但未设法破解您的Web服务器的情况有帮助。攻击者可以轻松更改数据库中的任何内容,并且如果您在输出前未过滤HTML,则会出现严重的安全问题。不过,我相信这是非常罕见的情况。 – 2010-05-24 14:25:44
这是ridiculuos场景我会说 – 2010-05-24 14:33:32
依赖于js编辑器的问题在于,恶意用户可能会绕过js所做的任何检查来提交帖子。 – Yehosef 2010-05-24 14:04:06
@用户当然。但是,这不是你的净化器吗? – 2010-05-24 14:06:41
@Col - 是的 - 但是Artefacto说js“验证了”html - 所以不需要验证两次(意思是使用htmlpurifier) – Yehosef 2010-05-24 14:10:55