【问题标题】:Origin of "The required option "..." is missing." error message“所需选项“...”的来源缺失。”错误信息
【发布时间】:2015-07-20 20:54:41
【问题描述】:

我有一个 Symfony2 网站,它有十几个表单字段,访问者可以从中选择一个城市。表单通过表单选项city_src 获取可用城市列表。

大约一周前,我们上线了,我很好奇一切是否顺利,所以我tail-ed prod.log 查找任何异常情况。原来我有两个CRITICAL erros:

“缺少必需的选项“city_src”。”在 /var/www/hb/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php 第 764 行 {"exception":"[object] (Symfony\Component\OptionsResolver\Exception\MissingOptionsException(code: 0 ): 缺少必需的选项“city_src”。位于 /var/www/hb/vendor/symfony/symfony/src/Symfony/Component/OptionsResolver/OptionsResolver.php:764)"} []

我已经开始查看所有使用city_src 选项的表单,到目前为止一切看起来都不错。

几点说明:

  • 我的实验窗口有点有限,因为这是一个实时站点。
  • 这个问题本身就很不言自明了,我就是不知道它的出处

问题,有没有办法增加这条消息的详细程度(以备将来发生)?也许以某种方式包含完整的堆栈跟踪?

【问题讨论】:

  • 也许可以试试Monolog
  • 可以这么说,我已经使用Monolog。我找到了verbosity_levels 选项,但我不确定它是否有帮助(计划尝试一下)。

标签: php forms symfony


【解决方案1】:

问题可能不是“真实的”。即使所有表单都很好,您的提交也缺少city_src,但是还有其他一些可能发生这种情况的方式:

  • 表单是通过 Javascript 填写的,一些客户将其禁用。提交的表单没有某些字段。
  • 连接中断,数据包未完全通过。我知道,我知道,TCP 应该防止这种情况发生。 通常会这样。我记得看到过几个 SO 问题,但不知何故(多亏了代理、浏览器扩展,毫无疑问也是 gremlins)。
  • 表单是通过 GET(可能通过 AJAX)提交的,它有 a size limitation。不太可能,但可能。
  • 最有可能:有数以百万计的机器人会尝试强迫它们发生在任何形式上,以查看是否有任何有趣的东西丢失 - XSS 开放、一些垃圾邮件、 的可能性发送垃圾邮件,可能是 SQL 注入漏洞的一些症状。任何。结果是表单端点不会收集所有形式的垃圾,日志也是如此。

攻击场景详解:

Joe Q. Bot 到达包含表单的给定页面。当然,表格是完整的并且包含所有字段。并且在正常的事件过程中,所有字段都将提交给服务器。浏览器会这样做。

但机器人不是浏览器;使用它的创建者使用的任何逻辑,它可能会尝试按原样提交表单,或者可以尝试修改它以获取信息或导致错误。

例如,用于将 INSERT 构建到数据库中的不完整表单引发错误并泄漏有关所述数据库的信息(例如,数据库服务器的地址,例如,在 Amazon Elastic 上),这种情况并非闻所未闻并且保护不足 - 谁会猜到我们的 IP?)。

再一次,由于机器人通常处于软件工程的蹩脚方面,它可能无法处理“足够”的字段,因此只提交长表单的前半部分。或者由于多种原因,它可能无法正确解析表单本身。

结果是应该存在的字段实际上不存在,并且您的代码在分析请求时阻塞。

一个简单的解决方法是,一旦您确定没有正常和诚实的方式来获取损坏的表单,请将整个过程包装在 try/catch 块中并私下发送任何异常到您的收件箱。

===

在这种特定情况下,我会尝试检查网络服务器日志,以查看在弹出错误之前进行了哪些调用(例如 GET /site/customers/app/whatever) .然后您可以尝试重播这些调用,看看错误是否再次弹出。然后,您将更清楚地了解呼叫所采用的路线。

您可能还想自己提供不完整的表单,以查看这些表单是否会引发相同的错误,以及如何将响应路由回有意义的内容(“提交错误,请重试”或阻止传入bot 通过将其 IP 地址发送到 iptables 脚本或 DMZ 端的防火墙实用程序 Web 服务)

【讨论】:

  • 嘿@Iserni!我不认为这与机器人尝试向我的表单提交一些无效数据有关,因为表单本身是静态的。也就是说,客户端不能影响表单创建的过程。另一方面,关于查找服务器访问日志的提示很有希望,但我没有找到任何具有匹配时间戳的条目。可能是时区偏移......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2017-12-05
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2015-04-14
相关资源
最近更新 更多