在同一台服务器上的 Response.Redirect 和 Server.Transfer 之间,哪一个更安全?



我一直在阅读这两个函数,正在考虑选择更安全的函数。我想使用Server.Transfer因为它在某种意义上在服务器端执行。用起来好吗?

Server.Transfer("myUrl.aspx?id=1");

Response.Redirect("myUrl.aspx?id=2");

更新:

我的问题基于来自上一页而不是URL更改的客户端数据安全性。

tl;博士:

Server.TransferResponse.Redirect都不比另一个提供安全优势。强烈建议不要使用Server.Transfer,因为它是现代HTTP/Web资源库范式的反模式,下面将进一步解释。使用Response.Redirect并专注于出于安全问题的授权/标识。

>两者都不能提供比另一个更高的安全性。服务器/端点仍然允许HTTP/HTTPS请求,任何请求都可以由恶意客户端发送到服务器。

你应该更喜欢Response.Redirect而不是Server.TransferServer.Transfer是 ASP.NET Web窗体的"代码气味"。ASP.NET Web Forms从未尊重HTTP,Restful,无状态,资源请求Web范式,这显然是Web构建的基础。

Server.Transfer是一种非常古老的方法。Server.Transfer在浏览器中保留原始 URL。这有助于简化向导的数据输入,但也会在调试时造成混乱。

维护原始 URL 也是 Web 窗体做它想要 ASP.NET 的完美示例,在短期内使生活更轻松,但从长远来看会影响软件的可维护性。维护原始URL也是违背HTTP/Web协议的完美示例。它阻止用户共享资源 URL。而且,即使您计划永远不共享该 URL,也总有一个用例,即用户/系统/异常处理仍然非常有帮助,能够共享 URL,并且它是在错误或问题甚至用户问题时提供用户所在的正确位置/资源, 用于客户服务/故障排除/调试,以更好地为用户/客户/客户提供服务。

Server.Transfer是快捷方式的一个例子。它没有安全优势,因为服务器/端点在端口80上暴露给客户端请求,无论是使用不同的资源(Server.Transfer(响应还是告诉客户端重定向(Response.Redirect(并请求另一个资源。

关于Server.Transfer相对于Response.Redirect的"跳过"往返优势,考虑到Server.Transfer是我上面解释的Web反模式,这是一个非常小的好处。它也引导开发人员相当快地使用不太优雅的Web系统架构。

关于Server.Transfer的第二个参数,perserveForm,将perserveForm设置为 True 将保留表单和查询字符串,并且仍然可以用于将用户发送到的下一页,但它不足以保证使用,因为它会影响 Web 应用程序的长期可维护性。

正如我上面所讨论的,perserveForm也是无状态、RESTful、基于资源的现代 Web 应用程序/范式的反模式。如果您需要跨请求维护表单状态,则应在具有本地存储的客户端上完成,服务器不负责维护每个客户端的状态。perserveForm是 ASP.NET Web 窗体的另一个示例,它试图在短期内使开发人员的工作变得更容易,但从长远来看,会使代码过于复杂且难以维护和调试。

如果像这样使用它,使用Response.Redirect会更安全:

if (!Request.IsLocal && !Request.IsSecureConnection)
{
if (Request.Url.Scheme.Equals(Uri.UriSchemeHttp, StringComparison.InvariantCultureIgnoreCase))
{
string sNonSchemeUrl = Request.Url.AbsoluteUri.Substring(Uri.UriSchemeHttp.Length);
// Ensure www. is prepended if it is missing
if (!sNonSchemeUrl.StartsWith("www", StringComparison.InvariantCultureIgnoreCase)) {
sNonSchemeUrl = "www." + sNonSchemeUrl;
}
string redirectUrl = Uri.UriSchemeHttps + sNonSchemeUrl;
Response.Redirect(redirectUrl);
}
}

当它将 HTTP 请求转换为安全 HTTP 请求 (HTTPS( 时。

两者都等同于一个安全问题...

Server.Transfer("myUrl.aspx?id=1");

Server.Transfer从服务器后端重定向。

Response.Redirect("myUrl.aspx?id=2");

Response.Redirect来到前端,回到后端,然后重定向。

如果从前端和后端进行调试,则可以观察它。

最新更新