清理将在网页上输出的用户输入的最佳位置在哪里?

时间:2009-06-11 04:47:59

标签: php security xss

在MVC的做事方式中,哪里是最佳运行位置,例如htmlspecialchars()在任何输入上?它应该在视图中发生吗(在这里做它是有道理的,因为我应该处理整个控制器和模型的原始输入?)

我不太确定...在视图或控制器中执行此操作有什么好处?这只是为了减少输出到页面......以最大限度地减少潜在的XSS攻击。

9 个答案:

答案 0 :(得分:6)

嗯,这取决于,不是吗?您应该清理视图中输出的所有内容。首先,因为清理取决于输出的格式。 JSON清理输出与HTML清理输出不同,对吧?其次,因为您永远不想信任您拥有的数据。它可能通过多种方式受到损害。

但是,这不会防止SQL注入等。现在,你永远不想在客户端javascript中这样做,因为攻击者可能很容易替换它。同样,我的建议是在使用时进行消毒。如果您只是写入文件,则可能不需要。而且一些数据库访问库也不需要它。其他人也这样做。

无论如何,请在使用时进行,并且所有源代码都可以更加可靠地抵御攻击和错误(或通过错误进行攻击)。

答案 1 :(得分:2)

这就是为什么设计模式的思考很糟糕。您应该问的是,哪个高效最适合这样做?如果数据是一次写入/多次读取,那么每次输出(在页面视图上)时对其进行清理会对服务器造成不必要的负担。根据数据的使用方式,设置缓存的位置,搜索方式等做出决定,而不是模式的优点。

根据你的说法,我会在将其写入数据库之前执行环境卫生。然后,您不仅要确保数据的安全性,还要确保未来的错误不会导致未经过发送的未经过数据处理的数据。如果您因某种原因想要原始文本,则只需反转原始转换。

您不应该担心在数据库中存储html编码文本,因为所有文本都以某种形式编码。如果您需要搜索文本,您也只需编码搜索字符串。如果您需要其他格式,那么这是另一个故事,但您必须根据自己的需要评估您的选择。

答案 2 :(得分:1)

我认为最好的方法是转义视图 - 输出,并将所有内容存储在数据库中。

为什么?使用此方法,您可以为每个用例使用db记录。

答案 3 :(得分:0)

你可以在视图中进行(通过javascript验证),但是从渲染视图到控制器的数据仍然被认为是不可信的,所以你仍然需要在控制器中对它进行清理。

在我见过的例子中(例如nerddinner),清理代码是模型类的一部分。有些人使用validation libraries

答案 4 :(得分:0)

我没有任何“最好”的消毒场所。根据用例,我们可能需要在多个层中实现清理逻辑。

答案 5 :(得分:0)

一般规则是:胖模型,瘦控制器。

现在,您如何应用该规则是另一回事:)

我认为它的方式是你的控制器应该只是控制流量,重定向到页面等。任何验证都应该在你的模型中进行。如果您想进行客户端验证,您可能会将其放在视图中。任何关心安全性的开发人员都会在客户端和服务器上进行验证。

答案 6 :(得分:0)

我把它放在“控制器”中,因为今天的大多数框架都定义了它。 (没有深入讨论它是多么纯粹)它不是直接属于视图模板的东西,但它也不一定需要在模型中,因为您可能有时需要原始数据而不是其他数据。 / p>

因此,当我从控制器中的模型加载数据并将其分配给视图(在我的情况下为smarty模板)时,我首先通过HTML Purifier运行它。

答案 7 :(得分:0)

我将在这里解决回答趋势并提出这个建议:

不受信任的输入应尽可能严格限制 - 通过在评估安全性之前减少与输入交互的位置数量,当您考虑修复错误或改进功能而不是安全性改变了正在讨论的系统。

答案 8 :(得分:0)

取决于用户输入的类型以及您在其上运行的验证。

如果要清理输入,我会将逻辑放在控制器中,当您输出来自数据库(或任何来源)的数据时,视图中的。< / p>

如果您正在进行数据验证,我会在客户端使用javascript以及模型进行验证。