服务器永远不可能 100% 安全,但我们应该尽最大努力将事件风险降至最低。在这一点上我应该说我不是专家,我只是一个计算机科学专业的学生。因此,在这种情况下我会遵循以下方法。请评论您可以提供的任何其他提示。
一般来说,为了拥有安全的表单,必须检查和验证所有客户端输入。任何不是源自我们系统的信息都是不可信的。
在我们的案例中,来自客户的输入:
扩大
我们并不真正关心雷类型,这是网络服务器的信息。我们关心文件扩展名,因为这是操作系统如何运行/读取/打开文件的指示器。我们必须仅支持特定的文件扩展名(无论您的管理员的电脑可以处理什么),支持未知的文件类型是没有意义的。
Name(不带扩展名)
文件名并不总是有价值的信息。当我处理文件上传时,我通常将其重命名(设置)为 id(用户名、时间戳、哈希值等)。如果名称很重要,请始终检查/修剪它,如果您只希望字母或数字删除所有其他字符(我避免留下“/”、“\”、“.”,因为它们可用于注入路径)。
所以现在我们假设生成的文件名是安全的。
Content
当您不支持结构化文件时,您就无法验证文件的内容。因此,让专家程序为您做这件事......用防病毒软件扫描它们。从控制台调用防病毒软件(小心,使用避免注入的机制)。许多防病毒软件也可以扫描 zip 内容(服务器上文件夹中的恶意文件不是一个好主意)。始终保持扫描程序更新。
在评论中,我建议压缩文件,以避免在管理员计算机和服务器上自动执行。管理员计算机的防病毒软件可以在解压缩之前对其进行处理。
更多提示,不要向客户提供超出其需要的信息...不要让客户知道文件保存在哪里,如果没有必要,不要让网络服务器访问它们进行分发。记录奇怪的操作(文件名中的斜杠、文件太大、名称太长、警告扩展名,如“sh”、“exe”、“bat”),如果发生任何奇怪的情况,请通过电子邮件向管理员报告(最好知道是否发生)你的保护措施起作用了)。
所有这些都会产生服务器工作负载(更多系统漏洞),因此您可能应该在接受新文件上传请求之前计算当前扫描/检查的文件数量(这就是我要发起 DDoS 攻击的地方)。
通过快速谷歌搜索阿瓦斯特!对于 Linux - 命令行指南 https://forum.avast.com/index.php?topic=105711.0,我不宣传Avast,我只是将其作为现有示例展示。
最后但并非最不重要的一点是,您并不偏执,我管理着一个由我编写的自定义翻译系统……垃圾邮件和黑客攻击已经发生过不止一次。
再想一想,在网页上运行的 JavaScript 仅对客户端计算机来说是安全的(这要归功于浏览器的安全性)。我们可以使用它来防止向服务器发送无效帖子,但这并不能确保此类请求不会被执行,因为 JavaScript 可以被绕过/编辑。
所以,所有的 JavaScript 解决方案都只是为了第一次验证(通常只是为了帮助用户纠正错误)并正确设置表单数据。