Correr una aplicación sin privilegios

¡Hola gente!

Yo generalmente corro todo el software en mi linux como root. No es porque sea re heavy re jodido, sino porque prefiero perder toda la información en mi computadora antes que escribir mi contraseña 300 veces por día. Además, lo único “de valor” que hay en mi computadora es mi información personal y correr como un usuario sin privilegios no protege eso.

De todas maneras hay aplicaciones que no son seguras para correr como root. Si alguien hackea una computadora, es muy probable que lo haga a través de algo como un servidor apache, una aplicación que esta siendo ejecutada por este, o por un browser.

Creé un script que ejecuta el comando que le damos como un usuario de menor rango – una especie de opuesto de sudo -, de manera que podemos ejecutar nuestro browser como otro usuario haciendo algo tan simple como

# lower chromium-browser

El código fuente y la documentación la pueden encontrar en el foro de puppy linux.

Un abrazo grande,
Pedro

Obtener URL con PHP

¡Hola gente!

Hace muy poco, me encontré con una situación en la que tenía que obtener la URL desde la que se estaba ejecutando el script. El siguiente código obtiene, tal como el original, además de la url, los parámetros GET. La diferencia con éste es que nos permite eliminar uno o varios parámetros GET.

function getCurrentUrl($exceptions) {
	/*
	 * @param array $exceptions an array containing the string keys of get to be skipped
	 */
		$pageURL = 'http';
		if ($_SERVER ["HTTPS"] == "on") {
			$pageURL .= "s";
		}
		$pageURL .= "://";
		if ($_SERVER ["SERVER_PORT"] != "80") {
			$pageURL .= $_SERVER ["SERVER_NAME"] . ":" . $_SERVER ["SERVER_PORT"] . $_SERVER ["REQUEST_URI"];
		} else {
			$pageURL .= $_SERVER ["SERVER_NAME"] . $_SERVER ["REQUEST_URI"];
		}
		
		foreach($exceptions as $e) {
			$e = preg_quote($e);
			$pageURL = preg_replace('/(?<=(&|\?))'.$e.'=.*?(&|$)/', "", $pageURL);
		}
		
		return $pageURL;
	}

¡Espero que les sea de utilidad!

Un saludo,
Pedro

Capturar la parte final de una URL

¡Hola gente!

Quería compartir esta expresión regular, que me sirvió para obtener la parte final de una url, independientemente de si es https://droope.wordpress.com o google.com o lo que sea, siempre obtiene solo el sector final ( “droope.wordpress.com”, “google.com”).

$regex = '/(?:http:\/\/)?(?:www\.)?([\w\d]+\.[\w]+(\.[\w]+)?)/';

También creé una función que lo hace toda la matemática por nosotros:

function valid_url_get($url) {
	
	if(preg_match('/(?:http:\/\/)?(?:www\.)?([\w\d\-]+\.[\w]+(\.[\w]+)?)/i', $url, $matches)) {
		return $matches[1];
	} else {
		return false;
	}
	
}

Retorna false si no es válida. En caso contrario, retorna el sector final de la url ;)

Un saludo,
Pedro

Devolver el número de fila en una consulta SQL

¡Hola amigos!

Para aquellos que estén buscando lo que promete el título, la consulta es

select @rownum:=@rownum+1 as row, gid FROM games LIMIT 3000

Para los demás, dejo una consulta muy sencilla, que sirve para obtener el lugar que ocuparía una fila en determinada consulta ( es útil para redirigir a un usuario, luego de un evento exitoso, al lugar en el que estaba, en lugar de la página uno. Obteniendo el resultado que nos da esta consulta, y dividiendolo por el número de elementos que mostramos por página, obtendremos el número de página )

SET @rownum = 0;
SELECT row FROM (select @rownum:=@rownum+1 as row, gid FROM games LIMIT 3000) result WHERE result.gid = 3675

:)

Un saludo,
Pedro

Slugify: Creación de slugs

¡Hola amigos!

Hasta hoy, al momento de crear strings, me encontraba utilizando str_replaces y un montón de cosas mas, cosas que siempre me llevaban a urls amigables un tanto feas.

Hoy busqué y encontré una función que permite crear slugs fácilmente, y que además convierte letras del tipo ‘á’ a ‘a’.

Sin mas, el código:

function slugify($text, $encoding = "utf-8") {

   $text = preg_replace ( '~[^\\pL\d]+~u', '-', $text );

   $text = trim ( $text, '-' );

   if (function_exists ( 'iconv' )) {
       $text = iconv ( $encoding, 'us-ascii//TRANSLIT', $text );
   }

   $text = strtolower ( $text );

   // remove unwanted characters
   $text = preg_replace ( '~[^-\w]+~', '', $text );

   if(empty($text)) {
       return false;
   }

   return $text;

}

¡Espero que les sea de utilidad!

Un saludo,
Pedro

Función para generar RSS

¡Hola gente!

Los RSS son de gran utilidad para compartir información sobre nuestro sitio. El otro día me encontré en una situación en la que necesité generar uno dinámicamente. Busqué en google por el tema, pero no encontré nada… asique decidí compartir esto con ustedes.

/*
 * generates a rss feed. If an item has a key, it will be considered a tag like <$key>$value</$key>. 
 * Otherwise, $value will be placed straight in the rss
 * @author droope <pedro@worcel.com>
 * @param string $encoding the rss' encoding
 * @param array $channelProperties an array such as array('title' => 'Our cool RSS', 'link' => $site_url) 
 * @param array $items an array of arrays containing items and their properties. array(array('title' => 'Why we rule', '<enclosure url="logo.gif" type="image">'), array('title' => 'Lorem ipsum is simply dummy!'));
 * @param bool $output if set to true, headers will be set and rss will be ouptutted to the screen. Otherwise, output will be returned
*/
function rss_generate($encoding, $channelProperties, $items, $output = true) {
	
	$rss_url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
	
	if($output) {
		header("Content-type: text/xml; charset=utf-8");
	}
	$output = '<?xml version="1.0" encoding="'.$encoding.'" ?>
	<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	
	<channel>
	<atom:link href="'.$rss_url.'" rel="self" type="application/rss+xml" />
	';
	foreach($channelProperties as $property => $value) {
		if(!empty($property)) {
			preg_match("/^([\w:]+)(?:\s)?/", $property, $match);
			$closeTag = $match[1];
			$output .= "<$property>$value</$closeTag>";
		} else {
			$output .= $value;
		}
	}
	foreach($items as $item) {
		$output .= "<item>";
		foreach($item as $property => $value) {
			if(!empty($property)) {
				preg_match("/^([\w:]+)(?:\s)?/", $property, $match);
				$closeTag = $match[1];
				$output .= "<$property>$value</$closeTag>
				";
			} else {
				$output .= $value . "
				";
			}
		}
		$output .= "</item>";
	}
	$output .= "</channel></rss>";
	
	if($output) {
		echo $output;
	} else {
		return $output;
	}
	
}

Los RSS generados validan y cumplen todas las recomendaciones de el validador oficial de RSS. Este código ha sido testeado en +-70 sitios y funciona bien. En caso de que encuentre alguna anomalía, recordaré actualizar el código posteado aqui.

¡Espero que sea de utilidad! Feliz generación de RSS con php :D

Un saludo,
Pedro

Regex para convertir urls a links

¡Hola!

En el curso de mis viajes, me encontré en una situación en la que tenía que reemplazar URLs obtenidas desde un feed por links a esas URLs. Pensé en crear mi propio código regex, pero al final opté por utilizar google. Hoy me alegro de haberlo hecho, porque me encontré una expresión regular excelente que cubre las urls que veran si clickean este enlace.

Me parece que está muy completo, y hasta ahora no me ha fallado con ninguna url.

El código regex es:

<?php
$regexUrl = "/\b(([\w-]+:\/\/?|www[.]|(\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/";
// $2 = subdomain $3 resto de la url $1 cadena completa

Hice una función que simplifica bastante todo, simplemente hemos de pasarle como parámetro la variable en la que queremos que se transformen las URLs. La dejo a continuación, junto con un ejemplo de su uso. (es muy sencilla de utilizar.)

<?php

function urls_to_links($originalString) {
	return preg_replace("/\b(([\w-]+:\/\/?|(www[.]|\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/", '<a href="http://$3$4">$1</a>', $originalString);
}

$cadena = "esta es una www.match.com con regex.urls.com para transformar a links. Dije alguna vez regex transformar urls? regex.urls.com/transformar/a/links";
$transformada = urls_to_links($cadena);

// ¡la cadena tiene ahora transformados los enlaces!
echo $transformada;

Para aquellos a los que les interese, el test case de esta aplicación es el siguiente:

<?php // regex to transform links test case / regex para transformar urls a enlaces - links test case

$testCases = "http://google.com/mail
http://google.com/mail/
(Something like http://google.com/mail)
http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(disambiguation_pages)
(Something like http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style_(disambiguation_pages))
http://google.com/mail.
http://google.com/mail/.
<http://google.com/mail>
<http://google.com/mail/>
http://google.com/mail,
http://www.tokyoflash.com/blog/?p=1288.
http://website.ws/faq
http://userid:password@example.com:8080
http://userid@example.com
http://userid@example.com:8080
http://userid:password@example.com
<tag>http://google.com/mail</tag>
Just a www.google.com link.
this is a adsense.google.com
this is a adsense.google.com/
this is a http://adsense.google.com
this is a http://adsense.google.com/";

$testCases = explode("\n", $testCases);

$urlRegex = "/\b(([\w-]+:\/\/?|(www[.]|\w+\.))([^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/))))/";
foreach($testCases as $testCase) {
	$stringWithUrls = preg_replace($urlRegex, '<a href="http://$3$4">$1</a>', $testCase);
	echo $stringWithUrls . "<br />";
}

¡Eso sería todo!

Espero que les sea de utilidad, me costó bastante esfuerzo, y modifiqué bastante la expresión original. :)

Un saludo
Pedro

Fuente:
Liberal regex for matching URLs

mass_stripslashes

¡Hola!

Hice este snippet de código, que sirve básicamente para realizar un stripslashes de todos los elementos de un array, util especialmente en los casos en los que sacamos datos de una base de datos en la que la data no se escapó correctamente, o queremos trabajar con data que está escapada.

(cuando me refiero a escapada, lo hago como una traducción de la palabra escape, que es lo que se le hace a las cadenas de texto para evitar inyecciones SQL y errores con caracteres comunes como ‘ o “. Esos caracteres, escapados, serían transformados en \’ y \”, respectivamente)
Continue reading