我有一个字符串,如果它是有效的base64编码,想要使用PHP进行测试。
答案 0 :(得分:89)
我意识到这是一个古老的话题,但使用严格的参数并不一定有帮助。
在字符串上运行base64_decode,例如“我不是64位编码”,不会返回false。
如果您尝试使用strict解码字符串并使用base64_encode重新编码,则可以将结果与原始数据进行比较,以确定它是否是有效的bas64编码值:
if ( base64_encode(base64_decode($data, true)) === $data){
echo '$data is valid';
} else {
echo '$data is NOT valid';
}
答案 1 :(得分:20)
您可以使用此功能:
function is_base64($s)
{
return (bool) preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s);
}
答案 2 :(得分:11)
此代码应该有效,因为如果字符串无效,则decode函数返回FALSE:
if (base64_decode($mystring, true)) {
// is valid
} else {
// not valid
}
您可以在the documentation中阅读有关base64_decode函数的更多信息。
答案 3 :(得分:6)
我认为唯一的方法是在$strict
参数设置为true
的情况下执行base64_decode()
,并查看它是否返回false
。
答案 4 :(得分:5)
只是对于字符串,你可以使用这个函数,在返回true之前检查几个base64属性:
function is_base64($s){
// Check if there are valid base64 characters
if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s)) return false;
// Decode the string in strict mode and check the results
$decoded = base64_decode($s, true);
if(false === $decoded) return false;
// Encode the string again
if(base64_encode($decoded) != $s) return false;
return true;
}
答案 5 :(得分:2)
这是一个非常古老的问题,但我发现以下方法实际上是防弹。它还会考虑那些带有无效字符的奇怪字符串,这些字符串在验证时会导致异常。
public static function isBase64Encoded($str)
{
try
{
$decoded = base64_decode($str, true);
if ( base64_encode($decoded) === $str ) {
return true;
}
else {
return false;
}
}
catch(Exception $e)
{
// If exception is caught, then it is not a base64 encoded string
return false;
}
}
我从this page得到了这个想法并将其改编为PHP。
答案 6 :(得分:0)
如果您正在使用js进行api调用,以将图像/文件上传到后端,则可能有帮助
function is_base64_string($string) //check base 64 encode
{
// Check if there is no invalid character in string
if (!preg_match('/^(?:[data]{4}:(text|image|application)\/[a-z]*)/', $string)){
return false;
}else{
return true;
}
}
答案 7 :(得分:0)
好吧...终于,我找到了解决这个问题的防弹解决方案。使用以下功能检查字符串是否为base64编码-
private function is_base64_encoded($str) {
$decoded_str = base64_decode($str);
$Str1 = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $decoded_str);
if ($Str1!=$decoded_str || $Str1 == '') {
return false;
}
return true;
}
答案 8 :(得分:0)
此处的答案最不可靠
实际上,没有可靠的答案,因为许多非base64编码的文本将被可读为base64编码,因此没有确定的默认方法。
此外,值得注意的是base64_decode 将解码许多无效的字符串
例如,and
不是有效的base64编码,但是base64_decode会对其进行解码。特别是jw
。 (我是很难学到的)
也就是说,最可靠的方法是如果您控制输入,则在对字符串进行编码后将唯一的而不是base64的标识符添加到字符串,并将其与其他检查一起包括在内。它不是防弹的,但是比我见过的任何其他解决方案都更耐弹。例如:
function my_base64_encode($string){
$prefix = 'z64ENCODEDz_';
$suffix = '_z64ENCODEDz';
return $prefix . base64_encode($string) . $suffix;
}
function my_base64_decode($string){
$prefix = 'z64ENCODEDz_';
$suffix = '_z64ENCODEDz';
if (substr($string, 0, strlen($prefix)) == $prefix) {
$string = substr($string, strlen($prefix));
}
if (substr($string, (0-(strlen($suffix)))) == $suffix) {
$string = substr($string, 0, (0-(strlen($suffix))));
}
return base64_decode($string);
}
function is_my_base64_encoded($string){
$prefix = 'z64ENCODEDz_';
$suffix = '_z64ENCODEDz';
if (strpos($string, 0, 12) == $prefix && strpos($string, -1, 12) == $suffix && my_base64_encode(my_base64_decode($string)) == $string && strlen($string)%4 == 0){
return true;
} else {
return false;
}
}
答案 9 :(得分:0)
我写的这个方法在我的项目上工作得很好。当您将base64 Image传递给此方法时,如果有效返回true,否则返回false。让我们尝试,让我知道任何错误。我将对该功能进行编辑和学习。
split(",")
答案 10 :(得分:0)
我编写了一种解决方案,以验证图像检查正弦性
$image = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABfVBMVEUAAAAxMhQAoIpFLCTimAE2IRs0IBodEg4OJyEAnYcAmoUAjnoALyn5rgNJLydEKyM5lWFFLCTuogI/JyBAKCHZnQoAlIAAkn48JR6fYgCIVACDUACPbAsAW06IWgAaDw0jFQscEQ4Am4XIfQDGewDhlwHelQEAi3gAe2oAd2cAXE8gFBAeEg8AVEgAtJwAsZn/vhMAuJ//xyMAu6BfQTf/wxv9wRlcPjVhQjj/vBBdQDb/xR9oSD1iRDlWOjH9xSL/uQr+twhkRTplRjxZPDPZpydILydAQD+pezNjRTNQNS3tuCZGLSX4sQn/tQTllgDhkgAArZUAqJFvTUD/wRgGtpp2m0aPaTl+azOIcjGkhS6OaS1ONCvNnirHmSrnsifHnSfFjyemfCfcqSa/jyLwuR/ptB/MmRxiPhnpqRX1sxHzqwnCfgb+tQTYjALnmQH2qQDzpQDejgAnsYQnsYNwTkBlRTtfQi9eQS+1kCy2kSuFYSuEYSvkpRfrqxQPeVhkAAAALnRSTlMADPz0qnhzNBPry5kH/vr36ubKxLy4sKmifVVNQT84Ih4Y2aWloqKMgHdJPDwse8ZSvQAAAbVJREFUOMuV0uVzggAYx3Gsbca6u3vDqSDqBigD25nrLrvX+bfvMSeId9vnBXD3+97zCuQ/ZhUDvV1dvQOKWfFdIWOZHfDMyhRi+4ibZHZLwS5Dukea97YzzAQFYEgTdtYm3DtkhAUKkmFI0mTCCFmH8ICbsEBRhmEWwi080U+xBNwApZlgqX7+rummWJcLEkAQLhdLdWt4wbSXOqX1Hu784uKc8+jpU8o7zQva7RSnb8BR9nZesGF/oelLT2X1XNL0q31dcOGDPnwKO7eBMxw+pD8FF2a8N9vcyfttKbh9O+HwG+8MLxiL3+FXDsc9Du4djiv8Lj7GC0bTMTx6dGzEgfH4KIrH0qO8YDyQjESMvyLJwDjCs5DaKsvlzOV3ah4RkFcCM+wlckRoymcG107ntRn4ppAmSzar9Tvh830lrFbbItJM0meDBcCzT4KIFfLOzB7IdMphFzUxWMjnC4MToqNkbWVY1RPw+wM9quHVSY1gnhyShlCd4aHo9xcfDTptSKnebPxjh0Kooewgmz2ofKFStaS+z2l1Nfv79c+gqlaog6io4HI1UKItKKuBVNuCFPmDH12fd4lDaGbkAAAAAElFTkSuQmCC';
$allowedExtensions = ['png', 'jpg', 'jpeg'];
// check if the data is empty
if (empty($image)) {
echo "Empty data";
}
// check base64 format
$explode = explode(',', $image);
if(count($explode) !== 2){
echo "This string isn't sintaxed as base64";
}
//https://stackoverflow.com/a/11154248/4830771
if (!preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $explode[1])) {
echo "This string isn't sintaxed as base64";
}
// check if type is allowed
$format = str_replace(
['data:image/', ';', 'base64'],
['', '', '',],
$explode[0]
);
if (!in_array($format, $allowedExtensions)) {
echo "Image type isn't allowed";
}
echo "This image is base64";
但是安全的方法是使用Intervention
use Intervention\Image\ImageManagerStatic;
try {
ImageManagerStatic::make($value);
return true;
} catch (Exception $e) {
return false;
}
答案 11 :(得分:0)
我尝试了以下内容:
以下代码实现了上述步骤:
public function IsBase64($data) {
$decoded_data = base64_decode($data, true);
$encoded_data = base64_encode($decoded_data);
if ($encoded_data != $data) return false;
else if (!ctype_print($decoded_data)) return false;
return true;
}
上述代码可能会返回意外结果。例如对于字符串" json"它将返回false。 " JSON"可能是有效的base64编码字符串,因为它具有的字符数是4的倍数,并且所有字符都在base64编码字符串的允许范围内。看来我们必须知道原始字符串允许的字符范围,然后检查解码数据是否包含这些字符。
答案 12 :(得分:0)
我知道我提出了一个非常古老的问题,我尝试了所有提出的方法;我终于得到了几乎覆盖我所有情况的正则表达式:
$decoded = base64_decode($string, true);
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
基本上我检查每个不可打印的字符(:graph :)不是空格或制表符(\ s)而不是unicode字母(所有重音例如:èéùìà等)
我仍然对这个字符产生误报:º°但是我从不在字符串中使用它们,对我来说完全无效。 我将此检查与@merlucin
提出的函数进行汇总所以结果:
function is_base64($s)
{
// Check if there are valid base64 characters
if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $s)) return false;
// Decode the string in strict mode and check the results
$decoded = base64_decode($s, true);
if(false === $decoded) return false;
// if string returned contains not printable chars
if (0 < preg_match('/((?![[:graph:]])(?!\s)(?!\p{L}))./', $decoded, $matched)) return false;
// Encode the string again
if(base64_encode($decoded) != $s) return false;
return true;
}
答案 13 :(得分:0)
旧主题,但我发现了这个功能并且它正在运行:
function checkBase64Encoded($encodedString) {
$length = strlen($encodedString);
// Check every character.
for ($i = 0; $i < $length; ++$i) {
$c = $encodedString[$i];
if (
($c < '0' || $c > '9')
&& ($c < 'a' || $c > 'z')
&& ($c < 'A' || $c > 'Z')
&& ($c != '+')
&& ($c != '/')
&& ($c != '=')
) {
// Bad character found.
return false;
}
}
// Only good characters found.
return true;
}
答案 14 :(得分:0)
base64_decode()应该返回false。
答案 15 :(得分:0)
您可以通过base64_decode
发送字符串($ strict设置为TRUE),如果输入无效,则返回FALSE。
您也可以使用f.i.正则表达式查看字符串是否包含base64字母表之外的任何字符,并检查它是否在末尾包含适当数量的填充(=
个字符)。但是使用base64_decode要容易得多,并且不应该存在格式错误的字符串造成任何伤害的风险。
答案 16 :(得分:-1)
我正在使用这种方法。它希望最后2个字符是==
substr($buff, -2, 1) == '=' && substr($buff, -1, 1) == '=')
更新:如果上面的一个失败,我最后再做一次检查 base64_decode($ buff,true)
答案 17 :(得分:-1)
如果数据无效,那么函数base64_decode($ string,true)将返回FALSE。