【问题标题】:Validation (vs) Sanitization in Symfony2+Twig?Symfony2+Twig 中的验证(vs)清理?
【发布时间】:2013-05-10 01:16:30
【问题描述】:

我需要我的用户在他们的个人资料中输入他们的个人网站URI,以便其他用户可以看到并点击它。我担心如果输出没有正确清理,这可能会导致 XSS 攻击

就像下面这个非常简单的架构:



我使用完整堆栈 symfony2 frameworkDoctrine 作为 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 代码没有任何意义,只是在输出时将其过滤掉。这毫无意义。

标签: symfony twig


【解决方案1】:

使用 Symfony 提供的表单验证器来验证提供给应用程序数据库的数据的完整性。

你应该考虑为 url-pattern 添加一个测试,有various

其他用户已经指出,您可以安全地使用组件(csrf、类型/属性验证(symfony-form)、sql-injection(Doctrine)和 xss(twig),当然还有各种访问身份验证)来抵御各种攻击)

因此,对于您询问的特定攻击,不良用户有必要提交脚本标签,而一些不良用户会显示并执行此标签,您可以通过简单的正则表达式轻松避免将其放入您的应用程序中

p>

preg_replace('/()(.*)(' .'script'.'>)/g', '', $text);

所以我认为不依赖输出的卫生是安全的,有很多原因,例如你不使用 twig,因为你的应用程序是端点驱动的,或者由于某种原因你需要对文本调用 |raw 过滤器字段,或者您甚至可能对显示没有影响,因为三分之一的人正在各自显示数据。

【讨论】:

    【解决方案2】:

    我认为 Symfony 和 CakePHP 是框架,保存过程无法正确知道输入上下文以及它将保存到 DB 中的内容。开发者知道上下文,如果是 URL、HTML、SQL 等,即使是在输出数据的时候,也经常选择输出过滤,如果开发者想要实现输入过滤,他总是可以使用一些现有的工具。

    您可以使用 HTML Purifier 来“净化”所有用户输入。

    https://github.com/Exercise/HTMLPurifierBundle

    【讨论】:

    • 我可以使用 filter_var 和许多其他清理工具,这不是重点。这不是关于how can you,而是更多关于how should you
    【解决方案3】:

    还有一个不错的 symfony2 包,允许用户使用注释在实体中实现输入过滤。像这样:

    /**
    * @Filter\StripTags()
    * @Filter\Trim()
    * @Filter\StripNewlines()
    *
    * @var string
    */
    public $email;
    

    捆绑包:dms-filter-bundle

    【讨论】:

      【解决方案4】:
      1. 您完全不必担心输入清理,Doctrine 对 sql 注入免疫

      2. 默认情况下,所有输出都被转义。所以即使 $text 有脚本标签,也会被转义;显示为文本但不被浏览器执行。如果你想让http://example.com 可点击,有 jquery 插件可以为你做到这一点。

      3. 我只会放验证,有

        new Symfony\Component\Validator\Constraints\Url() ;
        

      有空

      【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2012-10-21
      • 1970-01-01
      • 2016-06-13
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多