Symfony2 + Twig中的验证(vs)消毒?

时间:2013-05-15 12:53:09

标签: symfony twig

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

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


enter image description here


我使用完整堆栈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中控制器级别的输入清理。但是,使用Twig   查看,输出消毒可用。

例如,在 CakePHP 中:

  

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

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

2 symfony2 + twig用户如何处理输出清理?他们只依靠树枝引擎提供的过滤器吗?例如,是否已有可用于清理用户输入的URI的工具something similar to this

3 在这种情况下,您将如何处理数据库存储和显示用户输入的URI,如上例所示,您是否关心输入清理?或者你只会使用输出清理并按原样存储URI?

4 个答案:

答案 0 :(得分:3)

  1. 您根本不应该担心输入清理,Doctrine对sql注入免疫

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

  3. 我只会进行验证,有

    new Symfony\Component\Validator\Constraints\Url() ;
    
  4. 可供您使用

答案 1 :(得分:3)

还有一个很好的symfony2软件包,允许用户在使用Annotations的实体中实现输入过滤。像这样:

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

捆绑:dms-filter-bundle

答案 2 :(得分:0)

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

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

https://github.com/Exercise/HTMLPurifierBundle

答案 3 :(得分:0)

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

您应该考虑为网址格式添加测试,有various

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

因此,针对特定攻击,您要求不良用户提交脚本标记,并且一些不良用户会显示并执行此操作,您可以轻松避免将其添加到您的应用程序中,并使用简单的正则表达式

preg_replace(' /(<'。' script'。'>)(。*)(< /'。&#39 ; script'。'>)/ g','',$ text);

所以我认为不依赖于输出的卫生是安全的,有很多原因,例如你不使用twig,因为你的应用程序是端点驱动的或者出于某种原因需要调用| raw filter on text字段或者你甚至不会对显示器产生影响因为三分之一正在显示每个数据。