martes, 29 de enero de 2019

[Corregido] 500 Error: File is writeable by group

Casos en los que se presenta:
  • Cuando ingresas a tu script en PHP y aunque sólo tengas la linea de Hola mundo, aparece este mensaje.
  • Otros mensajes similares de diagnóstico es que siempre obtienes un error 500, cuando el código nunca ha tenido problemas.
  • Ingresas al cPanel y de repente tienes una cola de mensajes de error con el mensaje:
[Day Mon 31 16:34:12 2011] [error] [client 11.111.111.111] SoftException in Application.cpp:256: File "/home/username/public_html/index.php" is writeable by group
 
Causas?

Realmente pueden ser varias cosas:
  • Aumentaste la versión de PHP de manera general en tu servidor, o al menos en la carpeta donde tienes tu proyecto.
  • El servidor hizo una actualización e PHP por una nueva versión.
  • Hiciste cambios en los permisos de tus archivos y carpetas.
  • Algún script hizo cambios en los permisos de tus archivos y carpetas.

La solución es muy simple.

Ya sea con tu cliente de FTP o por el administrador de archivos, debes configurar las carpetas con los permisos chmod 755 y dentro de esa carpeta a todos tus archivos  con los permisos chmod 644.

Listo! Ingresa de nuevo a tu script.

jueves, 26 de octubre de 2017

Anti-DDoS PHP Script (Prevenir ataques DDoS en PHP)

Las soluciones contra un ataque DDoS son más bien del lado de la configuración del servidor y el firewall que tenemos allí instalado.

No obstante, es posible a nivel de código tener un pequeño control, que si no evita el ataque completamente, al menos lo puede mitigar en una gran medida. Manos a la obra...

miércoles, 20 de septiembre de 2017

Cómo redimensionar imagenes en PHP

Hay varias alternativas ya disponibles en el medio.  Antes de poner en funcionamiento el que yo propongo, pueden probar algunos de los que ya existen en el medio.

Código de la función para hacer la redimensión:

  public function redimensionar_imagen($nombreimg, $rutaimg, $xmax, $ymax){  
        $ext = explode(".", $nombreimg);  
        $ext = $ext[count($ext)-1]; 

    if($ext == "jpg" || $ext == "jpeg")  
        $imagen = imagecreatefromjpeg($rutaimg);  
    elseif($ext == "png")  
        $imagen = imagecreatefrompng($rutaimg);  
    elseif($ext == "gif")  
        $imagen = imagecreatefromgif($rutaimg);  

    $x = imagesx($imagen);  
    $y = imagesy($imagen);  

    if($x <= $xmax && $y <= $ymax){
        //return "<center>Esta imagen ya esta optimizada para los maximos que deseas.<center>";
        return $imagen;  
    }

    if($x >= $y) {  
        $nuevax = $xmax;  
        $nuevay = $nuevax * $y / $x;  
    }  
    else {  
        $nuevay = $ymax;  
        $nuevax = $x / $y * $nuevay;  
    }  

    $img2 = imagecreatetruecolor($nuevax, $nuevay);  
    imagecopyresized($img2, $imagen, 0, 0, 0, 0, floor($nuevax), floor($nuevay), $x, $y);  
    //return "<center>La imagen se ha optimizado correctamente.</center>";
    return $img2;   
}

Y para llamar la función:

$nombre='imagen1';
$Path='img/section/immagen.jpg';
$alto=450;
$ancho=450;
$imagen_optimizada = $f->redimensionar_imagen($nombre, $Path, $alto, $ancho);

Sólo es llamar la función y pasarle los parámetros de Nombre, ruta física del archivo en el servidor, alto y ancho deseados al final.

martes, 14 de junio de 2016

¿Cómo listar todas las variables de Session en ASP.NET?

Cuando queremos listar todos las variables y sus valores en una Sesión en ASP.NET, podemos hacer uso del siguiente ejercicio:

En VB.NET

For i As Integer = 0 To Session.Count - 1
   Response.Write(Session.Keys(i).ToString() & ": " & Session(i).ToString() & "<br>")
Next

En C#.NET

for (int i = 0; i <= Session.Count - 1; i++) {
    Response.Write(Session.Keys[i].ToString() + ": " + Session[i].ToString() + "<br>");
}

domingo, 10 de abril de 2016

[Corregido] Error al crear Ordenes de compra, Facturas, Presupuestos y Ordenes de venta luego de migración en VTiger

Luego de una migración en vTiger, uno espera no tener ningun problema. Aún así, nos piden que hagamos backup para estar preparados para nuestros inmerecidos y muy probables problemas de migración.

Listo. Backup de código y base de datos creados. Y comenzamos la migración de vTiger.

Una vez terminados, nos hemos topado con algunos mensajes de advertencia de pequeñas ejecuciones en la base de datos que no se pudieron completar satisfactoriamente, y aunque reintentamos la migración siguen saliendo. Optamos por no prestarle atención y correr a ejecutar nuestra nueva versión de vTiger.

Aunque ya activamos el "log" y "trace" para validar el error, nos encontramos con que es imposible crear una nueva Orden de Compra, Factura, Presupuesto u Orden de compra, y siempre nos aparece el mensaje de:

{"success":false,"error":{"code":"result is not an object","message":"result is not an object"}}

...o en español:

{"success":false,"error":{"code":"El registro al que pretende acceder no existe","message":"El registro al que pretende acceder no existe"}}

No hay nada que temer... pueden consultar durante 2 días, tal como yo lo hice en todos los foros, y seguir cada paso y no encontrar ninguna solución en el universo indexado de Internet... o simplemente vayan directamente en la base de datos y hagan los siguientes dos cambios:

1) En la estructura de la tabla "vtiger_users"

En la estructura de la tabla, asegurarse que existe el campo "is_owner", y debe ser "varchar(5).

2) En los registros la tabla "vtiger_field"

Revisar los registros de los 4 módulos que nos están generando problemas, con las siguientes consultas:

Para Facturas:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_invoice' ORDER BY columnname

Para Ordenes de venta
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_salesorder' ORDER BY columnname

Para Presupuestos:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_quotes' ORDER BY columnname

Para Ordens de compra:
SELECT * FROM vtiger_field WHERE tablename = 'vtiger_purchaseorder' ORDER BY columnname

La solución es, simplemente, eliminar el registro duplicado que aparece en cada consulta, y dejar uno de ellos (por ejemplo, he dejado el primero):


Y listo. vTiger vuelve a ser tan eficiente como antes.

Requiere ayuda en su nuevo CRM?  Podemos ayudarle en Solutecia sas.

jueves, 7 de abril de 2016

[Corregido] Call to a member function getPicklistValues() on a non-object in /crm/modules/Users/models/Record.php on line 494

Acabo de encontrarme con este mensaje de error luego de una migración de VTiger de 5.4 a 6.1.

En el foro de VTiger no han dado con una solución satisfactoria, y por algún motivo no tengo privilegios para postear la solución en dicho foro.

Bueno, aquí con la solución.

El problema lo podemos resolver directamente en el archivo ubicado en la ruta:
modules/Users/models/Record.php

Inicialmente, aparece esta código al rededor de la línea 494:

//-----------------------------------------------------------------------------
$hour_format = $fieldModel['hour_format']->getPicklistValues();
$start_hour = $fieldModel['start_hour']->getPicklistValues();

        $defaultValues = array('00:00'=>'12:00 AM','01:00'=>'01:00 AM','02:00'=>'02:00 AM','03:00'=>'03:00 AM','04:00'=>'04:00 AM','05:00'=>'05:00 AM',
                    '06:00'=>'06:00 AM','07:00'=>'07:00 AM','08:00'=>'08:00 AM','09:00'=>'09:00 AM','10:00'=>'10:00 AM','11:00'=>'11:00 AM','12:00'=>'12:00 PM',
                    '13:00'=>'01:00 PM','14:00'=>'02:00 PM','15:00'=>'03:00 PM','16:00'=>'04:00 PM','17:00'=>'05:00 PM','18:00'=>'06:00 PM','19:00'=>'07:00 PM',
                    '20:00'=>'08:00 PM','21:00'=>'09:00 PM','22:00'=>'10:00 PM','23:00'=>'11:00 PM');
//-----------------------------------------------------------------------------

Por algún motivo luego de la migración, no toma el listado por defecto de los Picklist para el listado de los horarios, pero si incluye los valores por defecto una línea más abajo.

Parece algo poco lógico, que hayan colocado los valores por defecto luego, yo simplemente le di el orden que me pareció más acertado.  Por lo tanto lo dejé de la siguiente manera:

//-----------------------------------------------------------------------------
        $defaultValues = array('00:00'=>'12:00 AM','01:00'=>'01:00 AM','02:00'=>'02:00 AM','03:00'=>'03:00 AM','04:00'=>'04:00 AM','05:00'=>'05:00 AM',
                    '06:00'=>'06:00 AM','07:00'=>'07:00 AM','08:00'=>'08:00 AM','09:00'=>'09:00 AM','10:00'=>'10:00 AM','11:00'=>'11:00 AM','12:00'=>'12:00 PM',
                    '13:00'=>'01:00 PM','14:00'=>'02:00 PM','15:00'=>'03:00 PM','16:00'=>'04:00 PM','17:00'=>'05:00 PM','18:00'=>'06:00 PM','19:00'=>'07:00 PM',
                    '20:00'=>'08:00 PM','21:00'=>'09:00 PM','22:00'=>'10:00 PM','23:00'=>'11:00 PM');

$hour_format = $defaultValues;
$start_hour = $defaultValues;
//-----------------------------------------------------------------------------

Y tema solucionado.

7 razones para no usar Laravel en tu proyecto de PHP

En más de 40 años de experiencia como programador y director de proyectos de programación, he aprendido que cada requerimiento tiene mejores...