我正在建立一个基于用户内容的99%的网站。我一直在阅读很多关于安全性与xss,csrf,sql注入以及所有有趣的东西。我理解得很好,并且已经融入了适当的安全性。我关心的是性能和过度使用,寻找更好的方法。
我理解接受用户输入的想法。在进入数据库之前过滤并验证用户输入,然后使用htmlspecialchars之类的东西进行清理输出。
现在就是这样。用户添加到数据库的每个“条目”可以附加大约30个不同的信息。
因此,如果他们查看页面。我会在那个页面上输出大约30个htmlspecialchars。这似乎超过了杀戮。列表或搜索页面可能每个项目都有5个或更多变量,在列出页面的20个页面上我很容易使用htmlspecialchars的100多个用户。这看起来很疯狂。
这会对我便宜的服务器造成压力吗?有没有更好的方法呢?
我的可怕想法。
(1)输入数据库时使用条带标签怎么样?我理解输出到没有htmlspecialchars的属性的漏洞,但我控制每个变量输出的位置,最糟糕的是变量进入像<h4>$title</h4>
或<li>$info</li>
这样的东西,从不进入href或任何东西。这样可以节省大量的服务器使用量来进行一次清理,而不是每次加载页面吗?如果我必须将它放在属性中,我仍然可以在变量上调用htmlspecialchars。
(2)我理解这是一个可怕的想法。但是如何将htmlspecialchars清理文本直接存储在数据库中呢?我知道如果我想用这些数据做其他事情,例如,制作一个api,输出为json或pdf,我将不得不解码htmlspecialchars。但这些情况都不是我所做过的。这似乎可以节省一大笔服务器资源,因为我只会清理一次而不是每次加载页面。
(3)将文本输入和htmlspecialchars版本存储在另一列中的文本清理中。这样,用户在输入时仍然可以看到他们的输入,我只需要在输入数据库时输入一次htmlspecialchars,而不是每次加载页面。是的,更多的数据库存储,但否则会出现什么问题?
编辑:谢谢,我现在看到这是微优化。
答案 0 :(得分:1)
我的意见:你的性能问题应该不是很大。在未来,您的性能问题实际上会降低,因为技术只会提高CPU周期速度和其他因素的性能。
我建议您在回显数据时继续使用htmlspecialchars
。对htmlspecialchars
的30个函数调用对你的服务器来说是非常少的工作(给你的服务器和php一些信用xD),并且由于上述原因,将来的工作将更少。
答案 1 :(得分:-1)
使用许多大型论坛使用的开源PHP库http://htmlpurifier.org/来清理用户输入。
您可以将已清理的html保存在数据库中。