34

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

就像下面这个非常简单的模式一样:


在此处输入图像描述


我使用的是全栈symfony2 框架Doctrine作为 ORM,Twig作为模板引擎。我知道 Symfony 提供了一些令人惊叹的验证工具,并且 TWIG 提供了自动输出转义(在这种特殊情况下不是必需的)以及一些用于输出清理的过滤器

我已阅读以下有关symfony2 和 twig 如何处理消毒的内容:

Doctrine 带有对数据库 (SQL) 注入的清理。除此之外,在 Symfony2 的控制器级别没有推荐/提供的输入清理。但是,在视图中使用 Twig,输出清理是可用的。

例如,在CakePHP中:

数据清理被实现为可以从任何地方(控制器、组件、模型……甚至视图)访问的实用程序。它遵循使用一组固定的预定义清理过滤器的清理所有输入方法。使用专用规则清理特定输入是可能的,但似乎不被鼓励。现有规则集中于 SQL 和 HTML 注入并过滤掉一般可疑的 unicode 字符。

1用户如何symfony2 + twig处理输入清理?他们是否完全放弃输入清理,例如仅依赖验证?还是他们编写自己的实用函数来过滤用户输入?或者也许使用像owasp-esapi-php这样的库?

2用户如何symfony2 + twig处理输出清理?他们是否仅依赖 twig 引擎提供的过滤器?例如,是否已经有任何工具可用于清理用户输入的 URI,类似于此

3在这种情况下,您将如何处理数据库存储和用户输入的 URI 的显示,就像上面的示例一样,您会关心输入清理吗?还是只使用输出清理并按原样存储 URI?

4

4 回答 4

3
  1. 您完全不必担心输入清理,Doctrine 不受 sql 注入的影响

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

  3. 我只会验证,有

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

为您提供

于 2013-05-15T14:56:37.540 回答
3

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

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

捆绑包:dms-filter-bundle

于 2016-03-14T14:17:47.170 回答
0

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

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

https://github.com/Exercise/HTMLPurifierBundle

于 2014-03-19T15:24:29.580 回答
0

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

您应该考虑为 url-pattern 添加测试,有各种

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

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

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

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

于 2017-03-29T10:07:29.470 回答