我一直在阅读这两个功能,并且正在考虑选择一个更安全的功能。我想使用Server.Transfer
因为它在某种意义上在服务器端执行。是否更好用?
Server.Transfer("myUrl.aspx?id=1");
或
Response.Redirect("myUrl.aspx?id=2");
更新
我的问题是基于客户端数据安全性,它来自上一页而不是URL更改。
答案 0 :(得分:3)
<强> TL; DR:强>
Server.Transfer
或Response.Redirect
都没有提供安全优势。强烈建议不要使用Server.Transfer
,因为它是现代HTTP / Web资源基础范例的反模式,下面对此进行进一步说明。使用Response.Redirect
并关注授权/身份以解决安全问题。
两者都没有提供比另一种更多的安全性。服务器/端点仍然允许HTTP / HTTPS请求,任何请求都可以由恶意客户端发送到服务器。
您应该更喜欢Response.Redirect
而不是Server.Transfer
。 Server.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.Transfer
,perserveForm
的第二个参数,将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
到达前端,返回到后端,然后重定向。
如果您从前端和后端进行调试,则可以观察它。