Semana 3. Continúa lo básico de PHP
1. Lecturas
1.1 Clases y Objetos
Una clase agrupa datos (o variables) y funciones que operan sobre esos datos. La siguiente clase agrupa dos variables ($x y $y) con 2 funciones que operan con estas (suma y resta):
class Pareja { var $x; var $y; function suma() { return $this->x+$this->y; } function resta() { return $this->x-$this->y; } };
Una clase se convierte como en un nuevo tipo de datos, así que ahora es posible declarar nuevos valores de ese tipo, a estos se les llama objetos, el siguiente ejemplo muestra como se crea (o instancia) un nuevo objeto ($p) de la clase Pareja y como se usa:
$p=new Pareja(); $p->x=1; $p->y=2; echo "suma: ".$p->suma()."\n"; echo "resta: ".$p->resta()."\n"; ?>
Lea el capítulo 5 del manual de PHP titulado Clases y Objetos. http://co.php.net/manual/es/language.oop5.php
1.2 Formularios
HTML provee facilidades para crear formularios, por su parte PHP hace sencillo recibir y operar con los datos que el usuario haya ingresado en el formulario.
La siguiente página HTML presenta un formulario con campos para nuestro ejemplo de contactos:
<html> <head> <title>Nuevo dato para ingresar a la tabla de contactos</title> </head> <body> <form action="nuevo.php" method="post"> <p>Nombres: <input type="text" name="nombres" maxlength="100"/></p> <p>Apellidos: <input type="text" name="apellidos" maxlength="100"/></p> <p>Sexo: <select name="sexo" > <option value='F'>Femenino</option><option value='M'>Masculino</option> </select> </p> <p>Dia de nacimiento: <input type="text" name="dianac" size="2" maxlength="2"/></p> <p>Mes de nacimiento: <input type="text" name="mesnac" size="2" maxlength="2"/></p> <p>Año de nacimiento: <input type="text" name="anionac" size="4" maxlength="4"/></p> <p>Tipo de documento: <select name="tipo_documento" > <option value='TI'>Tarjeta de Identidad</option> <option value='CC'>Cédula</option> </select> </p> <p>Número de documento: <input type="text" name="numero_documento" maxlength="50"/></p> <p><input type="submit" /></p> </form> </body> </html>
Empleamos los mismos nombres de campos de la tabla, pero pudiamos haber empleado otros. Note que limitamos la longitud de algunos campos con el atributo maxlength y que en los campos Sexo y Tipo de Documento empleamos cuadros de selección para limitar los valores que podría ingresar el usuario.
El formulario del ejemplo anterior envía resultados a la página nuevo.php la cual puede ser como se presenta a continuación:
<html> <head> <title>Inserción PostgreSQL</title> </head> <body> <?php if (!isset($_POST['nombres'])) { die("Falta nombre"); } if (!isset($_POST['apellidos'])) { die("Falta apellido"); } $con = pg_connect("host=localhost port=5432 dbname=contactos user=contactos password=miclave"); if (!$con) { die("No pudo abrise base de datos"); } echo "Datos: "; $res = pg_prepare($con, "ins", "INSERT INTO persona (nombres, apellidos, anionac, mesnac, dianac, sexo, tipo_documento, numero_documento) VALUES ($1, $2, $3, $4, $5, $6, $7, $8)"); if ($res === false) { die("No pudo preparar inserción " . pg_last_error($con) ); } $res = pg_execute($con, "ins", array( $_REQUEST['nombres'], $_REQUEST['apellidos'], $_REQUEST['anionac'], $_REQUEST['mesnac'], $_REQUEST['dianac'], $_REQUEST['sexo'], $_REQUEST['tipo_documento'], $_REQUEST['numero_documento'])); if ($res === false) { die("No pudo ejecutar inserción" . pg_last_error($con) ); } echo "Inserción exitosa, <a href='contactos.php'>examine el contenido de la tabla</a>."; pg_close($con); ?> </body> </html>
Note que los valores que el usuario haya ingresado en el formulario llegan en el vector $_POST. Aunque podríamos emplear pg_query para realizar la inserción, como ese método es más vulnerable a inyección SQL preferimos emplear pg_prepare y pg_execute.
Lea la referencia sobre PostgreSQL en el manual de PHP. http://www.php.net/manual/es/ref.pgsql.php Lea la sección "Variables Desde Fuentes Externas" en el manual de PHP. http://co.php.net/manual/es/language.variables.external.php
1.3 Seguridad
Como decía el ejercicio opcional de la semana anterior, el programa que se hizo era vulnerable a XSS. Lea sobre algunos tipos de ataques a programas en PHP y como prevenirlos en: http://dhobsd.pasosdejesus.org/Seguridad_de_aplicaciones_web_en_PHP.html
2. Ejercicios
Para programar es indispensable practicar mucho.
- Pruebe el ejemplo con clasese presentado. Modifique la clase presentada con nuevas funciones y explique.
- Pruebe el formulario y el programa para procesarlo para ingresar algunos datos en su base de datos y verifique que opera bien examinando la tabla persona desde psql.
- Embellezca el formulario usando CSS
- Opcional: Ayude a traducir definiciones y la lectura sobre ataques a PHP --cediendo al dominio público su contribución.
- Sin modificar el programa de la semana pasada al ingresar como nombre <script>alert('Hola XSS')>/script> se verá un inofensivo ataque XSS. ¿Cómo debe cambiar el programa contactos.php para solucionar los posibles ataques XSS?
- Opcional: Modifique el programa nuevo.php de esta semana remplazando pg_prepara y pg_exec con pg_query y sin tener cuidado de escapar los datos que ingresa. Muestre depués como hace un ataque de inyección SQL.
Publique dudas y ayudas como comentario a esta tarea.
3. Bibliografía
- Vladimir Támara Patiño. Ayuda para Desarrollo de Programas. 2006. http://structio.sourceforge.net/guias/ayudadesprog/ayudadesprog.html.
- PHP. Un tutorial sencillo. http://co.php.net/manual/es/tutorial.php
- PHP Manual http://co.php.net/manual/es/
4. Términos y Condiciones Especiales
Este escrito se cede al dominio público de acuerdo a la legislación colombiana, agradeciendo se de crédito a Pasos de Jesús. 2011. Ver https://www.pasosdejesus.org/dominio_publico_colombia.html.