【问题标题】:Struts2 POST Causing Connection Reset when Proxied by Apache由 Apache 代理时,Struts2 POST 导致连接重置
【发布时间】:2014-07-30 06:59:30
【问题描述】:

当通过 Apache HTTP 服务器代理向我们的 Struts2 (2.3.15.2) 应用程序 POST(或 GETting)某些简单文本值时,我们在浏览器中收到“连接已重置”消息(由 Firebug 报告为 Aborted要求)。似乎根本没有联系到服务器(apache 的访问/错误日志中没有关于失败请求的条目)。

奇怪的是只有特定的字符串值会触发这个错误。我们发现以下关键字:control, find, services 与以下任何符号组合时:"';<>|' 会导致错误。例如,值 control; 会导致错误,但不会导致错误 test;

或者更复杂的例子:

string containing the word find and a special character like >

导致错误但不会:

string containing the word notfind and a special character like >

当我们直接通过tomcat访问应用时,不会遇到这个问题。

我们部署了一个简单的 struts2 java web 应用程序,其中包含最基本的视图/控制器,以尝试隔离我们遇到的问题。这是视图:

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSP Page</title>
  </head>
  <body>
    <form action="test.action" method="post">
      Value: <textarea type="text" name="value"></textarea> <input type="submit"/>
    </form>

    <hr/>
    Value is: ${value}
  </body>
</html>

以及行动:

public class TestAction {
  private String value;

  public String getValue() {
    return value;
  }

  public void setValue(String value) {
    this.value = value;
  }

  public String execute() {
    return "success";
  }
}

我们正在运行带有 mod_proxy 和 mod_proxy_ajp 的 Apache/2.2.10 (Linux/SUSE)。 Tomcat 版本是 6.0.18。配置如下:

ProxyPass /ConnectionResetTestApp ajp://localhost:8009/ConnectionResetTestApp

将 mod_proxy_http 与以下配置一起使用会产生相同的损坏行为:

ProxyPass /ConnectionResetTestApp http://localhost:8080/ConnectionResetTestApp
ProxyPassReverse /ConnectionResetTestApp http://localhost:8080/ConnectionResetTestApp

此示例应用程序可以在以下位置进行测试:http://post.idaho.gov/ConnectionResetTestApp/

关于为什么会发生这种情况以及我们如何防止此类错误的任何想法?

【问题讨论】:

  • 发布您的 apache 配置。
  • 您是如何找到那些特定字词的? :)
  • 你碰巧使用 mod_security 吗?它与 mod_proxy_http 一起工作更好吗?您的环境中有 Apache 之前的东西吗?您是否使用所有这些产品的新版本进行了测试?
  • @AleksandrM 非常痛苦......这是一个反复试验的情况。在一个应用程序中,我们收到了有关连接重置的投诉。然后我们开始收到更多的投诉所以......我们要求用户提供他们正在使用的输入。然后开始对输入进行二等分,直到我们缩小范围。在我们找到第一个案例后,我开始从互联网上抓取随机文本,直到我们进一步缩小范围。我敢肯定还有更多的关键字,但是......我想我们现在就这样吧。
  • @Brice 从更多测试来看,它似乎也发生在请求到达 apache 之前。有防火墙吗?您的系统上有关于数据包被拒绝的日志吗?

标签: java apache tomcat struts2 mod-proxy


【解决方案1】:

答案贴在cmets上,所以我就写一下我遵循的过程来帮助你。

从问题的描述(当请求包含某些特定字符串时连接丢失),可能有几个原因:

  1. 支柱
  2. 雄猫
  3. 阿帕奇
  4. 操作系统

您直接在 tomcat 上测试的事实意味着(几乎)Struts 和 Tomcat 不是原因。它可能是 Tomcat AJP 连接器,因此我对 mod_proxy_http 提出了问题。 然后,感谢您的测试应用程序,我看到一个甚至没有到达 tomcat 的简单请求以同样的方式被拒绝 (http://post.idaho.gov/gsgd?gdf=find%3E),因此 tomcat 退出。

error_log 或 access_log 中没有一行的事实意味着该请求甚至没有到达 apache,因此网络中有一些东西。由于 Apache 是直接公开的,因此必须有一些防火墙规则阻止 80 端口上包含这些字符串的所有 tcp 数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多