Perl 如果不使用-T/-B,如何从二进制数据中识别源代码?

Perl 如果不使用-T/-B,如何从二进制数据中识别源代码?,perl,Perl,我想在Perl中的二进制文件上使用binmode。那么我怎么知道手头的文件是二进制文件还是文本文件呢 这意味着首先我要读取完整的文件,知道它是二进制的还是文本的,然后用binmode设置倒带FP,如果它是二进制的 由于Perl-B/-T只检查文本的开头部分,它通常将pdf分类为文本文件(源代码可能隐藏在任何扩展名中,如.gif、.pdf等)。所以我需要读取完整的文件数据来决定它是二进制文件还是文本文件 我听说任何源代码文件(.pl、.c、.php等)都不会包含0x0-0x1f和0xff等不可见字

我想在Perl中的二进制文件上使用binmode。那么我怎么知道手头的文件是二进制文件还是文本文件呢

这意味着首先我要读取完整的文件,知道它是二进制的还是文本的,然后用binmode设置倒带FP,如果它是二进制的

由于Perl-B/-T只检查文本的开头部分,它通常将pdf分类为文本文件(源代码可能隐藏在任何扩展名中,如.gif、.pdf等)。所以我需要读取完整的文件数据来决定它是二进制文件还是文本文件

我听说任何源代码文件(.pl、.c、.php等)都不会包含0x0-0x1f和0xff等不可见字符


我可以检查每个字节是否在此范围内,以声明它是否是源代码文件吗?

问题是,在现代POSIX系统上,二进制文件和文本文件之间没有区别;一个字节就是一个字节就是一个字节

我宁愿尝试另一种方法。如果您使用Linux/Unix,您可以直接利用
file
实用程序,该实用程序使用“magic”来窥视文件的第一个字节(在某些情况下更进一步),并确定其类型;在Windows中,您必须首先安装它。此实用程序使捕获可执行文件、zip文件等变得相对简单


在Perl中,您可以通过模块使用它。

问题是在现代POSIX系统上,二进制文件和文本文件之间没有区别;一个字节就是一个字节就是一个字节

我宁愿尝试另一种方法。如果您使用Linux/Unix,您可以直接利用
file
实用程序,该实用程序使用“magic”来窥视文件的第一个字节(在某些情况下更进一步),并确定其类型;在Windows中,您必须首先安装它。此实用程序使捕获可执行文件、zip文件等变得相对简单


在Perl中,您可以通过模块使用它。

如果您对安全性有疑虑,只需确保将可执行文件与数据分开即可
binmode
对此没有帮助:它可以用来克服DOS和子代上的行尾恐惧,还可以用来指定透明编码

出于您的考虑,所有用户上传的文件都是恶意的。没有“安全”格式,因此将“二进制”文件与“文本”文件分开是无用的。不要相信简单的试探法。(例如Perl允许!)

在处理用户数据时,Perl有几个关键部分,您应该确保没有未经检查的输入到达:

  • 正则表达式可以通过
    (?{})和(??{})
    执行任意代码
  • system
    exec
    qx()
    ,反勾号不言自明
  • eval
    -插入变量时要小心
  • 其他有趣的点是
    open
    glob
    ,以及C-ish字符串函数的参数
  • binmode
    不在其中


    如果必须为用户指定的数据提供服务,请尝试通过未经处理的数据传递数据。例如,对于用户定义的样式表,它属于php不解释的目录。对于图像,您可以尝试在收到后转换文件,并保存一个等效但可能是安全的变体。

    如果您对安全性有疑虑,只需确保将可执行文件与数据分开即可
    binmode
    对此没有帮助:它可以用来克服DOS和子代上的行尾恐惧,还可以用来指定透明编码

    出于您的考虑,所有用户上传的文件都是恶意的。没有“安全”格式,因此将“二进制”文件与“文本”文件分开是无用的。不要相信简单的试探法。(例如Perl允许!)

    在处理用户数据时,Perl有几个关键部分,您应该确保没有未经检查的输入到达:

  • 正则表达式可以通过
    (?{})和(??{})
    执行任意代码
  • system
    exec
    qx()
    ,反勾号不言自明
  • eval
    -插入变量时要小心
  • 其他有趣的点是
    open
    glob
    ,以及C-ish字符串函数的参数
  • binmode
    不在其中


    如果必须为用户指定的数据提供服务,请尝试通过未经处理的数据传递数据。例如,对于用户定义的样式表,它属于php不解释的目录。对于图像,您可以尝试在收到文件后转换文件,并保存一个等效但可能是安全的变体。

    如果是文本文件,您真的需要以文本模式读取文件吗?您可以无条件地使用
    binmode


    如果您有一段处理文本文件的代码,它可以过滤掉任何无关的回车(0D)。如果您没有这样一段代码,那么回车是否保留在文本中肯定无关紧要。

    如果是文本文件,您真的需要以文本模式读取该文件吗?您可以无条件地使用
    binmode


    如果您有一段处理文本文件的代码,它可以过滤掉任何无关的回车(0D)。如果您没有这样一段代码,那么回车是否保留在其中肯定无关紧要。

    为什么不使用文件扩展名呢?一种常见的启发式方法是查找空(零)字节,如果发现了,请声明该文件为二进制文件。对被黑客攻击的唯一合理反应是在经过更新和强化的干净安装上恢复已知良好的备份。现在您明白了为什么要在备份和版本控制上花费这么多时间和精力。为什么不始终使用
    binmode
    ?文件的行尾将有CR LF,而不仅仅是LF。如果您有专门处理文本文件的代码,那么它可以删除CRs。为什么不使用文件扩展名呢?一个常见的启发式方法是查找空(零)字节,如果找到,则声明文件二进制。对被黑客攻击的唯一合理响应是恢复已知的良好备份