发布ASP.NET网站是否会带来额外的安全保障?

3

我来自PHP/Rails背景,在部署网站时通常意味着在Web服务器上正确的目录中使用FTP/源代码进行检出。

然而,我被要求开发一个ASP.NET网站,并且有些人建议我“发布”网站,而不是直接复制源代码。显然,这会将codebehind(.cs)文件转换为已编译的DLL等。

我的应用程序不包含任何特定的机密业务逻辑。这是一个普通的购物车应用程序。我的问题是这是否是一个好主意?不让C#代码驻留在服务器上如何使应用程序更安全?

4个回答

6

ASP.NET代码始终会被编译,可以通过以下两种方式实现:

  1. 运行时编译 - 您可以将.ASPX和.CS文件复制到服务器。当请求页面时,.ASPX和.CS文件将被即时编译。ASP.NET运行时将创建一个包含已编译代码的DLL(位于名为“Temporary ASP.NET files”的文件夹中,其位置取决于您使用的.NET版本)。
  2. 预编译 - 您可以在部署到服务器之前选择对代码进行编译。这是Visual Studio中“发布”命令所做的事情。它将您的.ASPX和.CS文件编译成(一个或多个)DLL,然后上传到Web服务器。

就我个人而言,我认为部署预编译代码没有太大的安全优势(除非您正在混淆预编译的DLL)。

虽然如此,我还是喜欢预编译代码,因为有以下好处:

  • 至少在我的看法中,它看起来比在文件夹中散布一堆.CS文件要整洁。
  • 不用进行C#编译,有一些性能上的小优势。请注意,您的代码仍需要从IL转换为本机代码,并且这仍然会导致初始请求的性能损失(除非您使用新的ASP.NET 4.0和IIS 7.5功能或者其他方法)。
  • 发布功能允许您将应用程序打包以部署到其他环境(测试、预生产、生产等)。

注意:如果您来自Rails/PHP等平台,可能希望继续将.ASPX和.CS文件一起部署到服务器。好处是方便修改正在运行的应用程序。如果您遵循严格的部署生命周期,这不是一个好的做法,但在某些情况下可能有用。


2

虽然预编译主要是关于安全和性能的,但我可以提出一个补充:编译器检查!如果没有预编译,你很容易上传一些包含错误的代码文件,但在第一个用户使用这个代码文件的页面之前13天内都不会发现。这是由于asp.net只有在需要时才会编译一个文件。

通过预编译,所有文件都将被编译,并且所有编译器错误都会立即被捕获。

这就是关于预编译的全部内容,但发布并不仅限于此。

另一个重要因素是您可以指示msbuild在发布期间执行的步骤。也许最重要的事情是web.config转换,您可以在这里阅读更多信息:http://msdn.microsoft.com/en-us/library/dd465318.aspx。基本上,您可以创建一个转换文件,在发布期间根据发布目标替换/添加/删除您的web.config中的值。


0

是的,这与编译有关。为了使网站能够运行,C#代码必须被编译,这就是发布步骤所做的事情,并将其传输到特定位置。

您在桌面上拥有的网站版本是开发版本,很可能包含已编译代码的调试版本。然而,通过发布步骤,您应该生成已编译代码的发布版本,这也会提高性能。

ASP.net的发布步骤类似于创建普通Windows应用程序的安装程序,并且在发布到操作服务器时,它还涉及安装步骤。


你可以轻松地发布一个调试版本,发布与调试无关。不过,你提到的安装程序类比是正确的,因为在发布期间,你可以定义 msbuild 应该执行的步骤,对 web.config 进行转换,复制/创建/删除文件等等。这些都是在纯 xcopy 部署中需要手动完成的事情。 - Pauli Østerø

0

你的C#代码仍然驻留在服务器上,不同的是它以编译代码的形式而不是像在PHP/Rails中那样的脚本的形式存在。

在PHP、Rails或经典ASP中,你编写脚本并将其通过Xcopy/FTP上传至Web服务器。PHP解释器随后会在每次Web请求到达时解析脚本,而在asp.net中,代码则是编译并复制到Web服务器上,因此当Web请求到达时,执行速度更快。

可以将其大体视为在服务器上部署一个.exe文件与在一个文本文件中编写程序并让编译器每次运行它。

这与安全性无关。

顺便问一句 - Bluebells School之后的生活如何?:-)


请记住,在 .NET 中,文本文件只编译一次,生成的 DLL 文件会一直使用,直到文本文件发生更改,而不是在每个请求上都重新编译。 - Pauli Østerø
您似乎认识我,但我无法从您的SO个人资料猜测出您的身份。能否发封电子邮件给我? - Gaurav Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接