Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.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
Php base64_*功能已禁用,现在要做什么?_Php_Base64_Decode_Encode - Fatal编程技术网

Php base64_*功能已禁用,现在要做什么?

Php base64_*功能已禁用,现在要做什么?,php,base64,decode,encode,Php,Base64,Decode,Encode,当我尝试使用base64_decode()函数时,收到以下警告 看起来我的主机已禁用base64_*函数 我有几个问题 我认为在php中默认情况下可以启用base64_*函数,对吗 没有启用base64_*函数是否有任何安全原因?有安全漏洞吗 默认情况下可用的base64_*函数的替代方案 我在哪里可以找到base64_*实现的自定义类/函数,这样我就可以在我的PHP文件中使用它们,如果PHP的base64_*函数不可用,就可以使用它们 感谢您的帮助。这是托管问题 请更改您的主机或要求他们删除此

当我尝试使用base64_decode()函数时,收到以下警告

看起来我的主机已禁用base64_*函数

我有几个问题

  • 我认为在php中默认情况下可以启用base64_*函数,对吗
  • 没有启用base64_*函数是否有任何安全原因?有安全漏洞吗
  • 默认情况下可用的base64_*函数的替代方案
  • 我在哪里可以找到base64_*实现的自定义类/函数,这样我就可以在我的PHP文件中使用它们,如果PHP的base64_*函数不可用,就可以使用它们

  • 感谢您的帮助。

    这是托管问题


    请更改您的主机或要求他们删除此安全问题

    我已经为所有base64目的编写了替代函数

    看这里:

    function base64_decode($input) {
        $keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        $chr1 = $chr2 = $chr3 = "";
        $enc1 = $enc2 = $enc3 = $enc4 = "";
        $i = 0;
        $output = "";
    
        // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
        $filter = $input;
        $input = preg_replace("[^A-Za-z0-9\+\/\=]", "", $input);
        if ($filter != $input) {
            return false;
        }
    
        do {
            $enc1 = strpos($keyStr, substr($input, $i++, 1));
            $enc2 = strpos($keyStr, substr($input, $i++, 1));
            $enc3 = strpos($keyStr, substr($input, $i++, 1));
            $enc4 = strpos($keyStr, substr($input, $i++, 1));
            $chr1 = ($enc1 << 2) | ($enc2 >> 4);
            $chr2 = (($enc2 & 15) << 4) | ($enc3 >> 2);
            $chr3 = (($enc3 & 3) << 6) | $enc4;
            $output = $output . chr((int) $chr1);
            if ($enc3 != 64) {
                $output = $output . chr((int) $chr2);
            }
            if ($enc4 != 64) {
                $output = $output . chr((int) $chr3);
            }
            $chr1 = $chr2 = $chr3 = "";
            $enc1 = $enc2 = $enc3 = $enc4 = "";
        } while ($i < strlen($input));
        return urldecode($output);
    }
    
    function base64_encode($data) {
        $b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
        $o1 = $o2 = $o3 = $h1 = $h2 = $h3 = $h4 = $bits = $i = 0;
        $ac = 0;
        $enc = '';
        $tmp_arr = array();
        if (!$data) {
            return data;
        }
        do {
        // pack three octets into four hexets
        $o1 = charCodeAt($data, $i++);
        $o2 = charCodeAt($data, $i++);
        $o3 = charCodeAt($data, $i++);
        $bits = $o1 << 16 | $o2 << 8 | $o3;
        $h1 = $bits >> 18 & 0x3f;
        $h2 = $bits >> 12 & 0x3f;
        $h3 = $bits >> 6 & 0x3f;
        $h4 = $bits & 0x3f;
        // use hexets to index into b64, and append result to encoded string
        $tmp_arr[$ac++] = charAt($b64, $h1).charAt($b64, $h2).charAt($b64, $h3).charAt($b64, $h4);
        } while ($i < strlen($data));
        $enc = implode($tmp_arr, '');
        $r = (strlen($data) % 3);
        return ($r ? substr($enc, 0, ($r - 3)) . substr('===', $r) : $enc);
    }
    
    function charCodeAt($data, $char) {
        return ord(substr($data, $char, 1));
    }
    
    function charAt($data, $char) {
        return substr($data, $char, 1);
    }
    
    函数base64\u解码($input){
    $keyStr=“abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/=”;
    $chr1=$chr2=$chr3=“”;
    $enc1=$enc2=$enc3=$enc4=“”;
    $i=0;
    $output=“”;
    //删除所有非A-Z、A-Z、0-9、+、/、或=
    $filter=$input;
    $input=preg\U替换(“[^A-Za-z0-9\+\/\=]”,“”,$input);
    如果($filter!=$input){
    返回false;
    }
    做{
    $enc1=strpos($keyStr,substr($input,$i++,1));
    $enc2=strpos($keyStr,substr($input,$i++,1));
    $enc3=strpos($keyStr,substr($input,$i++,1));
    $enc4=strpos($keyStr,substr($input,$i++,1));
    $chr1=($enc1>4);
    $chr2=($enc2&15)>2);
    $chr3=($enc3&3)>12&0x3f;
    $h3=$bits>>6&0x3f;
    $h4=$bits&0x3f;
    //使用hexets索引到b64中,并将结果附加到编码字符串中
    $tmp_arr[$ac++]=charAt($b64,$h1)、charAt($b64,$h2)、charAt($b64,$h3)、charAt($b64,$h4);
    }而($i
    但是不要忘记
    charCodeAt
    charAt
    功能。它们都是
    base64\u encode
    所必需的。 这两个函数
    base64\u encode
    base64\u decode
    都像内置PHP函数一样工作。但只有在内置PHP函数由于速度不如内置PHP函数而无法使用时才使用它们


    希望有帮助!

    刚注册评论jankal的答案,但没有声誉就做不到

    jankal答案中函数base64_编码代码的最后一行是

    return ($r ? substr($enc, 0, ($r - 3)) : $enc) . substr('===', ($r || 3));
    
    其中,$r可以是0、1或2。据我所知,$r=0时,($r | | 3)代码逻辑的表达式值必须是3,在其他两种情况下,$r,但在实践中(PHP5.6/7.0)此表达式的值始终等于1,因此我们的BASE64编码字符串总是以两个“=”符号结尾,这肯定是错误的

    我的解决方案:

    return ($r ? substr($enc, 0, ($r - 3)) . substr('===', $r) : $enc);
    
    函数myencode($input)
    {
    $CODES=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyzo123456789+/=”;
    //结果/编码字符串、填充字符串和填充计数
    $r=“”;
    $p=“”;
    $c=strlen($input)%3;
    //添加一个右零填充,使该字符串为3个字符的倍数
    如果($c>0)
    {
    对于(;$c<3;$c++)
    {
    $p.=“=”;
    $input.=“\0”;
    }
    }
    //字符串长度的增量,一次三个字符
    对于($c=0;$c0&($c/3*4)%76==0)
    $r+=“\r\n”;
    //这三个8位(ASCII)字符成为一个24位数字
    $n=(作战需求文件($input[$c])18和63;
    $n2=$n>>12&63;
    $n3=$n>>6&63;
    $n4=$n&63;
    //这四个6位数字用作base64字符列表的索引
    $r.=''.$CODES[$n1]。$CODES[$n2]。$CODES[$n3]。$CODES[$n4];
    }
    返回substr($r,0,(strlen($r)-strlen($p))。$p;
    }  
    函数mydecode($input){
    $CODES=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyzo123456789+/=”;
    //删除/忽略任何不在base64字符列表中的字符
    //或者pad字符,尤其是换行符
    $input=str_替换(“[^”。$CODES.=]”,“”,$input);
    //将任何传入的填充替换为零填充(“a”字符为零)
    $p=($input[strlen($input)-1]='='='?($input[strlen($input)-2]='='='='='?“AA”:“A”):“”);
    $r=“”;
    $input=substr($input,0,(strlen($input)-strlen($p))。$p;
    //此编码字符串长度的增量,一次四个字符
    对于($c=0;$c8)和0xFF)).chr($n和0xFF));
    }
    //移除为使其成为24位的倍数而添加的任何零焊盘
    返回substr($r,0,strlen($r)-strlen($p));
    }
    
    恶意脚本的分配是基本的64编码到eval函数中。如果你真的需要它,如果你的主人相信“偏执狂的安全”,那就换个主机吧。。。更改主机。他们的间谍软件是否与base64不兼容?:)@哈乔:他们可能认为base64_解码的所有使用都与模糊代码有关。这当然是大错特错了。我使用来自的信息,在PHP()中破解了一个糟糕的base32库。我相信这也不难做到。我现在在工作,但是,如果我下班后感到无聊,我可以尝试添加base64。我爱你!这就是你想在没有时间编码的紧急情况下找到的答案。在紧急情况下,没有时间编码=PThanks@Ivan Shatsky
    返回($r?substr($enc,0,($r-3))。substr(“==”,$r):$enc)如果需要模拟t
    
    return ($r ? substr($enc, 0, ($r - 3)) . substr('===', $r) : $enc);
    
    function myencode($input)
        {
        $CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
        // the result/encoded string, the padding string, and the pad count
        $r = "";
        $p= "";
        $c = strlen($input) % 3;
    
        // add a right zero pad to make this string a multiple of 3 characters
        if ($c > 0) 
        {
            for (; $c < 3; $c++)
         {
            $p .= "=";
            $input .= "\0";
         }
        }
    
        // increment over the length of the string, three characters at a time
        for ($c = 0; $c < strlen($input); $c += 3) {
    
    // we add newlines after every 76 output characters, according to the MIME specs
    
            if ($c > 0 && ($c / 3 * 4) % 76 == 0)
            $r += "\r\n";
    
    // these three 8-bit (ASCII) characters become one 24-bit number
    $n = (ord($input[$c]) << 16) + (ord($input[$c +1]) << 8) + (ord($input[$c +2]));
    
    
            // this 24-bit number gets separated into four 6-bit numbers
            $n1 = $n >> 18 & 63;
            $n2 = $n >> 12 & 63;
            $n3 = $n >> 6 & 63;
            $n4 = $n & 63;
    
     // those four 6-bit numbers are used as indices into the base64 character list
    
     $r .= "" . $CODES[$n1] . $CODES[$n2] . $CODES[$n3] . $CODES[$n4];
    
        }
        return substr($r,0,(strlen($r)-strlen($p))) . $p;
        }  
    
    
    
     function mydecode($input) {
    
     $CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    
    // remove/ignore any characters not in the base64 characters list
        // or the pad character -- particularly newlines
    
        $input= str_replace("[^" . $CODES . "=]","",$input);
    
        // replace any incoming padding with a zero pad (the 'A' character is  zero)
        $p = ($input[strlen($input) - 1] == '=' ?($input[strlen($input) - 2] == '=' ? "AA" : "A") : "");
    
        $r = "";
        $input = substr($input,0,(strlen($input) - strlen($p))) . $p;
    // increment over the length of this encoded string, four characters at a time
        for ($c = 0; $c < strlen($input); $c += 4) {
    
    // each of these four characters represents a 6-bit index in the
    // base64 characters list which, when concatenated, will give the
    // 24-bit number for the original 3 characters
    
             $n=(strpos($CODES,$input[$c]) << 18)
             +  (strpos($CODES,$input[$c+1]) << 12)
             +  (strpos($CODES,$input[$c+2]) << 6)
             +  (strpos($CODES,$input[$c+3]));
    
    
    // split the 24-bit number into the original three 8-bit (ASCII) characters
    $r .= "" . chr(($n >> 16) & 0xFF) . chr((($n >> 8) & 0xFF)) . chr(($n & 0xFF));
    
        }
        // remove any zero pad that was added to make this a multiple of 24 bits
            return substr($r,0, strlen($r)- strlen($p));
        }