如何从Silex中的表单数据中过滤html

时间:2012-09-26 11:44:48

标签: php symfony escaping silex

我对Silex和Symfony很新,我正在尝试使用symfony Form组件创建一个表单。这样做很好,但是对于验证/消毒,我不知道该怎么做。

当然我知道$ app-> escape($ data)方法,但它似乎不符合我的需要。

在调用$ form-> isValid()方法之前,我想从提交的数据中转义html标记。我不想使用html标签使文本无效,只能从文本中转义/删除它们,然后验证获得的值。

所以基本上我想将转义值提供给表单而不是原件或使用。

我的问题是,只有在删除html标记后提交的文本为空时,我才会显示错误消息。

我想写一个自定义约束 - 因为我没有在包中找到关于html验证的任何内容 - 但在这种情况下我必须过滤/转义两次,首先在验证中然后保存数据。< / p>

我想实现这样的目标:

if ($request->getMethod() == 'POST') {            
  $comment = $request->get('comment');
  if($comment) {
    foreach($comment as &$value) {
      $value = $app->escape($value);
    }

    $cleared = new Request(array(), array('comment' => $comment));

    $form->bindRequest($cleared);
    if ($form->isValid()) {
      var_dump($form->getData());
    }
  }
}

感谢。

2 个答案:

答案 0 :(得分:3)

$app->escape()只是htmlspecialchars()的快捷方式,您必须使用strip_tags()函数删除html标记。

  

我的问题是我只想显示错误消息   删除html标签后,提交的文本为空。

$form->get('FILED_NAME')->addError(new Form\FormError('ERROR'));

例如:

if ($request->getMethod() == 'POST') {            
  $comment = $request->get('comment');
  if($comment) {
    $emptyCM = false;
    foreach($comment as &$value) {
      $value = strip_tags($value);
      if (empty($value)) $emptyCM = true;
    }
    if ($emptyCM) 
      $form->get('comment')->addError(new Form\FormError('my custom error message'));

    $cleared = new Request(array(), array('comment' => $comment));

    $form->bindRequest($cleared);
    if ($form->isValid()) {
      var_dump($form->getData());
    }
  }
}

答案 1 :(得分:0)

如果您希望在进入表单之前对所有数据进行预先清理,则可以使用before过滤器,用于所有路由或特定路由。

以下示例从GET和POST中删除字符串参数中的所有标记。如果您的参数是数组(如初始示例中所示),则需要添加另一个if分支。如果您的参数是深度嵌套的,则需要一个递归函数进行过滤。

$app->before( function( Request $request ) {
    foreach ( [ $request->request, $request->query ] as $parameterBag ) {
        foreach ( $parameterBag->keys() as $key ) {
            if ( is_string( $parameterBag->get( $key ) ) ) {
                $parameterBag->set( $key, strip_tags( $parameterBag->get( $key ) ) );
            }
        }
    }
}, Application::EARLY_EVENT );