【发布时间】:2013-05-10 01:16:30
【问题描述】:
我需要我的用户在他们的个人资料中输入他们的个人网站的URI,以便其他用户可以看到并点击它。我担心如果输出没有正确清理,这可能会导致 XSS 攻击。
就像下面这个非常简单的架构:
我使用完整堆栈 symfony2 framework、Doctrine 作为 ORM 和 Twig 作为模板引擎。我知道 Symfony 提供了一些惊人的 Validation tools,而 TWIG 提供了 automatic output escaping(在这种特殊情况下不是必需的)以及 some filters for output sanitizing。
我已经阅读了关于how symfony2 and twig handle sanitization的以下内容:
Doctrine 带有对数据库的清理功能 (SQL) 注入。除此之外,没有推荐/提供 Symfony2 中控制器级别的输入清理。但是,在 查看,输出清理可用。
例如,在 CakePHP 中:
数据清理以Utility 的形式实现,可以是 从任何地方访问(控制器、组件、模型......甚至视图)。它 遵循使用一组固定的预定义的净化所有输入的方法 消毒过滤器。使用专用规则清理特定输入 是可能的,但似乎不被鼓励。现有规则 专注于 SQL 和 HTML 注入并过滤掉一般情况 可疑的 Unicode 字符。
1symfony2 + twig 用户如何处理输入清理?他们是否完全放弃输入清理,例如仅依赖验证?还是他们编写自己的实用函数来过滤用户输入?或者也许使用像 owasp-esapi-php 这样的库?
2symfony2 + twig 用户如何处理输出清理?他们是否仅依赖 twig 引擎提供的过滤器?例如,是否已经有任何工具可用于清理用户输入的 URI something similar to this?
3 在这种情况下,您将如何处理数据库存储和用户输入的 URI 的显示,就像上面的示例一样,您会关心输入清理吗?还是只使用输出清理并按原样存储 URI?
【问题讨论】:
-
也许我没有理解正确,但在 cakephp 文档中,它写道:
For sanitization against XSS it’s generally better to save raw HTML in database without modification and sanitize at the time of output/display.所以你应该按原样保存输入。然后,您可以使用 twig 过滤器来防止 XSS 攻击。我确实相信{{ user.website|e('url') }}会完成这项工作。如果没有,总是可以create a new filter。 -
其中一种方法是向通过 Url 验证器传递的输入 url 发出请求(以 curl 为例)。如果成功,您可以显示此地址,或将其转义并输出为文本。
-
经过一番研究,我相信这一切都归结为使用
htmlentities的 CakePHP 与使用htmlspecialchars的 symfony/twig,所以我不确定 CakePHP 示例是否真的与此处相关。跨度> -
开赏金真是太好了@rufinus!谢谢!
-
我对答案非常感兴趣。目前似乎首选的方法是输出清理。但老实说,我认为在我的数据库中存储潜在的危险 JS 代码没有任何意义,只是在输出时将其过滤掉。这毫无意义。