损坏的查询字符串:"80"被IIS删除
本文关键字:quot IIS 删除 损坏 查询 字符串 | 更新日期: 2023-09-27 18:19:25
我已经为这个问题奋斗了好几天了,但似乎不知道是什么原因导致的。
我有一个注册系统需要激活。当用户单击激活链接时,将向用户发送带有散列的电子邮件,并将散列传递回服务器。非常基本的东西。链接看起来像这样:
http://site/activate.aspx?activationKey=26a51d9eba86c73b8f7e800c41bf55453ed3b1c4
在我的本地机器(运行VS2010)上开发时,这可以完美地工作。然而,当站点被推送到活动服务器(iis6)时,查询字符串被打乱了,可能是IIS造成的。一旦查询字符串碰到隐藏代码,任何出现的"80"都将被删除,从而导致激活失败。
我想知道这是否是一个编码/解码问题,但没有一个字符是特殊的,所以我不认为应该是这种情况。
我知道IIS默认情况下不会从查询字符串中删除80。我在我的网站上多次使用查询字符串,没有任何问题。
查看IIS中的url重写规则。我不确定IIS日志是否会使用最终url或IIS之前的url。但是考虑到它是80,我猜有人想从url中删除端口80,但为此添加了一个错误的重写规则。
所以我会寻找一个有人可能试图从url中剥离端口80的地方。可能在IIS或上游。
打开跟踪。在网站上浏览并检查发送的值是什么。
好了,我发现问题了。@pst和@Mikael Eliasson是对的,从某种意义上说,一些暴徒确实有一些重写规则。
通过将403;4错误重定向到另一个(已有的)应用程序来强制使用SSL,该应用程序重写URL以使用HTTPS。从某种意义上说,你可以在应用程序上强制使用SSL,剩下的就是魔法了。以下是原始代码:
if ( Request.ServerVariables[ "SERVER_PORT" ] == "80" ) {
try {
string queryString, secureURL;
queryString = Request.Url.AbsoluteUri.ToString();
queryString = Request.ServerVariables[ "QUERY_STRING" ];
Response.Write( queryString + "<br>" );
secureURL = queryString.Replace( "http", "https" );
secureURL = secureURL.Replace( "403;", "" );
secureURL = secureURL.Replace( "80", "" );
Response.Write( secureURL );
Response.Redirect( secureURL );
}
catch ( Exception ex ) {
}
}
注意这里"80"被粗暴地替换了。将替换为":80"修复了这个问题,假设我没有传递一个包含":80"的查询字符串,我不会。
谢谢你们至少给我指出了正确的方向。