2011-05-31 146 views
17

这是一种疯狂。表单被随机提交为GET而不是POST

这里是我们的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">[email protected]</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到这个URL。这是一个荒谬的低发生率,迄今为止影响的用户总数不到50个。

我很想只是dev/null这些错误(无操作方法等等,等等),但...

这些看起来像真正的用户:IPS广传播,多样和有效的用户代理和可信时序。令人沮丧的是,相同的用户有时成功地发布相同的形式稍晚。

任何想法可能导致这种情况?

想法我已经和丢弃:

  • HTTPS加速器或负载平衡器改写(munging)请求
    • 检查传入的日志,它们匹配什么让该应用程序
  • ASP /。 NET请求解析错误
    • 比较传入记录的请求值ES,它们匹配
  • 巴吉浏览器
    • 登录出现在多个浏览器版本,火狐4,Safari和移动Safari
  • 机器人,或照出的浏览器扩展
    • 宽浏览器,IP和操作系统传播。

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


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

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


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

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


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

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

+0

有没有JavaScript代码可以摆弄窗体的方法? GET是默认的,所以如果参数被删除,它会回落到那。不过,这太牵强了。有兴趣看看会发生什么。 – 2011-05-31 20:06:54

+0

@Pekka - nope。网站上的所有javascript都可以在这里找到(https://openid.stackexchange.com/Content/js/master.js)。只有一个地方会随着形式而混乱;它不会触及'method'。还注意到其中一些评论非常错误(修复!)。 – 2011-05-31 20:19:32

+0

奇怪。表单值是否在GET请求中发送,还是仅仅是没有数据的URL? – 2011-05-31 20:20:51

回答

3

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

0

确保源代码HTML格式良好,方法是通过验证器运行它。

1

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

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

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