【问题标题】:htmlentities before inserting to database [duplicate]插入数据库之前的 htmlentities [重复]
【发布时间】:2015-09-02 12:37:09
【问题描述】:

我想让我的网站免受 XSS 攻击。

我有一个模块允许用户将文本(带有特殊字符)插入数据库。此文本显示在起始页上。

现在我的问题是:在将用户输入插入数据库之前我应该​​使用htmlentities($_POST["userinput"], ENT_QUOTES, 'UTF-8') 吗?

或者我可以将用户输入直接插入到数据库中并使用htmlentities 显示它吗?

【问题讨论】:

  • 您不应该操纵原始数据。最好在处理数据时对其进行操作,例如在屏幕上显示或进行计算时。
  • 脚本只是将用户输入插入数据库。在另一个站点上,将显示此用户输入-> 不对其进行处理。那么输出中的 htmlentities 是安全的吗?
  • 我不完全了解您的计划,但无论什么数据,您都应该始终希望跟踪原始数据。所以我建议你在显示它时使用htmlentities。还要确保这里的所有内容都是 UTF-8,还有数据库中的存储,因为否则特殊字符可能会不清楚。这可以通过使用utf8_encode 和/或utf8_decode 来解决,但显然最好确保一切设置正确。

标签: php security xss


【解决方案1】:

有些人认为您应该在输入输出上对 XSS 进行清理。我认为这不是很有价值。一方面,您只在输出上执行此操作才真正重要,因为这是您试图缓解的漏洞所在。在我看来,任何依赖于将来自数据库的内容视为可信输入的解决方案都被破坏了。

问题在于,在某个地方,您(或追随您的人)可能会决定他们需要以不同的方式插入数据 - 一些外部 API - 谁知道呢。关键是,现在您的页面存在安全漏洞,因为您决定信任来自数据库的数据。

反对在我的出路的路上这样做的论点是两个部分:

  1. 您并没有增加任何额外的安全性,因此您实际上只是让人们感觉感觉它是安全的两倍 - 这不是我们想要创造的感觉。我们想证明某事是安全的,而不仅仅是让它感觉双重安全。

  2. 您也可能会编写一个会破坏原始数据的错误。如果在渲染时发生这种情况,这没什么大不了的,因为您可以修复它并正确显示它。如果它在您存储时发生,那么该数据是不可恢复的。

【讨论】:

  • 我遇到了 UTF-8 的问题。当我将 htmlentities-data 插入数据库时​​,我得到了数据库中特殊字符的代码。如果我尝试输出它们,我会再次获得这些代码。而且我不想用特殊字符替换每个代码,但我认为如果我想要“安全两倍”,我必须这样做
  • 我认为您可以在插入时不对数据进行编码,而是仅在显示时才进行编码。至少这是我想传达的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多