最好是在将用户输入存储到数据库之前对其进行转义/编码,还是将其存储在数据库中并在检索时将其转义?

时间:2012-03-01 08:28:19

标签: php mysql xss htmlspecialchars

我使用htmlspecialchars()函数来阻止XSS攻击。我怀疑从下面将数据存储在数据库中的更好方法是什么。

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

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

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

有关详细信息,我使用的是htmlspecialchars($val, ENT_QUOTES, "UTF-8"),因此也会转换为“和”。

请帮我清除疑惑。如果可能,还提供解释。

感谢。

4 个答案:

答案 0 :(得分:10)

  1. 为什么您希望始终在HTML上下文中使用数据? &#34;我&lt; 3你&#34;和&#34; I&amp; lt; 3你&#34;是不同的数据。因此,将数据存储在数据库中。没有理由存放它。
  2. HTML仅在必要时转义数据,让您有信心知道自己在做什么。这样:

    echo htmlspecialchars($data);
    

    好多了:

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

答案 1 :(得分:5)

甚至更好的原因是,在截断以适应某个空间时,您会遇到像"&quo..."这样的可憎之事。抵制诱惑,使您的数据超过最低要求。如果您担心重新处理数据,请将其缓存。

答案 2 :(得分:3)

我的建议是以最纯粹的形式将数据存储在数据库中。您希望将其转换为&lt;script&gt;的唯一原因是您需要稍后在HTML文档中显示它。但是,在检索数据之后,数据库本身并不需要知道您对数据执行的操作。

答案 3 :(得分:0)

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