Securing/sanitizing 不受信任的客户端对服务器的远程调用

Securing/sanitizing remote calls to server by untrusted clients

我正在构建一个 API 它将公开(除其他外)以下调用:

  1. 上传文件到远程服务器。
  2. 对远程上传的文件执行各种计算(通过一些可能的函数集)。

我正尝试在 Python 上执行此操作。当客户端不受信任时,最佳做法是什么,这意味着他们可以上传任意制作的文件? 现在的标准程序是什么? RPC、REST 还是其他?

我不需要担心身份验证 and/or 加密,请求可以是匿名的并且是明文的。 MITM 也不是问题。

您应该将任何客户端视为不受信任的,因此您的案例需要一种通用方法,可以在 OWASP ASVS(v16:文件和资源验证要求)中找到。 REST 可以用于此目的。

要点是:

  • 将文件存储在 webroot 之外(例如,它不能由静态页面服务器提供服务)
  • 避免将执行位设置为开(对于 Linux)
  • 如果可能,将文件类型限制为 know-good 种(例如,针对白名单进行验证;通过扩展名 通过 file signature 验证文件类型)
  • 接受请求并将文件放入变量之前检查文件大小是否合适(您可以通过 HTTP content-length 检查并在传递给应用)
  • 如果可能,请使用服务器防病毒软件检查文件
  • 如果文件返回给用户,请确保设置了适当的 headers(content-type、no-sniff)。如果不是,一些 XSS 场景是可能的
  • 验证文件名是否经过清理,这样它们就不会欺骗您的程序为其他文件提供服务(例如,可能存在文件名“../../../../../../etc/passwd" 将提供实际的 /etc/passwd 文件)。如果文件名包含 ../ 或 / 序列,则拒绝请求。
  • 永远不要将文件夹路径与文件名连接起来,因为它会产生同样的问题
  • 如果将通过调用命令行进行计算,请注意命令行注入(这个问题和之前的 2 个问题可以通过向用户指定文件名格式来解决,例如只接受不带空格或任何特殊字符的字母数字名称字符并拒绝任何不符合模式的请求)
  • 如果可以,请通过 IP 限制请求数