Página 1 de 1

base64_decode() has been disabled for security reasons

Publicado: 30 Jul 2011, 05:46
por pduthey
Hola Gente!!

no recuerdo si este es mi primer posteo, por las dudas me presento, soy Pablo de Mar del Plata, Argentina y administro varios sitios con distintos gestores de foros, en este caso:

URL: http://www.mdq4x4.com.ar/foro/
Plantilla(s) usuada(s): subsilver2
MODs instalados: ninguno
Versión de phpBB: 3.0.7-PL1
Servidor: http://www.sectorhosting.com/ (pago)

me encontré con un problema cuando el administrador del servicio de Hosting decidió por seguridad deshabilitar la función de PHP base64_decode(), con esto dejo de andar el PHPBB y el foro no se veía bien ya que al dar errores no cargaba los css, deshabilité los errores y lo veía mejor pero no se reemplazaban las etiquetas PHPBB por su correspondiente función.

Primera solución, buscar en este foro, pero no encontré nada :cry:

Segunda solución, hacer entender al admin del hosting que necesitaba esa función, no hubo caso, todavía estoy esperando... tuvo ataques de troyanos eval(base64_decode... y hasta que no lo solucionen queda deshabilitado.

Tercera solución, reescribir esa función a mano y reemplazarla donde se utilizara, googlee pero no encontré nada hecho en PHP, supongo que es porque ya es una función del lenguaje y nadie se le ocurriría reescribirla, encontré una C y la "adapté" a PHP, tuve que cambiarla bastante, el C estaba muy bien utilizado por lo tanto no era fácil de "traducir", me quedó así:

Código: Seleccionar todo

<?php
//* Funcion Decode Base64 en PHP
function decode64($encStr) {
  $base64s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  $decOut = "" ;
  $i = 0 ;
  for ($i=0; $i < strlen($encStr); $i+=4) {
    $bits = str_pad(decbin(strpos($base64s, $encStr[$i])),6,"0",STR_PAD_LEFT).str_pad(decbin(strpos($base64s, $encStr[$i+1])),6,"0",STR_PAD_LEFT).str_pad(decbin(strpos($base64s, $encStr[$i+2])),6,"0",STR_PAD_LEFT).str_pad(decbin(strpos($base64s, $encStr[$i+3])),6,"0",STR_PAD_LEFT);
    $decOut .= chr(bindec(substr($bits,0,8))).chr(bindec(substr($bits,8,8))).chr(bindec(substr($bits,16,8)));
  }
  if (ord($encStr[$i-2]) == 61) {
    return substr($decOut, 0, strlen($decOut)-2);
  }
  else
    if (ord($encStr[$i-1]) == 61) {
      return substr($decOut, 0, strlen($decOut)-1);
    }
    else {
      return $decOut;
    }
}
?>
Luego para incluirla quise agregarla en algun código de los de funciones pero se complicaba en cual y en algunos casos la función base64_decode() se usaba en los mismos archivos de funciones por lo cual hacer un include me daba error en algunos otros lados al encontrar una doble definición de la función por lo tanto copié la función en cada .php que la necesitaba y por las dudas con un nombre distinto por si ese archivo era incluido en otro, los que toqué fueron hasta ahora

/viewtopic.php
/includes/functions_content.php
/includes/functions_posting.php
/includes/functions_privmsgs.php

con esos hasta ahora me alcanzó no se si deberé agregarla a algun lugar mas si lo encuentro lo haré.

Espero que les sirva para salir del paso. :cerveza:

Re: base64_decode() has been disabled for security reasons

Publicado: 30 Jul 2011, 06:44
por leviatan21
Buen aporte, habrá que buscar la manera de hacerlo un poco mas nativo sin tener que editar tantos archivos...
pduthey escribió:con esos hasta ahora me alcanzó no se si deberé agregarla a algun lugar mas si lo encuentro lo haré.
Aqui te dejo lo que encontré, nombre del archivo y cual es la linea que utiliza ese código, espero te sirva de referencia

Código: Seleccionar todo

raíz/cron.php
echo base64_decode('R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');

raíz/search.php	
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);

raíz/viewtopic.php
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);

raíz/viewtopic.php
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['user_sig_bbcode_bitfield']);

raíz/includes/functions.php
list($username, $password) = explode(':', base64_decode(substr($username, 6)), 2);

raíz/includes/functions_content.php
$this->data = base64_decode($bitfield);

raíz/includes/functions_jabber.php
$decoded = base64_decode($xml['challenge'][0]['#']);

raíz/includes/functions_messenger.php
$md5_challenge = base64_decode($this->responses[0]);

raíz/includes/functions_messenger.php
$md5_challenge = base64_decode($this->responses[0]);

raíz/includes/functions_posting.php
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);

raíz/includes/functions_privmsgs.php	
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);

raíz/includes/message_parser.php
$bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));

raíz/includes/message_parser.php		
$bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));		

raíz/includes/message_parser.php
$this->bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));

raíz/includes/message_parser.php
$this->bbcode_bitfield = base64_encode(base64_decode($bbcode_bitfield) | base64_decode($this->bbcode_bitfield));

raíz/includes/captcha/captcha_non_gd.php
$hold_chars[$char] = str_split(base64_decode($this->filtered_pngs[$char]['data']), $raw_width + 1);

raíz/includes/cp/mcp_topic.php	
$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);
Y si tienes el Support ToolKit (STK)

Código: Seleccionar todo

raíz/stk/includes/admin/reparse_bbcode.php		
$this->message_parser->bbcode_bitfield = base64_encode(base64_decode($this->poll_parser->bbcode_bitfield) | base64_decode($this->message_parser->bbcode_bitfield));

Re: base64_decode() has been disabled for security reasons

Publicado: 01 Ago 2011, 16:53
por pduthey
Gracias por la lista de archivos a tocar, de vago no me había puesto a hacer la búsqueda :oops:

Ya lo terminé solucionando poniendo la función en un archivo aparte (./includes/functions_mias.php) y haciendo el include en todos los archivos de la lista, la función la llamé mi_base64_decode() y antes de crearla verifico si ya existe para no tener conflicto con lo cual funciona sin problemas, ademas del include hay que hacer el reemplazo de "base64_decode" por "mi_base64_decode" en cada archivo y ya queda listo :wink:

Así que Problema Solucionado!!

Gracias
Saludos
Pablo

functions_mias.php

Código: Seleccionar todo

<?php
/**
*
* @copyright (c) 2011 Pablo Duthey
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

/**
* mi_base64_decode()
*/

//* Funcion Decode Base64 en PHP
if (!function_exists('mi_base64_decode')) {
  function mi_base64_decode($encStr) {
    $base64s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    $decOut = "" ;
    $i = 0 ;
    for ($i=0; $i < strlen($encStr); $i+=4) {
      $bits = str_pad(decbin(strpos($base64s, $encStr[$i])),6,"0",STR_PAD_LEFT).str_pad(decbin(strpos($base64s, $encStr[$i+1])),6,"0",STR_PAD_LEFT).str_pad(decbin(strpos($base64s, $encStr[$i+2])),6,"0",STR_PAD_LEFT).str_pad(decbin(strpos($base64s, $encStr[$i+3])),6,"0",STR_PAD_LEFT);
      $decOut .= chr(bindec(substr($bits,0,8))).chr(bindec(substr($bits,8,8))).chr(bindec(substr($bits,16,8)));
    }
    if (ord($encStr[$i-2]) == 61) {
      return substr($decOut, 0, strlen($decOut)-2);
    }
    else
      if (ord($encStr[$i-1]) == 61) {
        return substr($decOut, 0, strlen($decOut)-1);
      }
      else {
        return $decOut;
      }
  }
}
?>

Re: base64_decode() has been disabled for security reasons

Publicado: 01 Ago 2011, 16:58
por leviatan21
pduthey escribió:Ya lo terminé solucionando poniendo la función en un archivo aparte (./includes/functions_mias.php) y haciendo el include en todos los archivos de la lista
Y si en lugar de hacer el include en cada archivo lo haces en el raíz/common.php será aún menos invasivo ;)

Re: base64_decode() has been disabled for security reasons

Publicado: 02 Ago 2011, 12:00
por pduthey
leviatan21 escribió:
pduthey escribió:Ya lo terminé solucionando poniendo la función en un archivo aparte (./includes/functions_mias.php) y haciendo el include en todos los archivos de la lista
Y si en lugar de hacer el include en cada archivo lo haces en el raíz/common.php será aún menos invasivo ;)
Listo, ya lo cambié, Gracias :ok: