2012-03-01 56 views
4

我正在使用htmlspecialchars()函数来防止XSS攻击。我怀疑从后续存储数据到数据库的更好方法是什么。在将数据存储到数据库之前转义/编码用户输入还是将它存储为数据库并在检索时将其转义?

方法1:应用htmlspecialchars()函数后存储用户输入值。使用它,用户输入"<script>"将变成“& lt; script & gt;” 。

方法2:将用户输入保存原样并应用htmlspecialchars()方法,同时检索数据并将其显示在页面上。

我怀疑的原因是我相信使用方法1会在数据库上产生开销,而使用方法2的数据需要在通过php请求时再次进行转换。所以我不确定哪一个更好。

欲了解更多信息,我使用htmlspecialchars($val, ENT_QUOTES, "UTF-8"),以便将其转换“和”为好。

请帮我清楚我的疑问。如有可能,还提供解释。

感谢。

回答

4

的甚至更好原因是,在截断以适应一定的空间时,你会遇到诸如"&quo..."之类的可憎行为。抵制数据超过最低要求的诱惑。如果您担心重新处理数据,缓存它。

0

除了XSS攻击,如果您要将用户输入放入数据库中,您是否也应该担心SQL注入攻击?在这种情况下,无论如何,在将其放入数据库之前,您都希望避免用户输入。

+4

'htmlspecialchars()'不会阻止SQL注入攻击。此外,每个人都应该使用参数化查询。 – 2012-03-01 08:34:42

9
  1. 为什么你期望你总是在HTML上下文中使用数据? “我< 3你”和“我& lt; 3你”是不一样的数据。因此,请按照数据库中的意图存储数据。没有理由将其存储。
  2. 只有在必要时HTML转义数据才能让您有信心知道自己在做什么。这:

    echo htmlspecialchars($data); 
    

    比好了很多:

    echo $data; // The data should already come escaped from the database. 
          // I hope. 
    
+2

3.如果在转义函数中存在错误,那么如何解决该问题?编辑整个数据库? – Erlend 2012-03-02 03:38:02

+0

@Erlend当然,但这与这个案件没有任何关系。如果编写错误的数据,您必须在发现时修复内容。在你写入数据库(或任何文档)的地方都是如此。 – 2012-03-02 07:49:23

+0

@李先生:这与问题非常相关。如果您在显示屏上存储未转义的转义数据,则在发现错误的转义逻辑时,您不必触摸数据库。只更改转义逻辑。在大多数情况下,这比修复数据库中的数据要简单。 – Erlend 2012-03-02 16:44:25

3

我的建议是在数据库中的数据存储在其最纯粹的形式。您想将其转换为&lt;script&gt;的唯一原因是您需要稍后在HTML文档中显示它。但数据库本身并不需要知道在检索数据后对数据做了什么。

相关问题