在 Web 应用程序 .NET 中,我必须即时将 html 转换为 pdf。我玩弄了一些开源项目。最后我找到了 wkhtmltopdf 。在服务器端,我的应用程序将调用 wkhtmlpdf 的服务器端进程并传递参数并向用户呈现 pdf 文件。
从安全的角度来看,这种方法有多糟糕?它更容易受到机器人的攻击吗?
假设当给定不可信的输入时,生成的程序有一些缓冲区溢出错误,这会导致任意代码运行。好的一面:嘿,任意代码现在在另一个进程中运行,而不是服务器进程。不利的一面是:任意代码现在拥有进程拥有的所有权利。
将子系统与自己的进程隔离是一种很好的做法,但不要止步于此。使用纵深防御。
以正确运行所需的最少权限启动新进程。这样,如果成功攻击它,则伤害是有限的。
清理流程的输入,特别是如果它们来自不可靠的来源。确保文件大小合理并包含合理的数据。
您希望一次成功的攻击必须跳过十几个不可能的环,而不仅仅是一个。
Joe 关于拒绝服务的观点也是值得思考的。
它很容易受到淹没您的服务器并对其进行 DOS 攻击的人的攻击。您可以将请求放在消息队列中,然后让服务处理队列外的项目。这意味着您可以保证最多有N个进程在运行。最坏的情况是,你排了很长的队,你可以取消。
如果您使用消息队列,则可以将队列使用者移动到另一台服务器(或多个服务器)上。如果您对服务有大量需求,这有助于分散服务器负载。在另一个服务上运行也意味着对数据的访问受限,这有利于安全性,这意味着可执行文件无法访问它不需要的文件和内存。
缺点是这是异步的,您需要通知文件已准备好下载。您还需要在等待下载时将其存储在某处。
这样做的一个好处是用户在等待时不会绑定 HTTP 服务连接,如果运行该进程需要很长时间,用户的连接不会超时。
在服务器上运行的进程不能是安全漏洞。在像您这样的情况下运行进程是某人请求的其他操作或操作的结果。因此,导致该操作运行可执行的方法/架构中可能存在安全漏洞。如果您在该层上感到足够安全,我不会太担心调用单独的流程,特别是因为它为您提供的服务带来更多价值。