在插入DB之前输入PHP htmlentities(),而不是输出

时间:2010-06-11 14:43:08

标签: php security

我想知道在执行以下程序时是否有任何缺点或不良做法:

  1. $ user_input - > htmlentities($ user_input) - > mysql_escape($ user_input) - >将$ user_input插入DB
  2. 从DB中选择$ user_input - > echo $ user_input
  3. 而不是执行以下操作:

    1. $ user_input - > mysql_escape($ user_input) - >将$ user_input插入DB
    2. 从DB中选择$ user_input - > echo htmlentities($ user_input)
    3. 因为我们在很多地方显示相同的$ user_input,所以对输入感觉更有效率,这样做是否有任何缺点/不良做法/漏洞利用能力?

      干杯!

      对以下问题的回复:

      @Matt:一般来说,为了保持可读性和可维护性,请尽量将其存储为尽可能接近原始的未经过滤的内容。这取决于两件事: 是否有其他人/计划会参考这些数据? 数据是否需要易于编辑?

      @Sjoerd:如果你想将数据显示为HTML以外的其他内容,那就有一个缺点,例如: CSV下载,PDF等

3 个答案:

答案 0 :(得分:3)

这取决于两件事:

  • 是否有其他人/程序会引用此数据?
  • 数据是否需要轻松编辑?

方法一的优点是,如果数据在一个地方中使用,并且每次都会调用htmlentities(),那么您将保存此步骤。

然而,如果HTML数据非常大,这只会带来显着的改善。一般而言,为了保持可读性和可维护性,请尽量将其存储为尽可能接近原始未经过滤的内容。

事实上,您可能会发现HTML无论如何都要存储错误。最好存储类似Markdown的内容,并在查看时将其转换为HTML。

答案 1 :(得分:3)

我建议不要这样做。如果除了将其显示为HTML(在控制台中显示,发送文本电子邮件,写入日志等)之外,您还需要其他任何数据,则必须将其转换回来。

一个好的做法是仅在最后时刻应用此类转换。在插入数据库之前使用mysql_escape,在显示为HTML之前使用htmlentities(或htmlspecialchars)。这样你总能知道你的逃生功能应该在哪里。如果他们不在那里,你很容易告诉你做错了什么。您还知道数据库中的数据始终是干净的,您无需记住是否对其进行了编码,使用了什么以及如何将其重新编码。

答案 2 :(得分:1)

如果您想将数据显示为除HTML之外的其他内容,则存在缺点,例如CSV下载,PDF等