我一直在阅读这两个函数,并且正在考虑选择一个更安全的函数。我想使用 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.Transfer
。 Server.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/