损坏的查询字符串:"80"被IIS删除

本文关键字:quot IIS 删除 损坏 查询 字符串 | 更新日期: 2023-09-27 18:19:25

我已经为这个问题奋斗了好几天了,但似乎不知道是什么原因导致的。

我有一个注册系统需要激活。当用户单击激活链接时,将向用户发送带有散列的电子邮件,并将散列传递回服务器。非常基本的东西。链接看起来像这样:

http://site/activate.aspx?activationKey=26a51d9eba86c73b8f7e800c41bf55453ed3b1c4

在我的本地机器(运行VS2010)上开发时,这可以完美地工作。然而,当站点被推送到活动服务器(iis6)时,查询字符串被打乱了,可能是IIS造成的。一旦查询字符串碰到隐藏代码,任何出现的"80"都将被删除,从而导致激活失败。

我想知道这是否是一个编码/解码问题,但没有一个字符是特殊的,所以我不认为应该是这种情况。

损坏的查询字符串:"80"被IIS删除

我知道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"的查询字符串,我不会。

谢谢你们至少给我指出了正确的方向。