Php Phalcon型消毒液

Php Phalcon型消毒液,php,phalcon,sanitization,Php,Phalcon,Sanitization,是否有一种方法可以过滤由VOLT生成的表格中自动完成的数据。 考虑登录表单:电子邮件/密码。 当我编辑HTML(在浏览器中)并以数组形式发送电子邮件时(“name=“email[]”)我可以用PHP对其进行清理,并将其“转换”为电子邮件: $loginEmail = $this->request->getPost("email",'string'); $loginEmail = $this->filter->sanitize

是否有一种方法可以过滤由VOLT生成的表格中自动完成的数据。 考虑登录表单:电子邮件/密码。 当我编辑HTML(在浏览器中)并以数组形式发送电子邮件时(“name=“email[]”)我可以用PHP对其进行清理,并将其“转换”为电子邮件:

            $loginEmail = $this->request->getPost("email",'string');
            $loginEmail = $this->filter->sanitize($loginEmail, "email");
以防止其他攻击。 但是,将电子邮件字段设置为数组时,会产生错误:

"Notice: Array to string conversion in ..."
电压形式值将自动填充

我知道我应该在生产中禁用通知,但仍然

我如何使用VOLT来处理这个问题

编辑 模板示例:

{{ text_field('id':"email","class":"form-control", "size": 32,"placeholder":'Email address') }}
在var_转储并通过验证设置电子邮件字符串后,我在某一点得到:

protected '_viewParams' => 
    array (size=5)
      'title' => string 'Test' (length=5)
      'showSlider' => boolean true
      'hideUnlogged' => boolean true
      'user' => null
      'email' => boolean false
但是变量被发送到上层的VOLT,因为它仍然被设置为数组

唯一可行的解决方案是创建一个对象或其他东西,并从配置中获取要应用于表单的验证规则(按名称),然后在public/index.php中重写post变量,如下所示:

if(isset($_POST['email']))
{
    $_POST['email'] = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
}

如果有人有更好的解决方案,可以在控制器中执行此操作,而不是在具有事件处理程序的服务中执行此操作…

您可以通过执行从数组到字符串的正确转换来执行任何操作

$filter = new \Phalcon\Filter();

//Using an anonymous function
$filter->add('superSanitisedString', function($value) {
    if (is_array($value)) {
        $value = empty($value) ? '' : reset($value);
    }
    return (string) $value;
});

//Sanitize with the "superSanitisedString" filter
$filtered = $filter->sanitize($possibleArray, "superSanitisedString");
但是……不要把棍子弯得太厉害——这是一项明确的验证工作,然后是消毒。检查该值是否为字符串,如果不是,请要求提供一个字符串。保护你的应用程序不受无效输入的影响比保护那些提供输入的白痴更容易、更聪明:)

编辑:


您可以使用可以作为服务添加的自定义volt筛选器,使用静态方法实现一个类以返回经过清理的值,并在模板中使用它

我发现如果我检测到请求是$\u POST,我可以通过使用$this->view->email=(string)$sanitizedString(例如)覆盖发送到模板的值(我可以使用您的自定义过滤器示例)。我很好奇框架没有这样做,或者他们没有阻止这一点。为了让事情变得更加流畅,您可以使用自己的逻辑扩展
Request
类,并添加
setPost($name,$value)
——Phalcon并没有开箱即用。如果你有一些关于请求值的一般规则,你也可以直接将它们添加到
请求
组件中。谢谢你的回复:)不幸的是,即使我设置了$this->view->email=$sanitizedString,我想预填充是在上层完成的。我有点迷路了。当您将包含数组而不是字符串的表单数据传递给Volt模板时,Volt模板中会发生错误,对吗?在传递到模板之前,您需要验证表单数据并对其进行清理,对吗?另一件我不清楚的事情是,当您以数组形式发送
电子邮件时,输入的名称将从
电子邮件更改为
电子邮件[]
。因此,如果将
email
指定为表单元素名称,则表单应该获取该值,而不是
email[]
。换言之,除非某个地方有bug,否则不可能得到数组而不是字符串,除非您希望得到它…我运行了漏洞扫描,这出现了,我对此感到有点沮丧,因为应该很容易绕过它。这种情况不应该发生,但有一句话:永远不要相信用户提交的数据(跨站点脚本、注入等)。我同意这一点,我只是不了解服务器上发生的事情。渲染模板时,它是否发生在模板中?模板是否从表单中获取值?如果是的话,你能包括表格代码吗?如果没有,您能否描述处理请求的操作中发生了什么(在您进入模板呈现之前)?当我使用错误的凭据提交表单时(在提交之前,我更改了电子邮件的名称并将其作为数组传递),volt尝试预填充提交的数据($\u POST vars到表单中),就会出现通知。他试图回显$_POST[“email”]。。。