Semana 3. Continúa lo básico de PHP [Sept. 3, 2011, 4:34 p.m.]
<h2>
1. Lecturas </h2>
<h3>
1.1 Clases y Objetos</h3>
<p>
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):
<pre class="prettyprint">
class Pareja {
var $x;
var $y;
function suma()
{
return $this->x+$this->y;
}
function resta()
{
return $this->x-$this->y;
}
};
</pre>
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:
<pre class="prettyprint">
$p=new Pareja();
$p->x=1;
$p->y=2;
echo "suma: ".$p->suma()."\n";
echo "resta: ".$p->resta()."\n";
?>
</pre>
Lea el capítulo 5 del manual de PHP titulado Clases y Objetos. http://co.php.net/manual/es/language.oop5.php
<h3> 1.2 Formularios</h3>
<p>
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.
</p>
<p>La siguiente página HTML presenta un formulario con campos para nuestro ejemplo de contactos:
<pre class="prettyprint">
<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>
</pre>
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.
</p>
<p>El formulario del ejemplo anterior envía resultados a la página nuevo.php la cual puede ser como se presenta a continuación:
<pre class="prettyprint">
<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: <br>";
$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>
</pre>
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.
</p>
<p>
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
</p>
<h3> 1.3 Seguridad</h3>
<p>
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/index.php?id=Seguridad+de+aplicaciones+web+en+PHP
</p>
<h2>
2. Ejercicios</h2>
<p>
Para programar es indispensable practicar mucho.</p>
<ol>
<li>
Pruebe el ejemplo con clasese presentado. Modifique la clase presentada con nuevas funciones y explique.</li>
<li>
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.</li>
<li> Embellezca el formulario usando CSS</li>
<li>
Opcional: Ayude a traducir definiciones y la lectura sobre ataques a PHP --cediendo al dominio público su contribución.
<li>
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?</li>
<li>
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.</li>
</ol>
<p>
Publique dudas y ayudas como comentario a esta tarea.</p>
<p>
</p>
<h2>
3. Bibliografía</h2>
<ol>
<li>
Vladimir Támara Patiño. Ayuda para Desarrollo de Programas. 2006. <a href="http://structio.sourceforge.net/guias/ayudadesprog/ayudadesprog.html">http://structio.sourceforge.net/guias/ayudadesprog/ayudadesprog.html</a>.</li>
<li>
PHP. Un tutorial sencillo. <a href="http://co.php.net/manual/es/tutorial.php">http://co.php.net/manual/es/tutorial.php</a></li>
<li>
PHP Manual <a href="http://co.php.net/manual/es/ref.pgsql.php">http://co.php.net/manual/es/</a></li>
</ol>
<p>
</p>
<h2>
4. Términos y Condiciones Especiales</h2>
<p>
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 <a href="https://www.pasosdejesus.org/dominio_publico_colombia.html">https://www.pasosdejesus.org/dominio_publico_colombia.html</a>.</p>