我的网站上有一个指向由Visual Studio生成的标准发布页面的链接。我担心的是,如果有人找到该页面的URL,他们可以下载我的软件。当然,我可以使用链接对页面进行密码保护,但是它仍然不能保护下载URL。有没有什么方法可以确保点击一次上传?我环顾四周,似乎我陷入了这种感觉。

最佳答案

公用URL是ClickOnce部署中的一个安全问题。但是,如果您的Web服务器安装了Windows和.NET,则可以解决您的问题。告诉我你有没有?如果有的话,我将不得不针对Linux Web服务器提出另一种解决方法。
简要
首先,有关ClickOnce部署的一些信息。部署应用程序时,服务器上的GET请求是(假设​​WebDir是服务器上的发布目录)
G-1。 GET /WebDir/setup.exe(初始下载)
G-2。 GET /WebDir/MyApp.Application(setup.exe -url请求)
G-3。 GET /WebDir/MyApp.Application(。application部署提供程序URL请求)
G-4。 GET /WebDir/Application Files/MyApp_1_0_0_0/MyApp.exe.manifest(应用清单请求)
G-5。 GET /WebDir/Application Files/MyApp_1_0_0_0/MyApp.exe.deploy和其他.deploy文件...(应用程序文件请求)
实作
现在,解决方案是在服务器上拦截这些文件请求。在IIS上,可以附加自定义HTTPHandler并处理请求。在Apache上,您可以使用.htaccess文件将请求重定向到PHP代码。除此之外,您还必须为从服务器下载的客户端实例生成唯一标识符uid(可以是您的许可证密钥),并将其放入部署提供程序URL查询参数中。
目录结构
"Application"内创建一个WebDir文件夹,并限制对/WebDir/Application/的访问。休息一切都可以在/WebDir/
档案要求
因此,这是在Windows机器上托管的Apache Web服务器上执行的操作:

创建一个自定义下载页面,或使用通过使用Visual Studio发布应用程序而创建的页面(但您必须手动对其进行编辑!)。假设页面是/WebDir/Download.php
Download.php对用户进行身份验证后,您必须将代码中的setup.exe(可以在PHP中使用readfile()进行发送)发送给用户。但是,安装完成后,捕获将为引导程序(setup.exe),它将执行GET请求[G-2]。现在不要忘记,您必须验证此文件请求。因此,基本上,您可以在返回文件之前将"setup.exe -url"属性更改为包含uid。例如:将其更改为/WebDir/uid/MyApp.Application [G-2]。您可以使用MsiStuff.exe更改引导程序的URL属性。
使用.htaccess文件,将[G-2]重写为/WebDir/Handler.php?user=uid。从Handler.php,您可以检查它是否有效。如果有效,则必须在部署提供程序URL中包含uid,并在部署清单中包含“从属程序路径”,以便在收到升级请求时(本质上是请求部署清单),您可以在那里验证用户太。添加uid以查询字符串参数。例如:将其更改为uid [G-3]。别忘了,修改清单后,您将不得不辞职。使用Mage或编写您自己的代码来执行此操作。

因此,最后,服务器上的GET请求将是(假设/WebDir/MyApp.application?user=uid = 1f3rd)
G-1。 uid操作:在更改-url的情况下返回GET /WebDir/Download.php
G-2。 setup.exe操作:重定向,验证用户,更改URL,重新签名并返回文件
G-3。 GET /WebDir/Application/setup.exe/1f3rd/MyApp.Application操作:重定向,验证用户并返回文件
G-4。 GET /WebDir/Application/setup.exe/MyApp.Application?user=1f3rd操作:重定向,验证用户并返回文件
G-5。 GET /WebDir/Application/1f3rd/Application Files/MyApp_1_0_0_0/MyApp.exe.manifest和其他.deploy文件...操作:重定向,验证用户并返回文件
优点

仅当所有请求在当前URL中都具有有效的GET /WebDir/Application/1f3rd/Application Files/MyApp_1_0_0_0/MyApp.exe.deploy时,应用程序才能成功部署和升级。
现在,您可以在客户端系统上标识应用程序的不同实例。您可以跟踪更新历史记录,进行选择性的版本升级/降级等等!

缺点

由于需要mage.exe,因此需要Windows服务器来实现上述功能。您自己的.NET代码签名应用程序和Msistuff.exe。
由于您正在对每个文件请求执行验证,因此您可能会遇到较小的性能问题。您可以选择跳过对.manifest和.deploy文件请求的验证。
您将必须确保公司证书的适当安全性,该证书将出现在Web服务器上进行签名(如果您拥有完整的服务器,则可以将其存储在服务器本地文件系统中。在这种情况下,除非有人使用,否则可以闯入机器本身!)

如果您想让我说清楚或详细说明,请随时提出。如果您对以上内容有修改建议,也可以发布。
如果有空的话,我会写一篇详细的CodeProject文章。

08-28 19:15