2012-04-19 29 views
5

Tôi nhận được cảnh báo sau khi tôi cố gắng sử dụng base64_decode() chức năngbase64_ *, phải làm gì bây giờ?

"Warning: base64_decode() has been disabled for security reasons" 

Hình như máy chủ của tôi đã vô hiệu hóa base64_ * chức năng.

Tôi có vài câu hỏi

  1. Tôi nghĩ base64_ chức năng * có thể được kích hoạt theo mặc định trong php, có đúng không?
  2. Có bất kỳ lý do bảo mật nào khiến chức năng base64_ * không được bật không? Bất kỳ vi phạm an ninh?
  3. Thay thế cho các hàm base64_ *, có sẵn theo mặc định?
  4. Tôi có thể tìm lớp/chức năng tùy chỉnh để thực hiện base64_ *, để tôi có thể có chúng trong tệp PHP của mình và sử dụng chúng nếu các hàm base64_ * của PHP không khả dụng?

Giúp đánh giá cao.

+0

phân bổ cho các kịch bản khó chịu đang base_64 mã hóa thành các hàm eval. Nếu bạn thực sự cần nó, thay đổi máy chủ –

+4

Nếu chủ nhà của bạn tin vào "an ninh bởi hoang tưởng" ... THAY ĐỔI HOSTS. –

+0

là phần mềm gián điệp của họ không base64 tương thích? :) – Hajo

Trả lời

-2

Đây là sự cố lưu trữ.

Vui lòng thay đổi Hosting của bạn hoặc yêu cầu họ xóa sự cố bảo mật này

7

Tôi đã viết các chức năng thay thế cho tất cả các mục đích cơ bản.

Nhìn đây:

function base64_decode($input) { 
    $keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 
    $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 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/='; 
    $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); 
} 

Nhưng đừng quên các charCodeAtcharAt chức năng. Cả hai đều cần thiết cho base64_encode. Hai chức năng base64_encodebase64_decode đều hoạt động giống như các hàm PHP sẵn có. Nhưng chỉ sử dụng chúng, nếu những người sẵn có không sẵn sàng vì chúng không nhanh như những người sẵn có.

Hy vọng điều đó sẽ hữu ích!

+0

Tôi yêu bạn! Đây là câu trả lời bạn muốn tìm trong trường hợp khẩn cấp không có thời gian để mã = ​​P –

+1

Cảm ơn @Ivan Shatsky 'return ($ r? Substr ($ enc, 0, ($ r - 3)). Substr ('== = ', $ r): $ enc);' – jankal

+0

Nếu bạn cần bắt chước hành vi chính xác của _base64_decode_, như tôi làm, bạn phải "' Trả về FALSE nếu đầu vào chứa ký tự từ bên ngoài bảng chữ cái base64.' "(như [PHP Thủ công] (https://secure.php.net/manual/en/function.base64-decode.php#refsect1-function.base64-decode-parameters) nói). Để làm điều đó, tôi đã đổi tên $ input thành $ filter (giữ nguyên giá trị ban đầu của tham số) và sau đó tôi thêm dòng: 'if ($ filter! = $ Input) return false;'. –

1

Chỉ cần đăng ký để nhận xét câu trả lời của jankal, nhưng không thể làm điều đó mà không có danh tiếng.

Dòng cuối cùng của mã chức năng base64_encode trong câu trả lời jankal là

return ($r ? substr($enc, 0, ($r - 3)) : $enc) . substr('===', ($r || 3)); 

nơi $ r có thể là 0, 1 hoặc 2. Theo tôi được biết, ($ r || 3) biểu hiện giá trị bằng cách mã logic phải 3 khi $ r = 0 và $ r trong hai trường hợp khác, nhưng trong thực tế (PHP 5.6/7.0) giá trị của biểu thức này luôn bằng 1, vì vậy chuỗi được mã hóa Base64 của chúng tôi luôn kết thúc bằng hai ký hiệu '=', chắc chắn là sai.

Giải pháp của tôi:

return ($r ? substr($enc, 0, ($r - 3)) . substr('===', $r) : $enc); 
+1

Cảm ơn bạn rất nhiều! – jankal

+1

Tôi có được phép sử dụng các thay đổi trong câu trả lời của tôi khi chỉnh sửa không? – jankal

+2

Tôi chỉ làm điều đó ... nếu có khiếu nại: xin vui lòng bình luận hoặc gửi cho tôi một tin nhắn. – jankal

0
function myencode($input) 
    { 
    $CODES = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    // 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 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

// 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)); 
    } 
Các vấn đề liên quan