Archive for category: PHP

Templates PHP parte 1

Categories: PHP - Tags:

Antes que me lluevan las críticas por lo que voy a escribir en este post, quiero primero aclarar que estoy de acuerdo en el uso de MVC (modelo-vista-controlador) en lo que no creo es que Smarty sea la solución, ya iré desarollando la idea de a pocos.

¿Qué es una plantilla/template PHP?

Las plantillas son páginas web que muestra código PHP y que “supuestamente” pueden ser editadas por cualquier persona sin tener conocimientos de programación, por lo que serían adecuadas para diseñadores y maquetadores de páginas web. Usualmente tienen extensión .TPL

Quiero indicar que en Internet encontramos muchos sistemas que dicen ser plantillas pero que en realidad no pasan de ser simples reemplazadores de variables y aunque esto no sea exactamente una plantilla la verdad es que en sistemas simples cumplen de sobra con su cometido, por ejemplo pueden ver ESTE

¿Qué es Smarty?

Si te han dado curiosidad los sistemas de plantillas en PHP es seguro que te debes haber cruzado con explicaciones sobre Smarty que es el sistema de plantillas oficial para PHP, y además estoy seguro que habrás leído comentarios sobre lo muy rápido, eficiente y simple de implementar que es, la verdad es que para cosas simples puede parecer que si, pero ya luego te darás cuenta que no es la maravilla que te cuentan.

¿Por qué no es buena idea usar Smarty?

Los argumentos a favor los encuentras rondando por google asi que yo me dedicaré a analizar que tan ciertos son:

Separa la lógica de la presentación

Eso no es del todo cierto, ya que Smarty es todo un lenguaje de programación, veamos algunas de las supuestas ayudas que da Smarty para los diseñadores y vamos con los ejemplos para visualizar esto:
Con Smarty:

1
2
3
4
5
<table>
   <tr>
      <td>{$mivariable}</td>
   </tr>
</table>

Ahora veamos lo tremendamente dificil que es hacerlo sin Smarty

1
2
3
4
5
<table>
   <tr>
      <td><?=$mivariable?></td>
   </tr>
</table>

Seguro que algunos escépticos me dirán que en algo tan simple es lo mismo pero que en programación da muchas facilidades para los diseñadores, veamos si eso es cierto
Condiciones usando Smarty:

1
2
3
4
5
6
7
{if $name eq "Fred"}
    Welcome Sir.
{elseif $name eq "Wilma"}
    Welcome Ma'am.
{else}
    Welcome, whatever you are.
{/if}

Veamos lo complicadísimo que es hacer lo mismo usando PHP

1
2
3
4
5
6
7
<?php if ($name == "Fred"):?>
    Welcome Sir.
<?php elseif($name == "Wilma"): ?>
    Welcome Ma'am.
<?php else: ?>
    Welcome, whatever you are.
<?php endif; ?>

¿Alguién notó lo mucho que se simplificó para el diseñador? Al menos yo no, además de cambiar mis invocaciones PHP por llaves y encima complicarme con algo llamado eq cuando yo ya tenía mi archiconocido ==

Smarty es más veloz

Tal vez sea más veloz que otro sistema de plantillas sin compilar ni optimizar pero nunca más veloz que usar puro PHP como hice en los ejemplos anteriores, sumado a esto es mucho más pesado, o creen que esas miles de líneas de código que forman Smarty no van a consumir procesos en tu servidor.

Smarty incorpora una sistema de patrones de sintáxis

Eso en castellano significa que dentro de la plantilla podamos incluir manejo y manipulación de variables; es decir dentro de una plantilla de Smarty puede hacerse programación. Me parece o al inicio dijimos que el objetivo de usar plantillas es para no mezclar la programación con el diseño, si eso es cierto como se nos va a ocurrir meter programación ahi, eso desnaturaliza su uso y encima vamos a decir que eso es una ventaja….

Por esas razones considero que Smarty es mala idea ya que nos obliga a aprender un lenguaje de programación intemedio entre diseño y programación que quitará rendimiento a nuestra aplicación y al final no logra separar el diseño de la lógica.

En el próximo post indicaré cual es la solución para mi.

Seguridad, ataques y spam en la web

Categories: PHP - Tags: , ,

Desde que empecé a postear en mi blog he sufrido múltiples ataques afortundamente he podido repelerlos todos gracias a una serie de plugins para WordPress sin embargo estas mismas funciones es posible incluirlas en nuestros scripts, veamos algunas formas:

No permitir HTML

Nada más molesto que ser bombardeado por cientos de mensajes llenos de código basura, con links para comprar viagra (creo que no lo necesito), ofertas de mil cosas he incluso mensajes en árabe que llenan de links y código malicioso en los peores casos añaden javascript que invocan banners de propaganda o intentan descargarla algún troyano a nuestros visitantes lo mejor para prevenirlos es no permitir el uso de código HTML para eso podemos usar una muy útil función de PHP que es strip_tags y se usa de la siguiente forma:

1
2
3
4
5
//// Para eliminar todo rastro de html seria
$text = '<p>mi codigo html</p><a href="#fragment">Other text</a>';
echo strip_tags($text);
//// Para permitir el uso solo de <p> y <b>
echo strip_tags($text, '<p><b>');

Existen formas más elaborados usando PHP purifier por ejemplo pero por lo general no requerimos un script tan pesado y con strip_tags basta.

Usar un código de seguridad

Más conocido como captcha podemos colocar nuestra letras como si fueran un gráfico un poco distorcionado y así prevenir que robots posteen, hay algunos detalles que debemos tomar en cuenta primero que el código se debe verificar al momento de enviar el formulario y al recibir los datos ya que los robots suelen no usar el formulario y saltarse toda validación javascript, hay muchas opciones de captcha basta buscar en google pero siempre tomando en cuenta que el código sea lo suficientemente comprensible para un humano.

Bloquear IP

Esta es una de las formas más radicales de prevenir spam ya que los robots suelen venir de algunos ip que no varían al bloquearlos se disminuye el spam pero cuidado porque podriamos estar bloqueando a todo un grupo de usuarios que estén bajo un mismo IP público.
Para esto en PHP verificamos el IP de nuestro visitante

1
2
3
4
5
6
7
8
<?php $ip = $_SERVER['REMOTE_ADDR'];
//// Hacemos un array de ips baneadas
$ips_baneadas = array('10.0.0.1',’192.0.0.1’);  
$contador = count($ips_baneadas);  
//// Verificamos si el visitante esta baneado
for ($i=0; $i<$contador; $i++) {  
if($ip == $ips_baneadas[$i]) { die("Lo sentimos, estas baneado . $ip"); } } ?>  
?>

Y bueno esas son las formas más usuales de prevenir spam aunque les aseguro que no son 100% seguras digamos que son un 99% seguras combinadas asi que siempre quedará algo que debamos borrar manualmente por lo que no esta demás poner alguna opción que diga “denunciar” para eliminar algún comentario malicioso.

Diferencias entre envio GET y POST

Categories: PHP - Tags: ,

Este es un tema bastante básico pero ya que han habido varias consultas al respecto me pareció interesante comentarlo y sobre todo explicar como aplicarlo, por cierto los conceptos usados aquí son iguales cuando se usa una web modular.

Método GET

Este método envia las variables dentro de la propia URL (dirección) de la página, concatenadas(unidas) por ampertands(&) quedando algo así:

1
http://www.mipagina.com/index.php?page=mia&variable2=valor2&variable3=valor3......

Hasta ahí muy interesante, seguro ya lo leiste mil veces pero ¿para qué sirve eso? pues lo bueno es que podemos enviarle variables a PHP desde links simples sin necesidad de usar formularios o podríamos guardar estas cadenas en un mapa del sitio y google indexaría nuestras busquedas, muy util tambien para crear esos botones de editar donde queremos que se envie el ID del objeto para editar, si fuera mySQL sería algo así.

1
echo '<a href="editar.php?id='.$row[miId].'">Editar</a>';

Método POST

Este método sólo se puede usar con formularios, y la información no se envía por la URL sino que es invisible al usuario (eso en teoría porque usando firebug podríamos ver que se envía en realidad).
¿Para qué sirve POST?
pues para enviar grandes campos de texto, subir imágenes, para no distorcionar nuestra URL amigable con un colección de variables.

¿Cómo las envío?
Pues así:

1
2
3
<form name="miformulario" action="mipagina.php" method="POST">
 <input type="text" size="20" name="mivariable1">
</form>

¿Cómo recibo las variables?

Pues depende si usamos GET o POST, quedaría algo así

1
2
echo $_GET['mivariable']:
echo $_POST['mivariable']:

Variables en una web modular

Es exactamente igual que si no fuera modular, tengamos presente que los valores GET y POST se comparten entre todos los archivos que fueron incluidos en la web modular ya que estos se unen como un todo, de tal forma que si envio esto:

1
2
3
<form name="miformulario" action="index.php?page=mipagina" method="POST">
 <input type="text" size="20" name="mivariable1">
</form>

Puedo invocar a la variable POST en cualquiera de los archivos que la componen, header, footer y por supuesto contenido

Ofuscador de código para PHP

Categories: PHP - Tags: ,

Una vez que acabamos de programar nos gustaría que nuestro código no se ande replicando y siendo usado por otros, robando nuestro trabajo sin embargo como PHP no se compila, nuestro código fuente queda desprotegido.

He probado algunos ofuscadores de código que hacen el código muy ilegible y dificil de entender, ojo eso no es igual que codificar simplemente lo hacen poco comprensible. Este muy sencillo ofuscador online me parece genial para evitar que pirateen las clases que conforman nuestro script, pueden dare un vistazo aqui

Requiere el uso de la librería gzip, la cual la tienen prácticamente todos los servidores en Internet así que por ahí no hay problemas, veamos un ejemplo:
Código Original

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class MySQL{
private $conexion;
private $total_consultas;
public function open(){
if(!isset($this->conexion)){
    $this->conexion = (mysql_connect(_host,_user,_password)) or die(mysql_error());
    mysql_select_db(_database,$this->conexion) or die(mysql_error());
}
}
public function consulta($consulta){
    $this->total_consultas++;
    $resultado = mysql_query($consulta,$this->conexion);
    if(!$resultado){
        echo 'MySQL Error: ' . mysql_error().'<br>'.$consulta;
        exit;
    }
    return $resultado;
}
public function fetch_array($consulta){
    return mysql_fetch_array($consulta);
}
?>

Codigo Ofuscado

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
// Este archivo es protegido por la ley del derechos de propiedad literaria. La ingenieria inversa de este codigo se prohibe estrictamente.
eval(gzinflate(base64_decode('
dZJNTsMwEIXXqdQ7DFKkOGroAWhJV+xggTiA5TgT
xVKI0/EEGiHujp20tIRW8sKen2/es73LF9tdV3fL
hW6Uc/AyvL0+fy0XHZkPxQixti0ejG03FzG2rBrp
M65vWLmQ6ovGaKj6VrMvBtthK1LPMZW4M84hi5hr
4+7zEy8N2WgWhEcQ74Pbj/AWNQtZW8eZ7B1SJjuv
8NNSmaZgCUqDx2IksiTS1AuJpojDxnfLshCyVKwK
5TCbC7jJ+B7X3NLJrohPu0sHsytZrYKWmHA8ltYb
m8bse6ThjPgnKrSFOzu3jlMi1LWFZHwdeApSHyCB
NfzRvk62BeXJ+pe+GTsPhsPGW4oIuacWzvDNVasV
sq6lIlLDzO0RMI29XjYhd+Ff/QA=
'
)));
?>

Creo que queda lo suficientemente incomprensible o no? :)

Deprecated Functions Zencart con Wamp 2

Categories: PHP, zencart - Tags:

Hace poco formatee mi disco duro y aproveché para instalar versiones últimas de todo incluyendo Wamp pero me di con la sorpresa que varias páginas que antes funcionaban ahora daban varios mensajes de error como este en Zencart

Deprecated: Function set_magic_quotes_runtime() is deprecated in C:\wamp\www\zencart138a\includes\application_top.php on line 18

Lo que pasa es que Wamp 2 viene con PHP 5.3 y en esta nueva versión varias funciones de PHP ya no existen, afortunadamente hay un parche que arregla Zencart sin muchas complicaciones, lo puedes bajar AQUI, luego lo descomprimes y sobreescribes los archivos en tu Zencart.

Ojo este parche sólo debe ser utilizado si tu servidor usa PHP 5.3 de lo contrario ocasionará problemas.