Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于解析或验证Base64数据的正则表达式_Regex_Base64_Standards Compliance_Rfc - Fatal编程技术网

Regex 用于解析或验证Base64数据的正则表达式

Regex 用于解析或验证Base64数据的正则表达式,regex,base64,standards-compliance,rfc,Regex,Base64,Standards Compliance,Rfc,是否可以使用正则表达式来验证或清理Base64数据?这是一个简单的问题,但驱动这个问题的因素是使它变得困难的原因。 我有一个Base64解码器,它不能完全依赖输入数据来遵循RFC规范。因此,我面临的问题可能是Base64数据可能无法分解为78(我认为是78,我必须再次检查RFC,所以如果确切数字错误,请不要告诉我)字符行,或者这些行可能不会以CRLF结尾;因为它可能只有CR或LF,或者两者都没有 所以,我花了很长时间来解析Base64格式的数据。因此,下面的示例不可能可靠地解码。为了简洁起见,我

是否可以使用正则表达式来验证或清理Base64数据?这是一个简单的问题,但驱动这个问题的因素是使它变得困难的原因。

我有一个Base64解码器,它不能完全依赖输入数据来遵循RFC规范。因此,我面临的问题可能是Base64数据可能无法分解为78(我认为是78,我必须再次检查RFC,所以如果确切数字错误,请不要告诉我)字符行,或者这些行可能不会以CRLF结尾;因为它可能只有CR或LF,或者两者都没有

所以,我花了很长时间来解析Base64格式的数据。因此,下面的示例不可能可靠地解码。为了简洁起见,我将只显示部分MIME头

Content-Transfer-Encoding: base64

VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
好的,解析这是没有问题的,这正是我们所期望的结果。在99%的情况下,使用任何代码至少验证缓冲区中的每个字符是否为有效的base64字符都可以完美地工作。但是,下一个例子对这一组合产生了影响

Content-Transfer-Encoding: base64

http://www.stackoverflow.com
VGhpcyBpcyBzaW1wbGUgQVNDSUkgQmFzZTY0IGZvciBTdGFja092ZXJmbG93IGV4YW1wbGUu
这是Base64编码的一个版本,我在一些病毒和其他东西中看到过,它们试图利用一些邮件阅读器不惜一切代价解析mime,而不是严格按照书中的规定,或者更确切地说是RFC;如果你愿意的话。 我的Base64解码器将第二个示例解码为以下数据流。请记住,原始流都是ASCII数据

[0x]86DB69FFFC30C2CB5A724A2F7AB7E5A307289951A1A5CC81A5CC81CDA5B5C1B19481054D0D
2524810985CD94D8D08199BDC8814DD1858DAD3DD995C999B1BDDC8195E1B585C1B194B8
有谁能同时解决这两个问题?除了使用不同的规则对数据进行两次转换并比较结果之外,我甚至不确定这是否可行。但是,如果您采用这种方法,您相信哪种输出?似乎ASCII启发式是最好的解决方案,但这会增加多少代码、执行时间和复杂性,从而增加像病毒扫描程序这样复杂的东西,而这段代码实际上涉及到病毒扫描程序?您将如何训练启发式引擎以了解哪些是可接受的,哪些是不可接受的


更新: 关于这个问题继续得到的视图数量,我决定发布一个简单的正则表达式,我在C#应用程序中使用了3年,现在有几十万个事务。老实说,我喜欢最好的人给出的答案,这就是为什么我选择它作为选择答案的原因。但是对于任何使用C#的人来说,如果他们想寻找一种非常快速的方法来至少检测字符串或字节[]是否包含有效的Base64数据,我发现以下方法对我来说非常有效

[^-A-Za-z0-9+/=]|=[^=]|={3,}$
是的,这只是一个Base64数据字符串,而不是一个格式正确的消息。因此,如果您正在处理这种类型的数据,请在尝试使用上述正则表达式之前考虑到这一点。如果出于其他目的(URL、文件名、XML编码等)处理Base16、Base32、基数甚至Base64,然后,强烈建议您阅读他的回答中提到的内容,因为在尝试使用此问题/答案集中的建议之前,您需要充分了解实现所使用的字符集和终止符。

来自:

在许多情况下,数据的基本编码用于存储或传输环境中的数据,这些环境可能出于遗留原因,仅限于US-ASCII数据

因此,如果数据被认为是危险的,这取决于使用编码数据的目的

但是,如果您只是在寻找一个正则表达式来匹配Base64编码字,则可以使用以下方法:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$
无论是“”还是“”都不会显示在有效的Base64中,因此我认为您可以明确地丢弃
http://www.stackoverflow.com
行。在Perl中,比如说

my $sanitized_str = join q{}, grep {!/[^A-Za-z0-9+\/=]/} split /\n/, $str;

say decode_base64($sanitized_str);
也许是你想要的。它产生

这是StackOverflow exmaple的简单ASCII Base64

这一个很好,但将匹配一个空字符串

此项与空字符串不匹配:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$

到目前为止,我能找到的最好的正则表达式就在这里

它在当前版本中看起来像:

module.exports = function (opts) {
  opts = opts || {};
  var regex = '(?:[A-Za-z0-9+\/]{4}\\n?)*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)';

  return opts.exact ? new RegExp('(?:^' + regex + '$)') :
                    new RegExp('(?:^|\\s)' + regex, 'g');
};

要验证base64图像,我们可以使用这个正则表达式

/^数据:图像/(?:gif | png | jpeg | bmp | webp)(?:;charset=utf-8)?;base64,(?:[A-Za-z0-9]|[+/])+={0,2}


下面是另一个正则表达式:

^(?=(.{4})*$)[A-Za-z0-9+/]*={0,2}$
它满足以下条件:

  • 字符串长度必须是四的倍数-
    (?=^(.{4})*$)
  • 内容必须是字母数字字符或+或/-
    [A-Za-z0-9+/]*
  • 它的结尾最多可以有两个填充(=)字符-
    ={0,2}
  • 它接受空字符串

到目前为止给出的答案未能检查Base64字符串的所有填充位是否都设置为0,因为它是Base64的规范表示(这在某些环境中很重要,请参阅),因此,它们允许对同一二进制字符串使用不同编码的别名。在某些应用程序中,这可能是一个安全问题

以下是验证给定字符串不仅是有效的base64,而且是二进制数据的规范base64字符串的regexp:

^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$
引用的RFC认为空字符串有效(请参阅),因此上面的正则表达式也有效

base64url的等效正则表达式(同样,请参考上述RFC)为:


我想你必须更好地定义任务。完全不清楚你的目标是什么:严格?分析100%的样本。。。第一个示例应该是“vghpcybpcybhihnpbxbszsbbu0njssbcynlnjqgzxhbxbszmb3igu3rhy2tpdmvyzmxvdy4=”为什么不在您的语言中使用标准解决方案?为什么需要基于regexs的手写解析器?这是一个很好的问题。虽然我尝试使用UPDATE正则表达式,方法是对NPM返回的base64编码SHA运行它,而选择的答案中使用了正则表达式。我不确定UPDATE正则表达式是如何在没有更正的情况下仍然发布的,但看起来作者想将
^
ou
^(?=(.{4})*$)[A-Za-z0-9+/]*={0,2}$
^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/][AQgw]==|[A-Za-z0-9+/]{2}[AEIMQUYcgkosw048]=)?$
^(?:[A-Za-z0-9_-]{4})*(?:[A-Za-z0-9_-][AQgw]==|[A-Za-z0-9_-]{2}[AEIMQUYcgkosw048]=)?$