表单被随机提交为GET而不是POST

时间:2011-05-31 19:57:53

标签: html asp.net-mvc-3 browser

这有点疯狂。

这是我们OpenID provider上的表单:

  <form method="post" action="/affiliate/form/login/submit?affId=7" autocomplete="off">
    <table class="position-table">
      <tr>
        <td class="input-td">
          <input class="framed-text-field" type="text" name="email" id="email" value="" maxlength="100" />
          <span class="form-help">name@example.com</span>
        </td>
        <td class="input-td">
          <input class="framed-text-field" type="password" name="password" id="password" />
          <span class="form-help">Password</span>
        </td>
        <td></td>
        <td class="input-td">
          <input type="submit" class="affiliate-button" value="Sign In" />
        </td>
      </tr>
    </table>
    <input type="hidden" id="fkey" name="fkey" value="REDACTED" />
  </form>

此表单是iframe中托管的页面(/affiliate/form/login)的一部分。 iframe通过HTTPS(HTTP上的主机页面)提供。您可以使用隐身/私密浏览/色情模式浏览器窗口在/users/login看到此操作。

所以这是问题,定期(但不是始终)用户将GET而不是POST到此网址。这是一个荒谬的低发生率,迄今为止影响的用户总数不到50个。

我很想dev/null这些错误(没有行动方法等等),但......

这些看起来像真正的用户:广泛的IP,各种有效的用户代理和可信的时间。令人沮丧的是,相同的用户有时稍稍成功地发布了相同的表单。

任何可能导致此问题的想法?

我已经拥有并丢弃的想法:

  • HTTPS加速器或负载均衡器重置请求
    • 检查了传入的日志,它们与应用程序的内容相匹配
  • ASP / .NET请求解析错误
    • 将传入与记录的请求值进行比较,它们匹配
  • Buggy浏览器
    • 多个Chrome版本,FireFox 4,Safari和Mobile Safari中的已记录事件
  • Bots,或者糟糕的浏览器扩展程序
    • 广泛的浏览器,IP和操作系统传播。

我目前最好的猜测是行动中的?affId=#正在绊倒(尽管不是一致的)。这基本上是伏都教调试,所以我喜欢更权威的解释。


更新:尝试了我的voodoo修复程序(<input type="hidden" name="affId" value="#" />等)并进行了部署。没有一个复制品,所以我只是让它烘烤。

我们平均每天都会看到几个,所以如果这个没有问题的2岁以上,我会把它作为答案发布。


第二次更新:没有,仍在发生。然而,更不频繁。我正在收集更多数据,以确定浏览器或操作系统是否存在任何共性。

关于为什么从动作中删除?affId=#减少发生的操作理论是客户面前的错误代理,乐观地获取“看起来安全的GET”。这是一个疯狂的猜测,所以用一粒盐对待它。


第三次更新:虚假代理的更多证据。查询受影响IP的日志(在更长的时间段内),其中许多请求率比大多数未受影响的IP要高得多。它不是100%切割和干燥,而且我确信一些令人沮丧的清爽增加了计数但是......它仍然是一个合理的指标(差异是受影响IP的同一时期的5倍左右的请求数量) )。

此时,我正在检测已发生的错误并提供更好的错误消息和指导。对于实际获得权威性答案而言并不热心,特别是因为答案似乎可能存在于“我无法控制的代码”领域。

3 个答案:

答案 0 :(得分:3)

某些广告拦截浏览器扩展程序,例如AdBlock Plus Popup addon'探测'随播页面,以确定是否阻止它们之前确定其真实网址。具体来说,前面提到的Popup插件默认使用HEAD查询执行此操作,但可以设置为执行GET查询。

答案 1 :(得分:1)

与Chrome用户存在类似问题,原因是如果有人使用Shift + Enter在Google Chrome中提交表单,浏览器将打开新标签并发出没有参数的GET请求。由于人们通常将大写/特殊字符作为密码的最后一个字符,因此在释放班次之前按Enter键,然后发出GET请求。

我看到您在枚举浏览器时首先提到了Chrome,因此如果Chrome更常出现问题,可能是因为这个原因。

虽然这可能不是你唯一的问题,但它可能有所帮助。

答案 2 :(得分:0)

通过验证器运行来确保源HTML格式正确。