asp.net - 同一台服务器上的 Response.Redirect 和 Server.Transfer 哪个更安全?

标签 asp.net

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

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

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

更新:

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

最佳答案

tl;dr:

无论是 Server.Transfer 还是 Response.Redirect 都没有提供相对于另一个的安全优势。强烈建议根本不要使用 Server.Transfer,因为它是现代 HTTP/web 资源基础范例的反模式,下面将对此进行进一步解释。使用 Response.Redirect 并关注安全问题的授权/身份。


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

您应该更喜欢 Response.Redirect 而不是 Server.TransferServer.Transfer 是 ASP.NET Web 窗体的“代码味道”。 ASP.NET Web 窗体从未遵循 HTTP、Restful、无状态、资源请求 Web 范式,而这显然是 Web 的构建基础。

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

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

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

关于 Server.Transfer 相对于 Response.Redirect 的“跳过”往返优势,考虑到 Server.Transfer 是我上面解释的网络反模式。它还能相当快地引导开发人员使用不太优雅的 Web 系统架构。

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

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

关于asp.net - 同一台服务器上的 Response.Redirect 和 Server.Transfer 哪个更安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45779413/

相关文章:

c# - HttpContext.Current.Session 与 Context.Session

ASP.Net session 状态提供程序故障转移场景

c# - DDay.ICal 与谷歌日历返回多次出现

asp.net - 什么是部分回发?

c# - 调用 WCF Web 服务时出错

c# - 方法参数的动态长度

asp.net - Sitecore错误-找不到Xaml控件。最后一个错误是: [No Error]

c# - 构建仅包含字段名称的 linq 表达式

asp.net - TextWriter 引用的行为不符合预期

c# - 我怎样才能确保一个字符串是干净的插入到javascript Alert ('error message')