【发布时间】: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