Professional Documents
Culture Documents
Ejemplo de tienda
Temas a tratar
Autenticacin y control de sesin
Carrito de la compra
Medios de pago
Pgina de login
<form action="procesarLogin.php"method="POST">
<fieldset>
<legend>Usuarioycontraseña</legend>
<p><label>Cliente:</label><inputtype="text" name="usuario"maxlength="10"/></p>
<p><label>Contraseña:</label><inputtype="password"name="password"
maxlength="40"/></p>
<button type="submit">Entrar</button>
</fieldset>
</form>
//ConexinalaBDtienda
$bd =conectaBD();
//Compruebasielregistro(usuario,password)estenlaBD:
$query ="SELECT*FROMpasswords WHEREusuario=$uname ANDpassword =md5($pword)";
$resultado=$bd>query($query);
$numregistros =$resultado>num_rows;
if ($resultado){
if ($numregistros ==1){ //Elregistrodelusuarioypassword enlaBD
$_SESSION["login"]=true;
$_SESSION["usuario"]=$uname;
//MiraenlaBDcualeselnombredelusuarioquesehalogeado
$resultado>free();
$query ="SELECT*FROMclientesWHEREnif =$uname";
$resultado=$bd>query($query);
$registro=$resultado>fetch_assoc();
$_SESSION["nombreusuario"]=$registro["nombre"];
//Creauncarritoparaesteusuarioenlasesin
$_SESSION["carrito"]=newcarrito($usuario);
}
}
$bd>close();
}?> PHP 6
Juan Pavn - UCM 2012-13
Ataques de inyeccin SQL
Es importante preparar la entrada cuando se vaya a utilizar para
acceder a la BD
Por ejemplo (del manual de PHP
http://www.php.net/manual/es/function.mysql-real-escape-string.php)
<?php
// No hemos comprobado $_POST['password']
// Si lo que viene es lo siguiente
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";
// Consultar la base de datos para comprobar si existe algn usuario que coincida
$consulta =
"SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($consulta);
function limpia_sql($texto){
if (get_magic_quotes_gpc()){
$texto=stripslashes($texto);//quitabarras\ deunstring
}
if (!is_numeric($texto)){//quitasecuenciasdeescapepeligrosas
$texto="'".mysql_real_escape_string($texto)."'";
}
return $texto;
}
<?php
if (isset($_SESSION["login"])){
echo"<h1>Bienvenido".$_SESSION['nombreusuario']."</h1>";
echo"<p>Useelmenúdelaizquierdaparanavegar.</p>";
}else {
echo"<h1>ERROR</h1>";
echo"<p>Elusuarioocontraseña nosonválidos.</p>";
}
?>
Registro
<form action="procesarRegistro.php"method="POST">
<fieldset>
<legend>Datosdenuevocliente</legend>
<p><label>NIF:</label><inputtype="text"name="nif"maxlength="10"/></p>
<p><label>Nombre:</label><inputtype="text"name="username"maxlength="30"/></p>
<p><label>Dirección:</label><inputtype="text"name="direccion"
maxlength="50"/></p>
<p><label>Email:</label><inputtype="text"name="email"maxlength="30"/></p>
<p><label>Teléfono:</label><inputtype="text"name="telefono"
maxlength="15"/></p>
<p><label>Contraseña:</label><inputtype="password"name="password"
maxlength="40"/></p>
<button type="submit">Registrarse</button>
</fieldset>
</form>
Juan Pavn - UCM 2012-13 PHP 10
Pgina de proceso de registro
if ($_SERVER['REQUEST_METHOD']=='POST'){
$uname =limpia_sql(htmlspecialchars($_POST['nif']));
$pword =limpia_sql(htmlspecialchars($_POST['password']));
$pLength =strlen($pword);
if($pLength >=8&&$pLength <=20){
$error="";
}
else{
$error=$error."Elpassworddebe tener entre8120caracteres";
}
$nombre=limpia_sql(htmlspecialchars($_POST['username']));
$direccion =limpia_sql(htmlspecialchars($_POST['direccion']));
$email=limpia_sql(htmlspecialchars($_POST['email']));
$telefono =limpia_sql(htmlspecialchars($_POST['telefono']));
//Secomprobarsiyaexisteelusuario
$query ="SELECT*FROMpasswords WHEREusuario=$uname";
$resultado=$bd>query($query);
$numregistros =$resultado>num_rows;
if ($numregistros ==1){//Yaexisteunusuarioconeseuname (nif)
$error=$error."Yaexisteesteusuario";
}
else {//Seprocedearegistrarelusuario
//1)Enlatabladeclientes
$query ="INSERTINTOclientes(nif,nombre,direccion,email,telefono)
VALUES($uname,$nombre,$direccion,$email,$telefono)";
$resultado=$bd>query($query);
//2)Enlatabladepasswords
$pword =md5($pword); //Elpassword seguardarcodificado
$query ="INSERTINTOpasswords (usuario,password,fecha)VALUES($uname,
'$pword',CURRENT_TIMESTAMP)";
$resultado=$bd>query($query)
//Ysedejaalusuariodentrodelasesin
$_SESSION["login"]=true;
$_SESSION["usuario"]=$uname;
$_SESSION["nombreusuario"]=$nombre;
}
Juan $bd>close();
Pavn - UCM 2012-13 PHP 12
}
Ejercicios
Desarrollar la pgina de logout
Codificar el password antes de enviarlo
Usando javascript
OpenID
Solucin para evitar tener mltiples nombres de usuario/passwd
Permite distribuir la gestin de los perfiles de usuario
Y que el usuario decida quin gestiona su perfil y autenticacin
Carrito de la compra
Persistencia: MySQL
Gestin en servidor: PHP
Pre-proceso en cliente: JavaScript
Servidor
Agente $_SESSION[]
de usuario Base de datos
usuario
(Navegador)
carrito
pedidos[]
pedido producto
pedido producto
pedido producto
Atributos
Lista de productos
Estado
Comprando
Guardado
Tramitando
Pagando
Finalizado
Pagos
Las soluciones de pago ofrecen sus propias APIs
Ejemplo: PayPal
PayPal Instant Payment Notification Guide:
https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/
http://www.micahcarrick.com/paypal-ipn-with-php.html
Funcionamiento
En la pgina ver_carrito.php se pone un botn
<Pagar con PayPal>
La pgina siguiente para el cliente ser compra_finalizada.php
Crear un listener
Fichero ipn.php
El URL de este fichero ser el que se indique a PayPal para que enve
los POST con los mensajes IPN
Como plantilla se puede usar el software de
https://github.com/Quixotix/PHP-PayPal-IPN
Instalacin
Descargar la versin apropiada de http://xdebug.org/docs/install
Ponerla en el directorio ext de php
Configurar php.ini para usar Xdebug
Especialmente xdebug.remote_enable = 1
Configurar eclipse
Window->Preferences->PHP->Debug
Indicar que se va a usar Xdebug
Comprobar la URL en Debug Configurations