在插入 MySQL 之前使用 htmlspecialchars() 好吗?

Posted

技术标签:

【中文标题】在插入 MySQL 之前使用 htmlspecialchars() 好吗?【英文标题】:Is it good to use htmlspecialchars() before Inserting into MySQL? 【发布时间】:2014-01-24 09:34:38 【问题描述】:

我对此有点困惑。我一直在阅读有关htmlspecialchars() 的信息,我打算将其用于文本区域POST 以防止XSS 攻击。我知道通常htmlspecialchars() 用于生成发送到浏览器的 HTML 输出。但我不确定的是:

1) 在将用户输入数据插入 mysql 之前,使用htmlspecialchars() 是否安全?我已经在使用带有参数化值的 PDO 准备语句来防止 SQL 注入。

2) 或者,我真的不需要担心使用htmlspecialchars() 插入值(前提是它们是参数化的),并且只在我从 MySQL 获取结果并将其显示给用户时使用htmlspecialchars()

【问题讨论】:

#2 是正确答案 HTML 转义 (1) 与您的数据库并不真正相关。通常(2)是首选,因为过早的转义可能会干扰以后的网页以外的输出通道。对于新手来说,早期的 HTML 转义可能仍然是可取的;过早忘记总比忘记好。 假设您想生成一些文本日志。然后,您将不得不撤消您的转义。而是在最后一刻逃跑,这样你就知道这是合适的。 在插入数据之前应用业务规则(可能包括限制允许的字符),但在使用站点应用转义(因为这是只是在给定上下文中使用数据的实现细节)。 @blackops_programmer 如果您存储的文本是<a href='test'>Test</a>,目的是将其转换为真正的工作链接,则您必须在输出前对其进行解码。如果您希望它按字面意思显示为 HTML 标记,则一种编码将在浏览器中显示为 <a href='test'>Test</a>,而双重编码将显示为 <a href='test'>Test</a>两者都不会为您提供工作链接。跨度> 【参考方案1】:

正如其他人指出的那样,#2 是正确答案。让它“原始”直到你需要它,然后适当地转义。

为了详细说明原因(我将重复/总结其他帖子),让我们将场景 1 推向逻辑极端。

当有人输入“' OR 1=1 <other SQL injection> --”时会发生什么。现在也许你决定因为你使用 SQL 你应该为 SQL 编码(也许是因为你没有使用参数化语句)。所以现在你必须混合(或决定)SQL 和 HTML 编码。

你的老板突然决定他也想要一个 XML 输出。现在,为了保持您的模式一致,您还需要为此进行编码。

下一个 CSV - 哦不!如果文本中有引号和逗号怎么办?更多的逃避!

嘿 - 一个漂亮的交互式 AJAX 界面怎么样?现在您可能想要开始将 JSON 发送回浏览器,所以现在 、[ 等都需要考虑在内。救命!!

很明显,按照给定的方式存储数据(当然受域限制)并在在您需要时根据您的输出进行适当的编码。 您的输出与您的数据不同。

我希望这个答案不要太傲慢。感谢其他受访者。

【讨论】:

非常感谢您为我总结并解释为什么 #2 将是最佳实践。 :)

以上是关于在插入 MySQL 之前使用 htmlspecialchars() 好吗?的主要内容,如果未能解决你的问题,请参考以下文章

mysql插入字段列到某个字段之前,或在字段最前

MySql - 可以在插入触发器之前插入 2 列吗?

之前:获取最后插入的 id - mysql 现在:我们应该在哪里调用最后插入的 id?

使用“之前”触发器插入后的 MySQL PDO LastInsertID 返回错误值

MySQL触发器:在插入之前将记录与先前的记录进行比较

mysql 数据库插入之前判断数据是不是存在