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

时间:2017-08-20 07:08:00

标签: asp.net

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

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

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

更新

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

3 个答案:

答案 0 :(得分:3)

<强> TL; DR:

Server.TransferResponse.Redirect都没有提供安全优势。强烈建议不要使用Server.Transfer,因为它是现代HTTP / Web资源基础范例的反模式,下面对此进行进一步说明。使用Response.Redirect并关注授权/身份以解决安全问题。

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

您应该更喜欢Response.Redirect而不是Server.TransferServer.Transfer是ASP.NET Web Forms的“代码味道”。 ASP.NET Web Forms从未尊重HTTP,Restful,Stateless,资源请求Web范例,这显然是Web构建的基础。

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

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

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

关于Server.Transfer超过Response.Redirect的“跳过”往返优势,考虑到Server.Transfer是一个网络反模式,这是一个非常小的好处,如上所述。它还可以很快地引导开发人员不那么优雅的Web系统架构。

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

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

答案 1 :(得分:1)

使用var result = (from w in workers.Where(x => !exceptWorkerIds.Contains(x.Id)) join c in contracts.Where(x => x.ContractDate >= fromDate) on w.Id equals c.WorkerId into workerContracts let workerContractsCount = workerContracts.Count() orderby workerContractsCount, w.Name select new { WorkerId = w.Id, WorkerName = w.Name, WorkerContractsCount = workerContractsCount }) .FirstOrDefault(); 如果您像这样使用它会更安全:

Response.Redirect

将HTTP请求转换为安全HTTP请求(HTTPS)。

答案 2 :(得分:0)

两者都等于安全问题......

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

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

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

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

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