Ian*_*ber 31 php base64 encode
有没有办法检测PHP中的字符串是否为base64_encoded()?
我们将一些存储从纯文本转换为base64,其中一部分存在于需要更新的cookie中.如果文本尚未编码,我想重置他们的cookie,否则不管它.
chr*_*and 25
对已经回答的问题的迟到回应表示歉意,但我认为base64_decode($ x,true)对于这个问题来说是一个很好的解决方案.事实上,可能没有一个非常好的解决方案可以对付任何给定的输入.例如,我可以将大量错误值放入$ x而不会得到错误的返回值.
var_dump(base64_decode('wtf mate',true));
string(5) "???j?"
var_dump(base64_decode('This is definitely not base64 encoded',true));
string(24) "N???^~)??r??[j?????"
Run Code Online (Sandbox Code Playgroud)
我认为除了严格的返回值检查之外,您还需要进行解码后验证.最可靠的方法是,如果您可以解码然后检查一组已知的可能值.
如果您检查输出以查看是否有许多超出正常范围的utf-8(或您使用的任何编码)字符,那么精度低于100%(更接近较长字符串,短字符串不准确)的更通用解决方案.
看这个例子:
<?php
$english = array();
foreach (str_split('az019AZ~~~!@#$%^*()_+|}?><": Iñtërnâtiônàlizætiøn') as $char) {
echo ord($char) . "\n";
$english[] = ord($char);
}
echo "Max value english = " . max($english) . "\n";
$nonsense = array();
echo "\n\nbase64:\n";
foreach (str_split(base64_decode('Not base64 encoded',true)) as $char) {
echo ord($char) . "\n";
$nonsense[] = ord($char);
}
echo "Max nonsense = " . max($nonsense) . "\n";
?>
Run Code Online (Sandbox Code Playgroud)
结果:
Max value english = 195
Max nonsense = 233
Run Code Online (Sandbox Code Playgroud)
所以你可能会这样做:
if ( $maxDecodedValue > 200 ) {} //decoded string is Garbage - original string not base64 encoded
else {} //decoded string is useful - it was base64 encoded
Run Code Online (Sandbox Code Playgroud)
你应该使用解码值的mean()而不是max(),我在这个例子中只使用了max(),因为PHP中没有内置的mean().您使用什么衡量标准(平均值,最大值等)与阈值(例如200)取决于您的估计使用情况.
总而言之,唯一的胜利之举就是不玩.我试图避免首先辨别base64.
Ami*_*mir 19
我有同样的问题,我最终得到了这个解决方案:
if ( base64_encode(base64_decode($data)) === $data){
echo '$data is valid';
} else {
echo '$data is NOT valid';
}
Run Code Online (Sandbox Code Playgroud)
小智 18
function is_base64_encoded($data)
{
if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $data)) {
return TRUE;
} else {
return FALSE;
}
};
is_base64_encoded("iash21iawhdj98UH3"); // true
is_base64_encoded("#iu3498r"); // false
is_base64_encoded("asiudfh9w=8uihf"); // false
is_base64_encoded("a398UIhnj43f/1!+sadfh3w84hduihhjw=="); // false
Run Code Online (Sandbox Code Playgroud)
http://php.net/manual/en/function.base64-decode.php#81425
我们可以将三个东西组合成一个函数来检查给定的字符串是否是有效的64位编码.
function validBase64($string)
{
$decoded = base64_decode($string, true);
// Check if there is no invalid character in string
if (!preg_match('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/', $string)) return false;
// Decode the string in strict mode and send the response
if (!base64_decode($string, true)) return false;
// Encode and compare it to original one
if (base64_encode($decoded) != $string) return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
我正准备在 php 中构建一个 base64 切换,这就是我所做的:
function base64Toggle($str) {
if (!preg_match('~[^0-9a-zA-Z+/=]~', $str)) {
$check = str_split(base64_decode($str));
$x = 0;
foreach ($check as $char) if (ord($char) > 126) $x++;
if ($x/count($check)*100 < 30) return base64_decode($str);
}
return base64_encode($str);
}
Run Code Online (Sandbox Code Playgroud)
它非常适合我。这是我对它的完整想法:http : //www.albertmartin.de/blog/code.php/19/base64-detection
在这里你可以试试:http : //www.albertmartin.de/tools
迟到总比不到好:您也许可以mb_detect_encoding()用来确定编码后的字符串是否看起来像某种文本:
function is_base64_string($s) {
// first check if we're dealing with an actual valid base64 encoded string
if (($b = base64_decode($s, TRUE)) === FALSE) {
return FALSE;
}
// now check whether the decoded data could be actual text
$e = mb_detect_encoding($b);
if (in_array($e, array('UTF-8', 'ASCII'))) { // YMMV
return TRUE;
} else {
return FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66391 次 |
| 最近记录: |