【问题标题】:Securing/sanitizing remote calls to server by untrusted clients保护/清理不受信任的客户端对服务器的远程调用
【发布时间】:2018-07-20 16:11:06
【问题描述】:
我正在构建一个 API,它将公开(除其他外)以下调用:
- 将文件上传到远程服务器。
- 对远程上传的文件执行各种计算(通过一些可能的函数集)。
我正在尝试在 Python 上执行此操作。当客户端不受信任时,最佳实践是什么,这意味着他们可以上传任意制作的文件?
现在的标准流程是什么? RPC、REST 还是其他?
我不需要担心身份验证和/或加密,请求可以是匿名的并且是明文的。 MITM 也不是问题。
【问题讨论】:
标签:
python
rest
api
protocol-buffers
rpc
【解决方案1】:
您应该将任何客户端视为不受信任,因此您的案例需要一个通用方法,该方法可在 OWASP ASVS 找到(v16:文件和资源验证要求)。 REST 可以用于此目的。
主要有以下几点:
- 将文件存储在 webroot 之外(例如,静态页面服务器无法为其提供服务)
- 避免将执行位设置为开启(对于 Linux)
- 如果可能,将文件类型限制为已知的文件类型(例如,针对白名单进行验证;通过扩展名AND通过file signature验证文件类型)
-
在接受请求并将文件放入变量之前检查文件是否具有适当的大小(您可以通过 HTTP 内容长度检查并在传递给应用之前对其进行过滤)
- 如果可能,请使用服务器防病毒检查文件
- 如果将文件返回给用户,请确保设置了适当的标头(内容类型、无嗅探)。如果不是,一些 XSS 场景是可能的
- 验证文件名是否已清理,因此它们不会欺骗您的程序来提供其他文件(例如,可能存在文件名“../../../../../../etc/ passwd”将提供一个实际的 /etc/passwd 文件)。如果文件名包含 ../ 或 / 序列,则拒绝请求。
- 永远不要将文件夹的路径与文件名连接起来,因为这会产生同样的问题
- 如果将通过调用命令行进行计算,请注意命令行注入(此问题和之前的 2 个问题可以通过向用户指定文件名格式来解决,例如,只接受不带空格或任何特殊字符的字母数字名称和拒绝任何不符合模式的请求)
- 如果可以,请按 IP 限制请求数