PHP Twitter

0 - , , - 26/08/2010 13:29:53

PHP Twitter es una clase PHP que permite trabajar con la API de Twitter. Requiere PHP 5.2 y el módulo lib_curl. Está desarrollada para trabajar con datos en JSON pero también puede trabajar con formatos XML, RSS o Atom.

Su uso es muy sencillo. Por ejemplo, el siguiente código mostraría nuestro timeline público.

$t = new twitter();
$t->username='myuser'; 
$t->password='mypass';
$t->type='xml';
echo'<pre>';
print_r( $t->publicTimeline() );
echo'</pre>';

PHP Twitter » »

Clase PHP para filtrar los parámetros recibidos por GET

0 - , , , - 30/07/2010 13:27:41

A raiz de la publicación del post The Perishable Press 4G Blacklist me surgió la idea de publicar una de las clases en PHP que utilizo para controlar la seguridad de los sitios web desarrollados en este lenguaje. Toda prevención es poca y hay veces que no tenemos acceso al fichero .htaccess, no conocemos lo suficiente su funcionamiento, el servidor no es Apache, etc. En ese caso utilizar una clase como la siguiente nos puede ser útil para evitar ataques CSRF o XSS mediante parámetros GET.

class dXSS{
	var $url;
	var $longitud;

function TestGet(){
	$ok = true;
	$baneados =array(chr(34),
	"'",
	"--",
	";"
	"<",
	"[",
	"&lt;",
	">",
	"&gt",
	"&quot",
	"&#x27",
	"%",
	"&#x2F",
	"/*",
	"*/",
	"request",
	"select",
	"declare",
	"insert",
	"update",
	"delete",
	"drop",
	"exec(",
	"execute(",
	"cast(",
	"char",
	"nchar",
	"varchar",
	"nvarchar", 
	"substring",
	"sysobject",
	"iframe",
	"syscolumns"
	);
	
	$recuento=0;
	foreach( $_GET as $key => $value ) {
		for($i=0;$i<sizeof($baneados);$i++) {
			$Cadena = strtoupper($value);
			$Encontrar   = strtoupper($baneados[$i]);
			$pos = strpos($Cadena, $Encontrar);
			if($pos !== false) {
			    $recuento++;
			}
			if(strlen($Cadena)>$this->longitud){
			    $recuento++;
			}
			if(eregi('[^a-z0-9_]',$Cadena)){
			    $recuento++;
			}	
		}
	}
		if($recuento>0){
			 header('Location:'.$this->url);
		}
	}
}

La clase testea cada uno de los parámetros recibidos y:
1.- Se asegura que no esté en la lista de palabras baneadas
2.- Se asegura de que no tenga una longitud superior a la especificada
3.- Comprueba que sólo contenga caracteres alfanuméricos
Si se detecta un parámetro no válido se redirige a la $url especificada.

Un ejemplo de funcionamiento sería:

$g = new dXSS();
$g->url = 'http://www.google.es';
$g->longitud = 10;
$g->TestGet();

Este código debe ir antes de que se haya producido cualquier salida desde el navegador. Al principio de la página por ejemplo.

De este modo se aceptarían parámetros como:

http://www.dominio.com/index.php?Id=45&acc=new&op=32

Pero no aceptaría cosas como:

http://www.dominio.com/index.php?p=<script>alert("XSS");</script>

Es bastante interesante definir una longitud pequeña, siempre que sea posible:

$g = new dXSS();
$g->url = 'http://www.google.es';
$g->longitud = 3;
$g->TestGet();

Permitiría:

http://www.dominio.com/index.php?Id=45&sub=3&acc=new&op=32

Pero no:

http://www.dominio.com/index.php?Id=<meta%20http-equiv="refresh"%20content="0;">

o incluso:

http://www.dominio.com/index.php?Id=$%

NOTA: Esta clase únicamente controla los parámetros recibidos por $_GET. Fácilmente se podría adaptar o modificar la clase para la información recibida por $_POST o que incluso se ocupase de ambas cosas pero quería mostrar un uso muy sencillo. Lo ideal es combinar esta clase con otras clases o funciones que comprueben el contenido recibido a través de los formularios, utilizar tokens en los formularios, establecer los permisos apropiados a las carpetas del sitio web, utilizar .htaccess, recurrir a filter_input si la versión de PHP instalada es reciente, etc. En estas cosas más vale que sobre que falte.

Clase PHP para generar documentos PDF a partir de HTML

0 - , - 20/09/2009 10:21:53

mPDF es una clase de PHP que genera archivos PDF a partir de HTML codificado en UTF-8. Se basa en FPDF, HTML2FPDF, y UFPDF, con una serie de mejoras. La gran mejora aportada respecto a las anteriormente mencionadas librerías, es que permite generar archivos PDF "al vuelo", a partir de HTML, con soporte a estilos CSS.

mPDF » »

Clase para acceder a Google Weather

0 - , , , , - 10/09/2009 08:12:16

Interesante clase para acceder de un modo sencillo al servicio metereológico de Google.

Ejemplo:

<?php
class GoogleWeatherAPI {
	private $city_code = '';
	private $city = '';
	private $domain = 'www.google.com';
	private $prefix_images = '';
	private $current_conditions = array();
	private $forecast_conditions = array();
	private $is_found = true;

	/**
	* Class constructor
	* @param $city_code is the label of the city
	* @param $lang the lang of the return weather labels
	* @return ...
	*/
	 
	function __construct ($city_code,$lang='fr') {
		$this->city_code = $city_code;
		$this->prefix_images = 'http://'.$this->domain;
		$this->url = 'http://'.$this->domain.'/ig/api?weather='.urlencode($this->city_code).'&hl='.$lang;
		
		$content = utf8_encode(file_get_contents($this->url));
		
		$xml = simplexml_load_string($content);
		
		if(!isset($xml->weather->problem_cause)) {
			
			$xml = simplexml_load_string($content);

			$this->city = (string)$xml->weather->forecast_information->city->attributes()->data;

			$this->current_conditions['condition'] = (string)$xml->weather->current_conditions->condition->attributes()->data;
			$this->current_conditions['temp_f'] = (string)$xml->weather->current_conditions->temp_f->attributes()->data;
			$this->current_conditions['temp_c'] = (string)$xml->weather->current_conditions->temp_c->attributes()->data;
			$this->current_conditions['humidity'] = (string)$xml->weather->current_conditions->humidity->attributes()->data;
			$this->current_conditions['icon'] = $this->prefix_images.(string)$xml->weather->current_conditions->icon->attributes()->data;
			$this->current_conditions['wind_condition'] = (string)$xml->weather->current_conditions->wind_condition->attributes()->data;
			
			foreach($xml->weather->forecast_conditions as $this->forecast_conditions_value) {
				$this->forecast_conditions_temp = array();
				$this->forecast_conditions_temp['day_of_week'] = (string)$this->forecast_conditions_value->day_of_week->attributes()->data;
				$this->forecast_conditions_temp['low'] = (string)$this->forecast_conditions_value->low->attributes()->data;
				$this->forecast_conditions_temp['high'] = (string)$this->forecast_conditions_value->high->attributes()->data;
				$this->forecast_conditions_temp['icon'] = $this->prefix_images.(string)$this->forecast_conditions_value->icon->attributes()->data;
				$this->forecast_conditions_temp['condition'] = (string)$this->forecast_conditions_value->condition->attributes()->data;
				$this->forecast_conditions []= $this->forecast_conditions_temp;
			}
		} else {
			$this->is_found = false;
		}
	}
	function getCity() {
		return $this->city;
	}
	function getCurrent() {
		return $this->current_conditions;
	}
	function getForecast() {
		return $this->forecast_conditions;
	}
	function isFound() {
		return $this->is_found;
	}
	
}
$gweather = new GoogleWeatherAPI('valencia','es'); 
if($gweather->isFound()) {
	echo '<pre>'; print_r($gweather->getCity()); echo '</pre>';
	echo '<pre>'; print_r($gweather->getCurrent()); echo '</pre>';
	echo '<pre>'; print_r($gweather->getForecast()); echo '</pre>';
}
?>

Ver ejemplo en funcionamiento » »

Google Weather API » »

Crear hojas de cálculo Excel con PHP

0 - , , , - 25/03/2009 07:08:14

Existen varias formas de exportar a Excel mediante PHP. En este post vamos a servirnos de la clase Excel Writer. La clase es muy sencilla de utilizar y nos puede permitir realizar el proceso de exportación de una tabla de nuestra base de datos sin grandes complicaciones. Primero veamos un ejemplo básico muy ilustrativo del funcionamiento de la clase.

<php
include("excelwriter.inc.php"); 
$excel=new ExcelWriter("FicheroExcel.xls");

if($excel==false) { 
   echo $excel->error;
}

// PRIMERA FORMA DE ESCRITURA DE FILAS
$myArr=array("CeldaA1","CeldaB1","CeldaC1","CeldaD1");
$excel->writeLine($myArr);

$myArr=array("CeldaA2","CeldaB2","CeldaC2","CeldaD2");
$excel->writeLine($myArr);

//SEGUNDA FORMA DE ESCRITURA DE FILAS
$excel->writeRow();
$excel->writeCol("CeldaA3");
$excel->writeCol("CeldaB3");
$excel->writeCol("CeldaC3");
$excel->writeCol("CeldaD3");

$excel->writeRow();
$excel->writeCol("CeldaA4");
$excel->writeCol("CeldaB4");
$excel->writeCol("CeldaC4");
$excel->writeCol("CeldaD4");

$excel->close();
echo "Los datos se han grabado con éxito.";
?>

Descargar ejemplo completo » »

Supongamos ahora que tenemos una tabla con una serie de comercios y deseamos poder exportarla, para uso propio o porque el cliente nos lo ha pedido, a una hoja de cálculo Excel. Un ejemplo de utilización de la clase Excel Writer para exportar datos de una tabla de una base de datos MySQL sería:

<?php
include("includes/excelwriter.inc.php");

$excel=new ExcelWriter("galeria_comercial.xls");

if($excel==false) {
echo $excel->error;
}

//Escribimos la primera fila con las cabeceras
$myArr=array("Nombre Comercial","Direccion","CP","Localidad","Telefono","Email");
$excel->writeLine($myArr);

//REALIZAMOS LA CONSULTA
$dbhost = "localhost";
$dbuser = "usuario";
$dbpassword = "password";
$dbname = "base_de_datos";

$db2 = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error());
mysql_select_db($dbname) or die("Error al conectar a la base de datos.");
$sql2 = "SELECT * FROM ComerciosGaleria";
$sql2 .= " ORDER BY NombreComercial ASC ";
$result2 = mysql_query( $sql2) or die("No se puede ejecutar la consulta: ".mysql_error());

//Escribimos todos los registros de la base de datos
//en el fichero EXCEL
while($Rs2 = mysql_fetch_array($result2)) {
$myArr=array(
$Rs2['Nombre_Comercial'],
$Rs2['Direccion'],
$Rs2['CodigoPostal'],
$Rs2['Localidad'],
$Rs2['Telefono'],
$Rs2['Email']
);
$excel->writeLine($myArr);
//Otra forma es
//$excel->writeLine($Rs2);
//De este modo volcariamos todos los registros seleccionados
//Sin necesidad de colocarlos/filtrar previamente en $myArr
}
$excel->close();

//Abrimos el fichero excel que acabamos de crear
header("location:galeria_comercial.xls");
?>