htmlspecialchars() 应该用于输入信息还是输出之前?

Posted

技术标签:

【中文标题】htmlspecialchars() 应该用于输入信息还是输出之前?【英文标题】:Should htmlspecialchars() be used on information on input or just before output? 【发布时间】:2011-08-30 15:11:49 【问题描述】:

我获取 $_POST 信息并将其存储在数据库中,然后在查询时将此信息打印给用户。我应该在插入此信息之前使用 htmlspecialchars() 还是在输出之前查询它?

此外,我需要让用户能够使用引号和其他日常特殊字符。我知道我可以使用标志 ENT_NOQUOTES,但感觉如果我这样做会留下安全漏洞。

我的网站允许使用 Bbcode,我希望用户能够使用日常字符而不必看到“amp;lt;<?>&”。

对我有耐心

【问题讨论】:

与better way preventing xss attack 重复(我支持my answer,尽管它的评级为-1)。 最好在输入php.net/manual/en/function.strip-tags.php上使用strip_tags@ @Marek 谢谢,我想知道在这个过程中我可以在哪里添加 strip_tags()。谢谢大佬。 【参考方案1】:

我应该在插入此信息之前使用 htmlspecialchars() 还是在输出之前查询它?

在插入之前转义目标代码的数据。即在你输出它之前。

这意味着您将保留原始形式的数据用于其他目的(例如输出给用户进行编辑,包括在电子邮件中、生成 PDF、搜索等)

此外,我需要让用户能够使用引号和其他日常特殊字符。我知道我可以使用标志 ENT_NOQUOTES,但感觉如果我这样做会留下安全漏洞。

htmlspecialchars() 会将输入数据中的引号转换为 HTML。所以你不需要做任何特别的事情。

我的网站允许使用 Bbcode

那么你需要一个合适的 BBCode 解析器。

【讨论】:

在输出之前做它而不是在将它存储到数据库之前做它真的很重要。有三个原因: 1. 正如 Quentin 的评论中提到的,您可能希望在其他地方使用数据(而不是在 HTML 中)。可以是 RIA 或移动应用程序。 2.输出时需要根据上下文进行转义。例如,如果您在 onclick 等事件处理程序中的 javascript 字符串中输出数据,则 htmlspecialchars 不会保护您。 3.如果转义例程中存在错误,您可能会错误地转义数据库中的数据。以后修复可能会很痛苦。【参考方案2】:

htmlspecialchars() 在输出之前使用以避免 XSS。并且数据库应该更好地保存用户的原始输入。

【讨论】:

以上是关于htmlspecialchars() 应该用于输入信息还是输出之前?的主要内容,如果未能解决你的问题,请参考以下文章

xss之htmlspecialchars

htmlspecialchars() - 如何以及何时使用和避免多次使用

如何修复 htmlspecialchars() 期望参数 1 是字符串,给定数组

htmlspecialchars() 或 如何以及在何处使用?

htmlspecialchars 编码行的 LIKE 函数

htmlspecialchars函数绕过