快速注释:
我愿意检查要传递给Buffer.from的字符串是否为base64格式。我了解到,检查字符串是否为base64格式的最佳方法是通过regex,尽管它并不完美。因此,我考虑过检查base64解码的结果,而不是检查传递给base64解码的内容。
代码:
let buffer = Buffer.from('hey there', 'base64');
let bufferResult = buffer.toString('utf-8');
console.log(text.toString()) // Output: �쭅��
我正在尝试做的事情:
我想检查�쭅��
和buffer.toString()的类似输出,以保护我的应用程序免受不良输出的影响。我已经创建了简单的RegEx来解决这个/^[a-zA-Z]+$/
的问题,但是我不认为它很健壮(主要是因为我不知道buffer.toString()可以输出什么)。
我吠叫了错误的树,应该检查Buffer.from的输入,还是有正确的方法来实现我要执行的操作?
答案 0 :(得分:0)
您的问题中有一个问题:Base64有多种编码,具体取决于字符串中使用的其他非字母数字字符。
Base64编码使用所有大写ASCII字符,所有小写数字(这使26 + 26 + 10 = 62个字符)和另外两个字符集(取决于您使用base64编码的目的){{ 1}},{'+', '/'}
,{'.', '-'}
等(请参见here for a thorough explanation)。
另一个问题是,通常,在较长的Base64字符串上,行长度限制为76个字符,因此base64字符串中散布了换行符(有些带有{'.', '_'}
中的\r
),直到最后一行,可以包含一个或两个CRLF
个字符。
另外,一些(并非全部)base64字符串以一个或两个'='
字符结尾,具体取决于所使用的字符总数( mod 4 )(这不是可选的,但是某些编码(例如网址)不使用最终的等号)
如果您假装解析'='
(关于mime编码使用),则a valid (and strict) regex for base64 can be:
+/
但是在使用它之前要三思,因为它会匹配最长的base64字符串(因为它无法分析要匹配的上下文),并且忽略它后面的任何多余字符,因此对于无效的base64字符串,例如:
(((\r?\n|\s)*[A-Za-z0-9+\/]){4})*(((\r?\n|\s)*[A-Za-z0-9+\/]){2}((\r?\n|\s)*=){2}|((\r?\n|\s)*[A-Za-z0-9+\/]){3}((\r?\n|\s)*=){1})?
(具有5个字符,而base64必须是四个字符的倍数,包括最后的ABCDE
),它将匹配前四个字符('='
作为有效的base64,是最长的base64可能匹配的字符串(为使该字符串有效,应将其编码为"ABCD"
(假设最后一个字节的丢失两位为零)。请参见上面的演示以获取此示例。空字符串匹配(这是有效的零长度base64字符串)
一个好的base64解码器不仅会以与regex匹配器相同的方式解析字符串,而且还会生成表示在其上的二进制字符串(花费的精力很少),所以我建议您不要使用(在这种情况下)是一个正则表达式匹配器,但只是作为练习,或者作为对客户端浏览器中的javascript验证程序的一种尝试,在将base64编码的字符串发送到服务器之前检查格式,还需要再次对其进行解码)
接下来是检查base64字符串的一个很好的测试:强制在行的开头和base64编码的字符串之间以及从编码的字符串的结尾和行的结尾之间仅允许空白。强制使用自己的行进行base64编码),这将使其成为更强大的测试:
ABCDEA==