Un par de tips caseros.

Iniciado por Xt3mP, Agosto 17, 2010, 08:03:43 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Agosto 17, 2010, 08:03:43 PM Ultima modificación: Marzo 27, 2014, 06:07:19 PM por Expermicid
Algunas funciones y tips para mejorar su web.
------------------------------------------------
Hace poco esta adentrandome más en PHP y encontré (mejor dicho, recordé) una función parecida a la etiqueta FORM METHOD en modo GET de HTML que lo que hace es mostrar ó añadir los argumentos (en este caso los inputs) del formulario por una URL, ejemplo:

Código: html5

<html>
<head>
<title>Form</title>
</head>
<body>
<form action="" METHOD="GET">
Nombre: <input type="text" name="name" id="name"><br /> <!-- Xt3mP -->
Edad: <input type="text" name="age" id="age"><br /> <!-- 17 -->
Mail: <input type="text" name="mail" id="mail"><br /> <!-- [email protected] -->
Pais: <input type="text" name="country" id="country"><br /> <!-- Mexico -->
<input type="submit" value="Enviar">
</form>
</body>
</html>


Y que al dar enviar nos generaría una URL algo así: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, es decir, nos muestra todas los "inputs" en la variable.

Entonces con PHP hay una función llamada http_build_query() que apartir de un array asociativo ó indexado, nos generaría una "cadena" al estilo de GET como mencioné anteriormente:

Código: php

<?php
$datos = array("name" => "Xt3mP", "age" => "17", "mail" => "[email protected]", "country" => "Mexico");
echo "www.web.com/path/?".http_build_query($datos);
/*
Daria:
www.web.com/path/?name=Xt3mP&age=17&mail=Xt3mP%40und3rgr0und.org&country=Mexico
*/
?>


Como ven, hace "prácticamente" lo mismo, esto puede servir en caso de que tengamos muchos "switchs" ó si tenemos alguna página que necesite agregar los argumentos en la URL ya que no podemos hacer un "switch" para cada parámetro, entonces creamos un array con los datos que ocuparémos y listo, la verdad a mi me funciona mucho, espero les sirva.
------------------------------------------------
Limpiar variables con carácteres raros.

Cuantas veces no nos ha pasado que tenemos algún sistema de usuarios ó algún sistema de registros en donde el usuario tiene que facilitar su nickname (nombre de usuario) y al revisar el registro ó base de datos nos encontramos con carácteres raros que pueden dejarnos vulnerables, entonces hice una función que "limpia" literalmente los carácteres raros de la siguiente manera:

Código: php

<?php
function limpiar_texto($texto){
$car = array("\\","ª","º","-","~","#","@","|","!","\"","·","$","%","&","/","(",")","?","'","¡","¿","[","^","`","]","+","Ç","}","{","¨","´","ñ","Ñ",">","<",";",",",":","."," ","á","é","í","ó","ú","Á","É","Í","Ó","Ú","à","â","ã","À","Â","Ã","è","ê","ì","î","Ì","Î","ò","ô","õ","Ò","Ô","Õ","ù","û","Ù","Û");
$texto = str_replace($car, "", $texto);
return $texto;
}
echo limpiar_texto($_GET['casilla_de_texto']);
/*
xTÉèêemP daria:
xTemP
*/
?>


Entonces, simplemente hacer un include a las funciones y agregar la que les facilité arriba y así limpiamos los carácteres raros, inclusive pueden quitar ó agregar carácteres en el array dependiendo lo que necesiten.
------------------------------------------------
Saber quien nos está queriendo fastidiar la web.

Muchas veces al filtrar las variables no se guarda en la base de datos los carácteres raros que pueden ser vulnerables hacia nuestra web, pero ¿Entonces como localizaríamos a aquellos que nos quieren joder? Fácil.

Suponiendo que es un registro:

Código: php

<?php
include ("connect.php"); //Incluimos la conexion a la DB
$user = $_POST['user'];
$pass = $_POST['pass'];
$mail = $_POST['mail'];
$ip = $_SERVER[REMOTE_ADDR];
mysql_query("INSERT INTO users (user,pass,mail,ip) values ('".$user."','".$pass."','".$mail."','".$ip."') ") or die (mysql_error());
echo "Hola ".htmlentities($user).", te has registrado correctamente.";
?>


Introducimos los datos a la base de datos sin filtrar las variables y mostramos en pantalla filtrandolas, te preguntarás ¿Por qué? Así suponiendo que el usuario escribe algo como "<h1>Xt3mP</h1>", así igualmente aparecería en la base de datos junto con la IP, de esta manera sabremos quien nos esta queriendo joder las "balls", obviamente al mostrarlo en pantalla le metemos un htmlentities(), bueno, a mi me sirve, he pillado a muchos que han querido joderme.
------------------------------------------------
Usuarios autorizados.

A veces (He visto), que una parte de las páginas web online te piden autorización para ciertas páginas, digamosle panel_adm.php ¡PERO!, si entramos (ejemplo) a panel_adm_addusers.php da la casualidad que hay no te pide autorización del sitio y queda totalmente a la merced del usuario atacante.

Les recomiendo hacer una función ó comprobar (como lo haré en este caso) que siempre que sea una página crítica solo personal autorizado pueda acceder a ella:

Código: php

<?php
session_start(); //Inicia la session, si existe la retoma, si no existe la crea.

if ($_SESSION['admin'] != TRUE){ //Comprobamos que la sesion ADMIN sea verdadera, recuerden que != significa diferente a.
echo "No autorizado";
}else{

//Toda la web aqui

}
?>

------------------------------------------------
Encriptación de contraseñas.

A veces la encriptación de contraseñas con "hashes" se nos hace un poco díficil ya que es one-way, es decir, solo encriptan más no tiene función para desencriptar a menos que sea con "brutus force" mediante encriptando la contraseña en el mismo tipo de encriptación y comparar si la contraseña encriptada es igual a la que encriptamos, es decir:


Si la contraseña encriptada del usuario es: 21fa33e4fb9fa3f1da10f7c17823e7e8

El atacante al obtener esa contraseña y darse cuenta por obvias razones que es md5, utilizará alguna herramienta tanto online como offline que funcionan de la siguiente manera:

Encriptar: Text1 = 1c06e3d86536d0eb8903da08af433909
Encriptar: Text1 = eb396671a7de43af3a9b5afaceb1514b
Encriptar: Xt3mP = 21fa33e4fb9fa3f1da10f7c17823e7e8 (Bingo) Nos vota exáctamente el mismo hash por lo tanto esa sería la contraseña.

En terminos básicos, para desencriptar un hash one-way se hace a la reversa literalmente, encriptas el texto lo cual hará que nos genere un hash y ya obteniendo ese hash lo comparas con el hash de la contraseña.

Así que almenos yo encripto la contraseña de manera muy, mmm como decirlo, que sea díficil de descifrarla:

Código: php

<?php
$pass = "Xt3mP";
$pass = base64_encode(md5(md5(sha1(crypt(md5($pass),"s523/*a5s4s"))).$pass));
echo $pass;
/*
Daria:
Y2YzOWUxYzNkZWZiZGExYmU3OTUyNDk2MmE0YjhiNTA=
*/
?>


Ya al momento de querer cambiar la contraseña hay sería lo díficil, porque tendrías que crear un sistema de reseteo de contraseña mediante la introducción de la fecha de nacimiento, pregunta privada, etc.

Nota: Y sí, puse base64 para que cuando el atacante la vea sepa que le estoy jugando una pequeña bromita =).
------------------------------------------------
Ultimo tip y el más importante.

Es un frase:

"No por tener menos código significa que sea mejor."

Creo que le entienden, se refiere a que no por tener reducido todo en un solo PHP (y gracias a esto cometer un error de programación) significa que el script vaya a ser mejor ó más rápido, usen la cantidad de archivos que realmente necesiten.
------------------------------------------------
Saludos.
Cada vez que me das Karma me motivas