【发布时间】: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