表格被随机提交为GET而不是POST怎么办?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (32)

以下是我们的OpenID提供者的表格:

  <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>

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

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

我很想尝试dev/null这些错误(没有操作方法等),但是...

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

任何想法可能会造成这种情况?

我已经放弃的想法:

  • HTTPS加速器或负载均衡器进行请求
    • 检查传入的日志,它们匹配到应用程序的内容

  • ASP / .NET请求解析错误
    • 将传入和记录的请求值进行比较,它们匹配

  • Buggy浏览器
    • 在多个Chrome版本,FireFox 4,Safari和Mobile Safari中记录事件

  • 机器人,或者糟糕的浏览器扩展
    • 广泛的浏览器,IP和操作系统传播。

我目前最好的猜测是,?affId=#在行动中绊倒某些东西(虽然不一致,再次)。这基本上是巫术调试,所以我想要一个更权威的解释。

尝试我的巫术修复(<input type="hidden" name="affId" value="#" />等等),并部署。没有复印,所以我只是让它烤。

我们平均每天都会看到一对夫妇,所以如果这个问题没有问题,我会将其作为答案发布。

第二次更新:还没有发生。然而,频率较低。我正在收集更多数据,以查看浏览器或操作系统是否具有共同性。

关于为什么?affId=#从行为中减少出现的操作理论是在客户面前乐观地提取“看起来对GET来说安全的事情”的错误代理。这是一个疯狂的猜测,所以用一粒盐来对待它。

第三次更新:伪造代理的更多证据。查询受影响的IP的日志(在更长的时间段内),并且其中很多请求率比大多数未受影响的要高。它不是100%削减和干燥,我敢肯定,一些令人沮丧的刷新正在增加计数有点,但...它仍然是一个合理的指标(差异是同一时期受影响的IP的5倍左右的请求)。

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

提问于
用户回答回答于

Chrome用户遇到类似问题,原因是如果某人在谷歌浏览器中使用Shift + Enter提交表单,浏览器将打开新标签并发出无请求的GET请求。由于人们通常将大写字母/特殊字符作为密码的最后一个字符,因此在释放移位之前按下Enter键,然后发出GET请求。

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

用户回答回答于

一些广告拦截浏览器扩展程序,如AdBlock Plus Popup插件 “探测”伴随页面,可在决定是否屏蔽它们之前确定其实际URL。具体来说,前面提到的Popup插件默认使用HEAD查询,但可以设置为执行GET查询。

扫码关注云+社区

领取腾讯云代金券