【问题标题】:Phalcon form sanitizePhalcon形式消毒
【发布时间】:2014-08-28 21:04:37
【问题描述】:

有没有一种方法可以过滤由 VOLT 生成的表单中自动完成的数据。 考虑登录表单:电子邮件/密码。 当我编辑 HTML(在 broser 中)并将电子邮件作为数组发送时 ('name="email[]") 我可以在 PHP 中对其进行清理并将其“投射”为电子邮件

            $loginEmail = $this->request->getPost("email",'string');
            $loginEmail = $this->filter->sanitize($loginEmail, "email");

为了防止其他攻击。 但是在将电子邮件字段设为数组 VOLT 时会产生错误:

"Notice: Array to string conversion in ..."

VOLT 表单值会自动填充...

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

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

编辑 模板示例:

{{ text_field('id':"email","class":"form-control", "size": 32,"placeholder":'Email address') }}

在 var_dump 并通过验证设置电子邮件字符串之后,我得到了某个点:

protected '_viewParams' => 
    array (size=5)
      'title' => string 'Test' (length=5)
      'showSlider' => boolean true
      'hideUnlogged' => boolean true
      'user' => null
      'email' => boolean false

但是变量被发送到上层的 VOLT,因为它仍然设置为 ARRAY。

唯一可行的解​​决方案是制作一个对象或其他东西,并从配置中获取适用于表单的验证规则(按名称)并重写 public/index.php 中的 post 变量,例如这个:

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

如果有人有更好的解决方案,可以在控制器中完成,而不是在 this 或带有事件处理程序的服务中......

【问题讨论】:

  • 我有点失落。当您将包含数组而不是字符串的表单数据传递给 Volt 模板时,该错误会发生,对吗?您需要在传递给模板之前验证该表单数据并对其进行清理,对吗?
  • 我不清楚的另一件事是,当您将email 作为数组发送时,输入的名称从email 更改为email[]。因此,如果将email 指定为表单元素名称,则表单应该获取该值,而不是email[]。换句话说,除非某处存在错误,否则应该没有办法获取数组而不是字符串,除非您期待它......
  • 我进行了漏洞扫描,结果出现了这个问题,对此我感到有点沮丧,因为绕过它应该很容易。这不应该发生,但有一句话:永远不要相信用户提交的数据(跨站点脚本、注入等)。
  • 我同意这一点,我只是不了解服务器上正在发生的事情。渲染它时是否在模板中发生?模板是否从表单中获取值?如果是这样,您可以包含表单代码吗?如果不是,您能否描述处理请求的操作中发生了什么(在您进行模板渲染之前)?
  • 当我使用错误的凭据提交表单时会发生这种情况(在提交之前我更改了电子邮件的名称并作为数组传递),volt 尝试预填充提交的数据($_POST 变量到表单中)然后通知发生。他试图回应 $_POST['email']...

标签: php phalcon sanitization


【解决方案1】:

您可以通过implementing a custom filter 做任何您想做的事情,并进行从数组到字符串的正确转换。

$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");

但是……不要过度弯曲摇杆 - 这是一项明确的验证工作,然后是消毒。检查该值是否为字符串,如果不是 - 要求提供一个。保护您的应用免受无效输入的影响比提供该输入的白痴更容易和更聪明:)

编辑:

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

【讨论】:

  • 我发现如果我检测到如果请求是 $_POST 我可以覆盖使用 $this->view-> 发送到模板的值(我可以使用您的自定义过滤器示例) email = (string)$sanitizedString(例如)
  • 我很好奇框架不会t do it or they didnt 阻止这一点
  • 是的。为了使事情更流畅,您可以使用自己的逻辑扩展Request 类并添加setPost($name, $value)——Phalcon 并没有开箱即用。如果您对请求值有一些通用规则,您也可以将它们直接添加到Request 组件中。
  • 感谢您的回复:)
  • 不幸的是,即使我设置了 $this->view->email = $sanitizedString,我也遇到了同样的问题,我认为预填充是在上层完成的
猜你喜欢
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多