This course will become read-only in the near future. Tell us at community.p2pu.org if that is a problem.

Semana 3. Continúa lo básico de PHP [Sept. 3, 2011, 4:34 p.m.]


 

<h2>
1. Lecturas &nbsp;</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";
?&gt;
</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">
&lt;html>
&lt;head>
&lt;title>Nuevo dato para ingresar a la tabla de contactos&lt;/title>
&lt;/head>
&lt;body>
&lt;form action="nuevo.php" method="post">
 &lt;p>Nombres: &lt;input type="text" name="nombres" maxlength="100"/>&lt;/p>
 &lt;p>Apellidos: &lt;input type="text" name="apellidos" maxlength="100"/>&lt;/p>
 &lt;p>Sexo:
  &lt;select name="sexo" >
    &lt;option value='F'>Femenino&lt;/option>&lt;option value='M'>Masculino&lt;/option>
  &lt;/select>
&lt;/p>
 &lt;p>Dia de nacimiento: &lt;input type="text" name="dianac" size="2" maxlength="2"/>&lt;/p>
 &lt;p>Mes de nacimiento: &lt;input type="text" name="mesnac" size="2" maxlength="2"/>&lt;/p>
 &lt;p>Año de nacimiento: &lt;input type="text" name="anionac" size="4" maxlength="4"/>&lt;/p>
 &lt;p>Tipo de documento:
  &lt;select name="tipo_documento" >
    &lt;option value='TI'>Tarjeta de Identidad&lt;/option>
    &lt;option value='CC'>Cédula&lt;/option>
  &lt;/select>
&lt;/p>
 &lt;p>Número de documento: &lt;input type="text" name="numero_documento" maxlength="50"/>&lt;/p>
 &lt;p>&lt;input type="submit" />&lt;/p>
&lt;/form>
 
&lt;/body>
&lt;/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">
&lt;html>
&lt;head>
&lt;title>Inserción PostgreSQL&lt;/title>
&lt;/head>
&lt;body>
&lt;?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, &lt;a href='contactos.php'>examine el contenido de la tabla&lt;/a>.";
 
 
pg_close($con);
?&gt;
&lt;/body>
&lt;/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 &lt;script>alert('Hola XSS')&gt;/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>
&nbsp;</p>
<h2>
3. Bibliograf&iacute;a</h2>
<ol>
<li>
Vladimir T&aacute;mara Pati&ntilde;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>
&nbsp;</p>
<h2>
4. T&eacute;rminos y Condiciones Especiales</h2>
<p>
Este escrito se cede al dominio p&uacute;blico de acuerdo a la legislaci&oacute;n colombiana, agradeciendo se de cr&eacute;dito a Pasos de Jes&uacute;s. 2011.&nbsp; Ver&nbsp;<a href="https://www.pasosdejesus.org/dominio_publico_colombia.html">https://www.pasosdejesus.org/dominio_publico_colombia.html</a>.</p>