验证文件系统上的用户输入

时间:2014-01-26 17:07:16

标签: c security validation filenames

我已经写了一堆网络应用程序,知道如何防止mysql注入等。我正在为C中的项目编写一个日志存储系统,我被建议确保它是无黑客的,因为用户无法提供像foo\b\b\b这样的错误数据,并试图通过某些方式入侵操作系统rm -rf /*有点粗鲁。我在网上找了一个类似的问题:how to check for the "backspace" character in C

这至少是我的想法,但我知道我可能还有其他需要防范的事情。有没有更多经验的人可以帮我列出我在使用用户输入作为分层文件命名系统的一部分将文件保存到服务器时需要验证的内容吗?

示例文件:/home/webapp/data/{User input}/{Machine-ID}/{hostname}/{tag},当提交到我们的日志存储系统时,所有这些字段都可以“伪造”。

2 个答案:

答案 0 :(得分:4)

不要检查错误的字符,而是转动问题并指定好的字符。例如。 require {User Input}是由[[:alnum:]_]个字符组成的单个目录名; {Machine-ID}必须根据您的喜好[[:xdigit:]]制作,等等。快速摆脱所有注射的东西。

答案 1 :(得分:2)

如果您只是在程序中使用这些输入作为文件名,并且将它们存储在本机Linux文件系统中,那么需要注意的关键事项是:

  • 绝对禁止以../开头或包含/../或以/..结尾的文件名。此类文件名可以允许用户访问您正在使用的目录树之外的文件。
  • 警惕任何包含/的文件名,因为它们允许用户命名子目录,可能会产生意想不到的后果。

其他可能导致问题的事情包括:

  • 非ASCII字符,如果在其他语言环境中使用,则可能具有不同的含义。
  • 某些ASCII标点字符在处理系统的某些部分可能具有特殊含义,或者在某些文件系统中可能无效。
  • 系统的某些部分可能区分大小写,其他部分不区分大小写。考虑对案例进行规范化。

如果适用,请将每个字段限制为不会造成任何问题的字段。例如:

  • 机器ID可能只包含ASCII低位字母和数字(或仅包含ASCII大写字母和数字)。
  • 主机名应仅包含ASCII小写字母和数字,加上-但不在初始位置(对于非ASCII主机名使用Punycode)。如果这些是完全限定的主机名,而不是网络中的主机名,则.也有效,但不在初始位置。
  • 任何字段都不应为空或包含/或以.开头(初始.可以是... - 请参阅上文 - 并且是ls默认情况下不显示的点文件,并且未包含在shell中的模式*中,因此最好避免使用它们。)

虽然退格之类的控制字符不会直接有害,但它们可能间接有害,因为如果您在命令行上调查问题,它们可能会导致您犯错误。不要允许他们。