Seguridad en el uso del PHP y Bases de Datos

Ok, de todas formas si dejo el enlace aunque no esta la pagina, es solo el registro lo que estoy probando ahora, lo demas creo que me funciona bien y son paginas html para que visiten los usuarios, ahi no tengo formularios ni nada donde se puedan introducir datos, son paginas de lectura. como se aprende en el curso paso a paso.

Hay no habra problema? digo yo.

Bueno que me enrroyo al final.

http://conductor.myartsonline.com/index.html

Es un subdominio gratuito como ya creo que puse por ahi.

Gracias
he visto tu pagina, y creo que tienes muchos problemas en cuanto a la seguridad, parece ser que toda ella esta basada en javascript, la cual se puede burlar simplemente con deshabilitarlo.

Te recomiendo lo siguiente:
* Despues de limpiar tus variables de codigo malicioso, revisa que tus variable no esten vacias, por ejemplo supongamos que guardamos la edad de tu formulario en la variable $edad, entonces la procesamos:

if($edad=='"") echo "La Variable Esta Vacia";

if(empty($edad)) echo "La Variable Esta Vacia";

* Si no Estan Vacias Las variables, que tu script continue ejecutandose, paso la primera prueba.
* Despues comprueba si efectivamente el valor que lleva cada variable corresponde al indicado.

if(empty($edad)) echo "La Variable Esta Vacia";
if(is_numeric($edad) && !stristr($edad,".") && $edad>15 && $edad<100){
echo "Correcto Eres Mayor De 15 y Menor De 100";
}else{
echo "Tu Edad No Es Correcta";
}

Asi podrias emplear los mismos metodos para tus demas datos.
Gracias Áldaron

Entonces serian 4 reglas por cada campo del form?

He mirado lo de serverdns y esta muy bien pero yo ahi no llego.

Yo lo hice con dreanweaver y en inspector de etiquetas/comportamientos es donde valide el form, si puse en numero que fuesen numeros y en email que fuese email, la edad la comprobe tambien, los campos obligatorios, pero eso no se si restringe el php o com dice codomodragon c++ lenguaje programacion. eso ya me supera con mucho, es esto y ya me cuesta entenderlo.

Aun asi creo que he aprendido mucho, por que no tenia ni idea de nada.

un saludo
Lo he entendido, lo de java es lo que te da dreanweaver al validar.

El ejemplo que me as puesto esta genial de verdad pero lo as puesto para edad, y es "is_numeric" pero para email no es un numero, ni texto y los nombres, ciudades, apellidos tampoco son numeros son textos. Perdona pero no se como seria.

Lo siento.

Gracias
Ya lo e mirado y no as dejado rastro de nombre, ni password, ni email, es lo que me paso el otro dia como e comentado, el otro dia si dejaron el nombre el pasword y el email, pero en los tres campos ponia virus y en el email igual sin @ ni domino, yo lo que mas temo es que accedan ala base de datos, y si se van registrando usuarios que los borren o algo asi, si se registran mal tambien tengo a posibilidad e bloquearlos, tu un ejemplo no as dejado rastro pero si se a quedado tu ip, por la ip tambien lo puedo bloquear, a no ser uqe accedan a la dase de datos y a la tabla y se borren los datos.

Gracias

Un saludo
Ok, Yo Recomiendo Las Validaciones solo para los datos importantes y necesarios, que serian en tu caso, usuario, correo, Y contraseña, ya que el nombre seria dificil de validar, ya que no conocemos todos los nombres, al igual que los apeidos y ciudades, con el simple hecho de validar que no esten vacias y limpias de codigo malicioso seria suficiente.

para poder validar el usuario debes plantearte que caracteres seran aceptados, por ejemplo: A-Z, a-z, 0-9, _ -

Para Validar el correo podrias leerte esto Validar correos con php

Las contraseñas, desconosco como las guardas en la base de datos, pero al tratarse de contraseñas, generalmente son encriptadas con algun metodo, el mas usado md5(); si usas un algoritmo de encriptacion para las contraseñas, la variable que la lleva no deberias pasarla por los filtros de codigo malicioso, ya que si por ejemplo yo soy aficionado al html y quiero que mi contraseña sea <html>serverdns<br> tus filtros la limpiaran y si me registro cuando quiera loguearme no lo podre hacer porque tu script modifico mi contraseña.

En cuanto ha blokear los usuarios por ip es una mala idea, ya que muchos de los usuarios tienen ip dinamica, y rara vez tienen la misma ip al navegar, es mejor blokearos por usuario o por correo electronico.
Lo e deducido de java

El texto es: "is_empty",

y el email es "is_anemailaddress",

pero no se si es correcto
Ok, lo e entendido casi todo, pero me e perdido del todo en lo de encritar las contraseñas eso es nuevo, yo las guardaba en una base de datos, nada mas.

Pero ire por partes, primero limpiar de codigo malicioso, con las 4 reglas de antes.

despues validar correos, usuarios y contraseñas

Y por ultimo encriptar contraseñas.

Lo de bloquear, puede ser por ip, por usuario, o por email, lo puedo hacer por cualquiera de los tres campos.

Bueno espero que esto tambien sirva a alguien mas que lo lea.

Gracias y perdona, pero habras comprobado que estoy muy verde en esto.
javascript y php son diferentes, las funciones que usa javascript en la mayoria de los casos no son iguales que en php, asi que no puedes uarlas en php.
Jeyn escribió:Ok, lo e entendido casi todo, pero me e perdido del todo en lo de encritar las contraseñas eso es nuevo, yo las guardaba en una base de datos, nada mas.

Pero ire por partes, primero limpiar de codigo malicioso, con las 4 reglas de antes.

despues validar correos, usuarios y contraseñas

Y por ultimo encriptar contraseñas.

Lo de bloquear, puede ser por ip, por usuario, o por email, lo puedo hacer por cualquiera de los tres campos.

Bueno espero que esto tambien sirva a alguien mas que lo lea.

Gracias y perdona, pero habras comprobado que estoy muy verde en esto.

Jejeje no te preocupes, encriptar contraseñas es una de las cosas más fáciles que hay en PHP :)
Te pondré un ejemplo práctico-gráfico:

<?
// Supongamos que queremos guardar una contraseña de un usuario en nuestra BBDD. Seguimos los pasos comentados anteriormente.
//1. Revisamos, como bien dijo serverdns de que nuestra variable no esté vacía.
if(!empty($_POST['pass'])){
//2. Si no está vacía se limpia la variable $_POST de cualquier posible código malicioso.
$pass = stripslashes($_POST['pass']));
$pass = stript_tags($pass);
$pass = htmlentities($pass);
$pass = htmlspecialchars($pass);
//3. Encriptamos la contraseña con md5()
$pass = md5($pass);
?>

Eso es todo, así de fácil :)
Pienso, comparto, aprendo, luego creo
Si bien encriptar contraseñas es lo mas simple del mundo en php, Áldaron tu ejemplo es bueno, pero almenos yo no considero correcto, ya seria un codigo inecesario, 4 funciones que procesan una variable que quizas lleve codigo malicioso, la limpian y despues la encripta el md5(); todo bien, pero se perdieron milisegundos en procesar una variable para quitar un codigo que quedaria inutilizado al encriptar con md5(); esos milisegundos podrian utilizarse para validar la contraseña:

Validando Y Encriptando contraseñas.
$codigo1=isset($_POST['pass1'])?$_POST['pass1']:'';
$codigo2=isset($_POST['pass2'])?$_POST['pass2']:'';
$minimo=6;
if(!empty($codigo1) && strlen($codigo1)>=$minimo && !empty($codigo2) && strlen($codigo2)>=$minimo){
$codigo1_md5=md5($codigo1);
$codigo2_md5=md5($codigo2);
if($codigo1_md5==$codigo2_md5){
echo "La contraseña es correcta, mayor o igual ha $minimo";
}else{
echo "Las contraseñas no son iguales";
}
}else{
echo "La contraseña esta vacia o es menor a $minimo";
}
Ok, lo conseguí, gracias

Por lo menos he conseguido que me funcione, aplicando lo que me habeis puesto.

Ahora solo me queda una cosa que abrire otro post para ello, es para recuperar la contraseña.

Ah! una cosilla, yo cuando pongo aqui codigos los pongro entre etiqueta "quote" como se hace para ponerlo como vosotros?. Es que se ven mejor los codigos

Muchas gracias de nuevo

Un saludo
Ya te respondí a tu otro post de "recuperación de contraseñas" y para poner el código con colores debes poner tu código entre los tags [ PHP] y [/ PHP]. Nótese que hay espacios entre [ PHP y [ /PHP, esto lo hago porque sino el sistema lo reconocería como que quiero escribir un código :P
Pienso, comparto, aprendo, luego creo
Se que llego un poco tarde, pero hasta ahora no me había planteado el tema de la seguridad, y por lo que veo es bastante arduo.
Bueno al tema. Si hago un select de dos campos a mi bd ¿como he de poner el mysql_real_escape_string?
Para uno es asi:
mysql_query("SELECT nombre FROM usuarios WHERE nombre='".mysql_real_escape_string($nombre)."'");
¿Pero para dos?
mysql_query("SELECT nombre, clave FROM usuarios WHERE nombre='$nombre' AND clave='$clave'");
¿Como sería?
Y otra cosa, si paso la clave por md5, mi bd la guarda codificá y si quiero entrar en otra sesion, no me reconoce la clave.
¿como hago para que la reconozca?
Gracias
Lo mejor de caerse al tropezar, es volverse a levantar.
Vale, el tema de poner "mysql_real_escape_string" a un select de dos campos, lo he solucionao.
$registrado=mysql_query("SELECT nombre, contrasena FROM usuarios WHERE nombre='".mysql_real_escape_string($nombre)."' AND contrasena='".mysql_real_escape_string($contrasena)."'");
Pero sigo sin sacar la solucion del envio de contraseña por md5.
He estado googleando, y deduzco que no se puede ya que la codificacion en md5 es unica cada vez, osea que no tienen asignado un valor cada caracter, sino que se crea por un proceso que desconozco mediante nº primos.
Por tanto no vale usar el md5 para guardar la contraseña en una bd, ya que en la siguinte session no coinciden las contraseñas.
Lo mejor de caerse al tropezar, es volverse a levantar.
Estas equivocado, el md5 de un archivo y/o cadena siempre es el mismo, la en criptacion de md5 es irreversible, esto es que una vez encriotado con md5 no podras volver ha desencriptar, solo utilizando fuerza bruta, de hecho el md5 es muy utilizado en la encriptacion de contraseñas, para mas seguridad algunos utilizas dobre encripotacion o tripe.

debes estar utilizando mal la encriptacion o al momento de comparar y hacer tu consulta debes estar cometiendo un error. quizas si pones tu codigo completo se podria ver el error.
@gjulian: corrijanme si me equivoco, pero lo siguiente debería funcionar:

$nombre = mysql_real_escape_string($nombre);
$contrasena = mysql_real_escape_string($contrasena);
// A no ser de que la contraseña se haya encriptado anteriormente, es necesario encriptarla para compararla con la contraseña guardada que, supuestamente, ya esta encriptada.
$registrado=mysql_query("SELECT nombre, contrasena FROM usuarios WHERE nombre='".$nombre."' AND contrasena='".md5($contrasena)."'");

Si guardaste la contraseña encriptada, entonces debes tener en cuenta que el usuario no ingresará la contraseña encriptada y por ende, si la comparas tal cual la ingresó el usuario, entonces nunca encontrará coincidencias, por ello tienes que encriptarla antes de comparar.

Saludos.
Pues he probado de todas formas y no hay manera. Dejo el codigo por si veis el fallo.
En registrando.php
include("conexcion.php");
$fecha=date("d/m/Y");
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($_POST["autor"]);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($_POST["clave"]);
$clave=stripslashes($_POST["clave"]);
$clave=htmlspecialchars($_POST["clave"]);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($_POST["acepto"]);
$autor=mysql_real_escape_string($autor);
if (empty ($_POST["autor"]) || (empty($_POST["clave"]))){
echo "<h3>Debes rellenar todos los datos</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
} else {
$registrando=mysql_query("SELECT autor FROM usuarios WHERE autor='$autor'");
if ($nuevousuario=mysql_fetch_array($registrando)){
echo "<h3>*".$autor."*, ya existe</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<h3>elige otro</h3>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
} else {
if ($_POST["acepto"] == 'aceptar'){
mysql_query("INSERT INTO usuarios(autor,clave,fechaInscripcion) 
values('$autor','$clave','$fecha')") or die ('Solo caracteres latinos ó numeros');
echo "<h4>Te has registrado con exito</h4><h3> ".$autor."</h3>";
echo "<img alt='sexy' src='img/Policia-sexy.gif' height='200' width='204' />";
echo "<h4>Ya formas parte como miembro de este portal</h4>";
echo "<h3>Para entrar clikea <a href='portal.html'>aqui</a></h3>";
setcookie("usuario",$autor,time()+7776000);
setcookie("contrasena",$clave,time()+7776000);
} else {
echo "<h3>Debe aceptar las condiciones</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
}
}
}
echo "</div></center>";
exit;
Y para la proxima session
entrar.php
if (isset($_COOKIE["usuario"]) && isset($_COOKIE["contrasena"])){
Header("Location: foro/foro.php");
}
include("conexcion.php");
$fecha=date("d/m/Y");
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($_POST["autor"]);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($_POST["clave"]);
$clave=stripslashes($_POST["clave"]);
$clave=htmlspecialchars($_POST["clave"]);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($_POST["acepto"]);
$autor=mysql_real_escape_string($autor);
$clave=mysql_real_escape_string($clave);
//Buscamos en la tabla si existe un usuario con ese nombre y esa contraseña
$registrado=mysql_query("SELECT autor, clave FROM usuarios WHERE autor='$autor' AND clave='md5($clave)'");
//Si existe un usuario con ese alias y esa clave, entra. 
if ($usuario=mysql_fetch_array($registrado)){
Header("Location: portal.html");
setcookie("usuario",$autor,time()+7776000);
setcookie("contrasena",$clave,time()+7776000); 
exit;
} else {
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<h2>Area exclusiva de los miembros</h2>";
echo "<input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
}
exit;
Lo mejor de caerse al tropezar, es volverse a levantar.
Seguro que me equivoco, pero por probar...

En entrar.php prueba cambiando esta línea
$registrado=mysql_query("SELECT autor, clave FROM usuarios WHERE autor='$autor' AND clave='md5($contrasena)'");

por esta
$registrado=mysql_query("SELECT autor, clave FROM usuarios WHERE autor='$autor' AND clave='md5($clave)'");
Bien visto Doodleo, ese error es un lapsus que correji cuando lo copiaba para pegarlo aqui.
Gracias
Lo mejor de caerse al tropezar, es volverse a levantar.
Bueno, por lo menos ya sé buscar algún que otro fallo, it's something jajajaja

Entonces sigue dando error no?
Bueno revisando tu codigo tienes algunos errores:

registrando.php

include("conexcion.php");
$fecha=date("d/m/Y");
/* Filtras las variables POST pero sigues filtrando la misma variable cuando deberia ser asi:
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($autor);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($clave);
$clave=stripslashes($clave);
$clave=htmlspecialchars($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($acepto);
*/

$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($_POST["autor"]);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($_POST["clave"]);
$clave=stripslashes($_POST["clave"]);
$clave=htmlspecialchars($_POST["clave"]);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($_POST["acepto"]);
$autor=mysql_real_escape_string($autor);

/* Todo Tu proceso de seguridad y filtracion no sirven si al final terminar trabajando con las variables POST[] */

if (empty ($_POST["autor"]) || (empty($_POST["clave"]))){
echo "<h3>Debes rellenar todos los datos</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
} else {
$registrando=mysql_query("SELECT autor FROM usuarios WHERE autor='$autor'");
if ($nuevousuario=mysql_fetch_array($registrando)){
echo "<h3>*".$autor."*, ya existe</h3>";
echo "<center><img alt='policia' src='img/Policim a.gif' height='130' width='165' /><br/>";
echo "<h3>elige otro</h3>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
} else {
if ($_POST["acepto"] == 'aceptar'){  // le pasaste el filtro de seguiridad pero al final trabajas con la variable como es enviada
mysql_query("INSERT INTO usuarios(autor,clave,fechaInscripcion)
values('$autor','$clave','$fecha')") or die ('Solo caracteres latinos ó numeros');
echo "<h4>Te has registrado con exito</h4><h3> ".$autor."</h3>";
echo "<img alt='sexy' src='img/Policia-sexy.gif' height='200' width='204' />";
echo "<h4>Ya formas parte como miembro de este portal</h4>";
echo "<h3>Para entrar clikea <a href='portal.html'>aqui</a></h3>";
setcookie("usuario",$autor,time()+7776000);
setcookie("contrasena",$clave,time()+7776000);
} else {
echo "<h3>Debe aceptar las condiciones</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
}
}
}
echo "</div></center>";
exit;

entrar.php

if (isset($_COOKIE["usuario"]) && isset($_COOKIE["contrasena"])){
Header("Location: foro/foro.php");
}
include("conexcion.php");
$fecha=date("d/m/Y");

/* Filtras las variables POST pero sigues filtrando la misma variable cuando deberia ser asi:
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($autor);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($clave);
$clave=stripslashes($clave);
$clave=htmlspecialchars($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($acepto);
*/

$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($_POST["autor"]);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($_POST["clave"]);
$clave=stripslashes($_POST["clave"]);
$clave=htmlspecialchars($_POST["clave"]);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($_POST["acepto"]);
$autor=mysql_real_escape_string($autor);
$clave=mysql_real_escape_string($clave); // esta linea no es necesaria pues la clave ya esta en md5 y es solo una cadena alfanumerica
//Buscamos en la tabla si existe un usuario con ese nombre y esa contraseña
/* En la siguiente consulta cometes un error grave, dices que clave='md5($clave)' cuando deveria ser unicamente clave='$clave' pues ya has encriptado la clave al comienzo*/
$registrado=mysql_query("SELECT autor, clave FROM usuarios WHERE autor='$autor' AND clave='md5($clave)'");
//Si existe un usuario con ese alias y esa clave, entra.
if ($usuario=mysql_fetch_array($registrado)){
Header("Location: portal.html");
setcookie("usuario",$autor,time()+7776000);
setcookie("contrasena",$clave,time()+7776000);
exit;
} else {
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<h2>Area exclusiva de los miembros</h2>";
echo "<input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
}
exit;
Vale, despues de seguir tus correcciones, serverdns, me sigue dando "Area exclusiva de miembros" , osea que una vez registrado con md5, cuando inicia otra session no me reconoce la clave. ¿Donde está el error?
Ahora queda asi, aqui se registra por 1ª vez.
registrando.php
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($autor);
$autor=mysql_real_escape_string($autor);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($clave);
$clave=stripslashes($clave);
$clave=htmlspecialchars($clave);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($acepto);
if (empty ($autor) || (empty($clave))){
y aqui inicia otra session
entrar.php
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($autor);
$autor=mysql_real_escape_string($autor);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($clave);
$clave=stripslashes($clave);
$clave=htmlspecialchars($clave);
$clave=mysql_real_escape_string($clave);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($acepto);
//Buscamos en la tabla si existe un usuario con ese nombre y esa contraseña
$registrado=mysql_query("SELECT autor, clave FROM usuarios WHERE autor='$autor' AND clave='$clave'");
Lo mejor de caerse al tropezar, es volverse a levantar.
Bueno, para poder ayudarte mejor debes poner todo el codigo que utilizas pues esos fracmentos no me dicen nada, son practicamente los mismo que en los post anteriores, no se especifica como llegan los datos, si vienen de algun formulario o intentas recuperar los datos de la session iniciada al registrarte, o como es que inicias la session.
Evidentemente las variables vienen de los nombres de los input de un formulario asi de registro.html
<h2>Registrate</h2>
<center><form action="registrando.php" method="post" enctype="multipart/form-data" name="entrando">
<h3 style="color:black">Introduce tus datos</h3>
<h4>nick</h4>
<input type="text" name="autor" size="20" />
<h4>password</h4>
<input type="password" name="clave" size="20" /><br/>
<br/><input type="submit" value="entrar" class="enviar" /><br/>
<input type="checkbox" name="acepto" value="aceptar" checked />
<small>He leido y acepto las <a href="condiciones.html">condiciones</a></small></center>
llega a registrando.php:
<?
echo "<center><div id='registrando'>";
include("conexcion.php");
$fecha=date("d/m/Y");
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($autor);
$autor=mysql_real_escape_string($autor);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($clave);
$clave=stripslashes($clave);
$clave=htmlspecialchars($clave);
$clave=md5($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($acepto);
if (empty ($autor) || (empty($clave))){
echo "<h3>Debes rellenar todos los datos</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
} else {
$registrando=mysql_query("SELECT autor FROM usuarios WHERE autor='$autor'");
if ($nuevousuario=mysql_fetch_array($registrando)){
echo "<h3>*".$autor."*, ya existe</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<h3>elige otro</h3>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
} else {
if ($_POST["acepto"] == 'aceptar'){
mysql_query("INSERT INTO usuarios(autor,clave,fechaInscripcion) 
values('$autor','$clave','$fecha')") or die ('Solo caracteres latinos ó numeros');
echo "<h4>Te has registrado con exito</h4><h3> ".$autor."</h3>";
echo "<img alt='sexy' src='img/Policia-sexy.gif' height='200' width='204' />";
echo "<h4>Ya formas parte como miembro de este portal</h4>";
echo "<h3>Para entrar clikea <a href='portal.html'>aqui</a></h3>";
setcookie("usuario",$autor,time()+7776000);
setcookie("contrasena",$clave,time()+7776000);
} else {
echo "<h3>Debe aceptar las condiciones</h3>";
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<br/><input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
}
}
}
echo "</div></center>";
exit;
?>
Hasta aqui todo bien (o eso creo), pues se guarda todo en la bd y la clave codificada.
Despues si ese usuario registrado quiere comenzar session en otrto momento, si el navegador le borra las cookies al cerrar, tiene el form solo para miembros,que es:entrando.php
? 
if (isset($_COOKIE["usuario"]) && isset($_COOKIE["contrasena"])){
Header("Location: portal.html");
exit;
} else {
echo "<center><div id='entrando'>";
echo "<center><form action='entrar.php' method='post' enctype='multipart/form-data' name='entrando'>";
echo "<h2>Introduce tus datos</h2>";
echo "<h4>nick</h4>";
echo "<input type='text' name='autor' size='20' />";
echo "<h4>password</h4>";
echo "<input type='password' name='clave' size='20' /><br/>";
echo "<br/><input type='submit' value='entrar' class='enviar' />";
echo "</form>";
echo "</div></center>";
}
exit;
?>

que manda los datos a entrar.php
<?
if (isset($_COOKIE["usuario"]) && isset($_COOKIE["contrasena"])){
Header("Location: foro/foro.php");
}
include("conexcion.php");
$fecha=date("d/m/Y");
$autor=strip_tags($_POST["autor"]);
$autor=htmlentities($autor);
$autor=mysql_real_escape_string($autor);
$clave=strip_tags($_POST["clave"]);
$clave=htmlentities($clave);
$clave=stripslashes($clave);
$clave=htmlspecialchars($clave);
$clave=md5($clave);
$clave=mysql_real_escape_string($clave);
$acepto=strip_tags($_POST["acepto"]);
$acepto=htmlentities($acepto);
//Buscamos en la tabla si existe un usuario con ese nombre y esa contraseña
$registrado=mysql_query("SELECT autor, clave FROM usuarios WHERE autor='$autor' AND clave='$clave'");
//Si existe un usuario con ese alias y esa clave, entra. 
if ($usuario=mysql_fetch_array($registrado)){
Header("Location: portal.html");
setcookie("usuario",$autor,time()+7776000);
setcookie("contrasena",$clave,time()+7776000); 
exit;
} else {
echo "<center><img alt='policia' src='img/Policia.gif' height='130' width='165' /><br/>";
echo "<h2>Area exclusiva de los miembros</h2>";
echo "<input type='button' value='volver' name='volver' onclick='history.back()' /></center>";
}
exit;
?>
Y es aqui donde me parece que esta el problema, pues no reconoce la clave.
Si elimino la linea $clave=md5($clave); tanto de registrando.php como de entrar.php, todo va bien, pero con ella no. ¿que falla?
¿Que os parece?
Lo mejor de caerse al tropezar, es volverse a levantar.