Autor Tema: Sistema PHP  (Leído 1872 veces)

Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Sistema PHP
« en: 11 de Octubre de 2010, 18:23:59 pm »
Hola a todos,  bueno quería comentarles que voy a intentar desarrollar un Sistema PHP en el que habrá login de usuarios. Espero que con este desarrollo aclare mis dudas con respecto a este tema.
Unas cosas que me gustaría hacer funcionar son las siguientes:
  • Evitar SQL Injection, etc.
  • Si por ejemplo tengo index.php?id=nuevapagina, no poder abrir esta nuevapagina.php en otra pestaña por separado, tengo ententido que se crearían un token personalizado por pagina.
En principio será eso, más adelante iré añadiendo lo que vaya haciendo y así ustedes pueden comentar sobre lo que está mal y está bien.
Si alguien tiene información acerca de esto, le agradeceré que la vaya posteando!

Un saludo, pronto postearé de nuevo!

Comunidad PHPeros

Sistema PHP
« en: 11 de Octubre de 2010, 18:23:59 pm »

Desconectado Warlox

  • Moderadores PHP
  • PHPero Master
  • ****
  • Mensajes: 1.278
  • Karma: 77
  • Sexo: Masculino
  • A veces hay que aprender a correr antes de caminar
    • Ver Perfil
    • Página personal
Re:Sistema PHP
« Respuesta #1 en: 11 de Octubre de 2010, 18:39:59 pm »
Vale, en el foro hay tutoriales sobre lo que es el login de usuario, registro, etcétera. Ahora te voy aclarando las dudas que pusiste en el tema:

- Para evitar las SQLi (SQL Inyection), puedes usar htmlspecialchars(), htmlentities(), strip_slashes() ó mysql_real_escape_string().

- Ahora, para lo del sistema de modulación (index.php?id=nuevapagina), también puedes buscar los tutoriales en el foro, lo único que tienes que cambiar es agregarle un define al index.php, osea, que antes de que comienzas el sistema de modulación, le agregas el siguiente código:

<?php
define
(&#39;modulacion&#39;, true);
?>


Luego, a cada archivo (nuevapagina.php), debes de comprobarle que se haya definido la variable de modulación, para eso pones el siguiente código al principio:

<?php
if(!defined(&#39;modulacion&#39;)){ die(&#39;No me trates de armar la web xD&#39;); }
?>


Espero que te haya ayudado, de igual manera te dejo el link hacia la lista de los tutoriales más necesarios e importantes a la hora de hacer tu web ;)

Saludos ^^
Enlace: Lista de tutoriales publicados.
- Moderador de PHP


Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Re:Sistema PHP
« Respuesta #2 en: 11 de Octubre de 2010, 20:58:42 pm »
Hola!!
1.- En cuanto a esto:
Código: [Seleccionar]
<?php
define
(&#39;modulacion&#39;, true);
?>

creo que no serviría, tal vez me equivoco. Supongamos, tengo una web formada mediante div's, accedo a miweb.com/index.php?id=modulacion.php (es decir, incluye el archivo modulacion.php dentro del div para mostrar su contenido) y 'modulacion' se pone a TRUE, entonces si luego hago miweb.com/modulacion.php creo que entraría no?[/li][/list]

2.- En cuanto a SQLi, he estado probando pero no he llegado a conseguir hacerlo funcionar del todo bien, bueno cuando llegue a esa parte con este proyecto ya lo trataremos mejor!

« Última modificación: 11 de Octubre de 2010, 21:03:39 pm por C-ChacK »

Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Proyecto: Galería de imágenes
« Respuesta #3 en: 11 de Octubre de 2010, 21:33:15 pm »
Bueno, en principio tengo pensado crear una web simple con paginas visibles para todos y privadas que requieren login.
Antes de todo hay que crear el archivo install.php que creará la base de datos con la información del usuario.

install.php
Código: [Seleccionar]
<?php
  
if (file_exists("includes/config.php"))
    include(
"includes/config.php");

  
$conexion mysql_connect($host$user_db$pass_db) or die (mysql_error());

  
// CREACION DE LA BASE DE DATOS
  
$crearDataBase "CREATE DATABASE IF NOT EXISTS $db;";
  
$comando mysql_query($crearDataBase$conexion);

  
// CREACION DE LA TABLA DE INFORMACION DE LOS ADMINISTRADORES
  
$comando mysql_select_db($db$conexion);

  
$crearTable  "CREATE TABLE IF NOT EXISTS $info_admins (
      admin VARCHAR (20) NOT NULL default &#39;&#39;,
      pass VARCHAR (40) NOT NULL default &#39;&#39;,
      date VARCHAR (10) NOT NULL default &#39;&#39;,
      hour VARCHAR (8) NOT NULL default &#39;&#39;,
      PRIMARY KEY (admin)
    ) TYPE=MyISAM COMMENT=&#39;Administradores de la BD&#39;;"
;
  
  
$comando mysql_query($crearTable$conexion);

  
$date     date("d.m.Y");
  
$hour     date("H:i:s");
  
$clave    md5("passAdmin");
  
$insertar "INSERT INTO $info_admins (admin, pass, date, hour) VALUES (&#39;admin&#39;, &#39;$clave&#39;, &#39;$date&#39;, &#39;$hour&#39;);";
  
$comando mysql_query($insertar$conexion);
  
  
mysql_close();
?>


Para ello requiere el fichero config.php dentro de la carpeta includes
includes/config.php
Código: [Seleccionar]
<?php
  $host    
"localhost";
  
$user_db "root";
  
$pass_db "passRoot";
  
  
$db "nombreBD";
  
  
$info_admins  "info_admins";
?>


En cuanto a este codigo, supongo que se le pueden hacer muchas mejoras...

Desconectado lalitros

  • PHPer@ Fijo
  • ***
  • Mensajes: 162
  • Karma: 3
  • Sexo: Masculino
    • Ver Perfil
Re:Sistema PHP
« Respuesta #4 en: 12 de Octubre de 2010, 00:10:02 am »
Hola!!
1.- En cuanto a esto:
Código: [Seleccionar]
<?php
define
(&#39;modulacion&#39;, true);
?>

    creo que no serviría, tal vez me equivoco. Supongamos, tengo una web formada mediante
div's, accedo a miweb.com/index.php?id=modulacion.php (es decir, incluye el archivo modulacion.php dentro del div para mostrar su contenido) y 'modulacion' se pone a TRUE, entonces si luego hago miweb.com/modulacion.php creo que entraría no?[/li][/list]

2.- En cuanto a SQLi, he estado probando pero no he llegado a conseguir hacerlo funcionar del todo bien, bueno cuando llegue a esa parte con este proyecto ya lo trataremos mejor!



No serian las cookies mejor?
Osea, puedes crear  a base de condicion para que no pueda entrar de la manera que tu dices.

No se si ya buscaste en el foro, pero hay una info de Paginas con Modulacion.

Salu2

Si me dieran a escojer entre el MUNDO y Tu.. Te escojeria a Ti, porque mi MUNDO ERES TU

Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Re:Sistema PHP
« Respuesta #5 en: 12 de Octubre de 2010, 00:27:08 am »
Respecto a los tokens he encontrado a lo que me refería, esta en el siguiente link: http://maycolalvarez.blogspot.com/2010/03/seguridad-en-php-csrf-o-falsificacion.html

Desconectado Francisco

  • PHPer@
  • **
  • Mensajes: 53
  • Karma: 2
  • Sexo: Masculino
  • PHP Lover <3
    • Ver Perfil
    • Hobbitex
Re:Sistema PHP
« Respuesta #6 en: 12 de Octubre de 2010, 01:52:43 am »
respecto a las inyecciones, esta bien que uses las funciones dadas o simplemente mysql_real_escape_string();
Mira un ejemplo de como hackearte tan facil es este

$us
=$_POST[&#39;usuario&#39;];
$pass=$_POST[&#39;pass&#39;];
$sql="SELECT * FROM usuarios WHERE user = &#39;$us&#39; AND password=&#39;$pass&#39;";
if(
mysql_fetch_array($exc)){
echo 
"Inicio de sesión correcto"// Esto fue modificado
}

No esta protegido y si solo yo entro un usuario registrado y en pass pongo
' OR ''='
Ya meti la inyeccion, como?
el codigo queda
SELECT * FROM usuarios WHERE user = 'Algo' AND password='' OR ''=''
Algo seria nuestro user...
como lo evitamos?

$us
=mysql_real_escape_string($_POST[&#39;usuario&#39;]);
$pass=mysql_real_escape_string($_POST[&#39;pass&#39;]);
$sql="SELECT * FROM usuarios WHERE user = &#39;$us&#39; AND password=&#39;$pass&#39;";
if(
mysql_fetch_array($exc)){
echo 
"Inicio de sesión correcto"// Esto fue modificado
}

Explico, la funcion mysql_real_escape_string(); hace lo siguiente:
Escapa caracteres especiales de una cadena para su uso en una sentencia SQL
Para mas informacion:
http://www.php.net/mysql_real_escape_string
Saludos;
« Última modificación: 12 de Octubre de 2010, 01:57:58 am por Francisco »
Programando y ayudando rn PHP.

Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Re:Sistema PHP
« Respuesta #7 en: 12 de Octubre de 2010, 02:14:09 am »
$us=mysql_real_escape_string($_POST['usuario']);
$pass=mysql_real_escape_string($_POST['pass']);
$sql="SELECT * FROM usuarios WHERE user = '$us' AND password='$pass'";

Realmente esta es la forma más segura de hacerlo?

Desconectado lalitros

  • PHPer@ Fijo
  • ***
  • Mensajes: 162
  • Karma: 3
  • Sexo: Masculino
    • Ver Perfil
Re:Sistema PHP
« Respuesta #8 en: 12 de Octubre de 2010, 05:28:51 am »
Coincido con francisco! Leete lo de mysql_real_scape_string

Si me dieran a escojer entre el MUNDO y Tu.. Te escojeria a Ti, porque mi MUNDO ERES TU

Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Re:Sistema PHP
« Respuesta #9 en: 12 de Octubre de 2010, 10:16:46 am »
Sí sí, ya me lo había mirado pero digo si así es la forma más segura, usando doble comillas $sql="SELECT ...
En cuánto a los archivos config.php e install.php, se que no son nada del otro mundo (son sencillos) pero se podrían mejorar?

He pensado realizar todo esto orientado a objetos y así poderlo hacer más reutilizable, a ver que tal sale...
« Última modificación: 12 de Octubre de 2010, 16:02:26 pm por C-ChacK »

Desconectado Tope

  • PHPero Experto
  • *****
  • Mensajes: 540
  • Karma: 23
  • Sexo: Masculino
  • Programador PHP
    • Ver Perfil
    • www.Info-Keko.Es
Re:Sistema PHP
« Respuesta #10 en: 15 de Octubre de 2010, 15:58:14 pm »
Lo primero es que Kevin Wronski se confundió, no es strip_slashes() es stripslashes().

Y segundo, se puede usar mysql_real_escape_string() o addslashes() que hacen lo mismo.

Tanto mysql_real_escape_string como addslashes, añaden barras invertidas donde encuentre una comilla (simple o doble).
Si tenemos el texto: este' es un ejemplo"
Se convertirá a: este\' es un ejemplo\"

Con lo cual si antes de ejecutar cualquier consulta (o incluir cualquier cualquier archivo usando GET..) ponemos addslashes evitaremos cualquier inyección ^^
Un Saludo, Tope >> Programador FIJO en PHPeros

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Sistema PHP
« Respuesta #11 en: 16 de Octubre de 2010, 01:04:48 am »
Y segundo, se puede usar mysql_real_escape_string() o addslashes() que hacen lo mismo.

Tanto mysql_real_escape_string como addslashes, añaden barras invertidas donde encuentre una comilla (simple o doble).
Si tenemos el texto: este' es un ejemplo"
Se convertirá a: este\' es un ejemplo\"

Con lo cual si antes de ejecutar cualquier consulta (o incluir cualquier cualquier archivo usando GET..) ponemos addslashes evitaremos cualquier inyección ^^

En realidad no son iguales: addslashes no evita cualquier inyección.
Ojo: http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string

Saludos!
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Sistema PHP
« Respuesta #12 en: 17 de Octubre de 2010, 12:40:08 pm »
Yo siempre trato de trabajar por get mediante numeros. Si es verdad que tengo que hacer mas codigo para trabajar con numeros pero así logro
que sea casi imposible un hack mediante SQLi.

Lo que hago es que si por ejemplo, tengo que hacer esto: index.php?buscar=siquillote, hago un script para que trabaje con esta URL:
index.php?buscar=45 (Buscar mediante la ID del usuario). Mas tarde, con la ayuda de la funcion is_numeric, compruebo si el buscar sea numero
y no texto de esta forma:


$get 
$_GET[&#39;buscar&#39;];
if($get and is_numeric($get)){ // Si existe el parametro buscar y es numero...
    // Aquí ya haces tu código...
} else {
    echo &
#39;¿Me querías hacer SQLi? xDD&#39;;
}

#Fdo. Physlet

Desconectado C-ChacK

  • PHPer@ Fijo
  • ***
  • Mensajes: 147
  • Karma: 3
  • --] chacKos [--
    • Ver Perfil
Re:Sistema PHP
« Respuesta #13 en: 12 de Noviembre de 2010, 18:25:53 pm »
Cambiando un poco el tema, he pensado en hacer el sistema de la siguiente forma, si tenemos una url asi index.php?buscar=45 y luego mediante:

Código: [Seleccionar]
RewriteEngine on
RewriteRule ^index.php/([^/]+)/([^/]+)/index.php?buscar=45  [NC]

Url normal: index.php?buscar=45
Modificada: index.php/45

De esta forma la url es más amigable y mejora el SEO no?
Qué os parece?

PD: No se si la expresión regular está bien

Desconectado caha

  • PHPer@ Fijo
  • ***
  • Mensajes: 111
  • Karma: 0
    • Ver Perfil
Re:Sistema PHP
« Respuesta #14 en: 31 de Octubre de 2011, 18:28:26 pm »