Foros del Web » Programando para Internet » PHP »

script de seguridad en php

Estas en el tema de script de seguridad en php en el foro de PHP en Foros del Web. Hola, alguien conoce scripts que se encarguen de comprobar la seguridad de un parámetro pasado por un formulario, para evitar sql injection, http injection y ...
  #1 (permalink)  
Antiguo 07/07/2005, 13:45
 
Fecha de Ingreso: diciembre-2004
Mensajes: 165
Antigüedad: 13 años
Puntos: 1
script de seguridad en php

Hola, alguien conoce scripts que se encarguen de comprobar la seguridad de un parámetro pasado por un formulario, para evitar sql injection, http injection y demas? Me gustaria encontrar varios, para poder tomar más ideas sobre hacer uno propio lo más completo posible. Tambien me valen las funciones que useis o los scripts que useis

Gracias
  #2 (permalink)  
Antiguo 07/07/2005, 14:58
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 14 años
Puntos: 19
Index :

Código HTML:
<form action="control.php" method="POST">

	<table align="center" border=1 bordercolor="black" cellspacing="0">
	<tr>
	<td>
		<table border=0 align="center" cellspacing=0 width="350"> 
		<tr><td bgcolor="white">
			<table align="center" bgcolor="white">
				<tr><td><img src="images/llave.jpg"></td></tr>
				<tr>
			</table>
		</td>
		<td bgcolor="white">
			<table align="center" border=0 cellSpacing=0>
				<td align="center" width="200"
				<?if ($_GET["errorusuario"]=="si"){?>
					bgcolor=red><span style="color:ffffff"><b>Datos incorrectos</b></span>
				<?}else{?>
					bgColor=#cdcec1>Introduce tu clave de acceso
				<?}?>
				</td>
				</tr>
				<tr>
				<td align="center" bgColor="#cdcec1">
				<input type="text" name="usuario" size="10" maxlength="50"><br>
				<input type="password" name="clave" size="10" maxlength="50"><br>
				<input type="submit" value="LOGIN">
				</td>
				</tr>
				<tr>
				<td><font face="verdana" size=1><a href="recuperar.php">Olvido su contraseña?</a></font></td>	
				</tr>
				
			</table>
		</td>
		</tr>
		</table>
	</td>
	</tr>
	</table>
</form> 
Archivo control

Código PHP:
<?
include ("conectar.php");

if (
$_POST["usuario"]!="" && $_POST["clave"]!=""){
    
$usuario $_POST["usuario"];
    
$clave $_POST["clave"];
    
$sql "SELECT * FROM usuarios where usuario='$usuario' and clave='$clave'";
    
$res mysql_query($sql) or die("Error en la consult SQL: " mysql_error());
    if(
mysql_num_rows($res) > 0){
        
//session_start();
        
$_SESSION["autentificado"]= "SI";
        print 
"<meta http-equiv=Refresh content=\"3 ; url=panel.php\">"
    }else{
        print 
"<meta http-equiv=Refresh content=\"3 ; url=index.php?errorusuario=si\">";
    }
}
include (
"desconectar.php");
?>
En la cabecera de cada archivo que quiero proteger pongo esto

Código PHP:
<?include ("seguridad.php");?>
seguridad.php

Código PHP:
<?
//Inicio la sesión
session_start();

//COMPRUEBA QUE EL USUARIO ESTA AUTENTIFICADO
if ($_SESSION["autentificado"] != "SI") {
    
//si no existe, envio a la página de autentificacion
    
header("Location: index.php");
    
//ademas salgo de este script
    
exit();
}    
?>


A mi entender y al entender de varios este escript funciona correctamente y no se le puede inyectar codigo SQL ... por lo menos para es util ... y espero que te sea util ...
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!
  #3 (permalink)  
Antiguo 07/07/2005, 15:47
 
Fecha de Ingreso: diciembre-2003
Mensajes: 218
Antigüedad: 14 años
Puntos: 0
turco_7 , una pregunta.

Con este script, en un sitio con usuarios q se autentifiquen estos pueden inyectar no¿? O es q no me he fijado bien.
__________________
SymbianForever
SymbianForever.com, todo sobre y para tu symbian
aNieto2K | Themes para WordPress
De todo un poco
  #4 (permalink)  
Antiguo 08/07/2005, 05:40
 
Fecha de Ingreso: diciembre-2004
Mensajes: 165
Antigüedad: 13 años
Puntos: 1
pero si ese script no añade ninguna seguridad...

Hola

Ante todo gracias por responder. He mirado el código que has puesto, pero que yo sepa, en ese "seguridad.php" no se hace ningún reconocimiento de los caracteres introducidos, es decir yo como nombre de usuario podria hacer un sql injection probablemente en la forma:

"' union select * from usuarios"

(es un ejemplo ficticio, solo de ejemplo)

Yo me refiero a un script que haga una revisión de los parámetros pasados, para que por ejemplo no se pueda hacer ese "union" y cosas de ese estilo
  #5 (permalink)  
Antiguo 08/07/2005, 09:30
 
Fecha de Ingreso: abril-2005
Mensajes: 15
Antigüedad: 12 años, 7 meses
Puntos: 0
Para eso podes usar htmlentities() o stripslashes().

Stripslashes para que no tengas problemas de SQL Injection.

Htmlentities para que no tengas problemas de HTML Injection.
  #6 (permalink)  
Antiguo 08/07/2005, 10:14
Avatar de lado2mx
Colaborador
 
Fecha de Ingreso: agosto-2001
Ubicación: Veracruz
Mensajes: 3.720
Antigüedad: 16 años, 4 meses
Puntos: 9
Tambien para evitar eso, necesitarás que el usuario que estás usando para entrar a la base de datos, no use privilegios para modificar la base de datos mysql, o sea, la que modificas usuarios, privilegios, etcetera.
  #7 (permalink)  
Antiguo 08/07/2005, 12:07
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 14 años
Puntos: 19
No lo he probado, pero creo que deberias solucionarlo de esta manera ...

Usando la funcione mysql_escape_string($variable)

Ejemplo
Código PHP:
<?php
$item 
"Zak's Laptop";
$item_escapado mysql_escape_string($item);
printf("La cadena escapada: %s\n"$item_escapado);
?>
Resultados
Cita:
La cadena escapada: Zak\'s Laptop
Lo saque de aqui...
http://ar2.php.net/manual/es/functio...ape-string.php

Pero tengo entendido de que hay otra funcion que no te cambia el contenido de la variable .. en este caso " ' " por " \ ". Espero que te sea de utilidad, pero por lo pronto varias personas han intentado hacerle inyecion a mi codigo, pero no ha dado resultado. Segun mi criterio al momento de hacer la consulta podria hacer una comparacion de los resultados arrojado por la query y las variables que me trae el formulario ... date una idea de que no se puede hacer una inyecion en el codigo, ya que si lo hace, en mi DB yo no tengo datos cargados como este : id = 0, usr = "' union select * from usuarios" Asi por lo tanto nunca van a ser = y el intruso nunca tiene acceso ... me parece que de ese modo no tendrias que tener problemas ... Espero haberme explicado. Saludos


te invito a que lo pruebes : http://www.academiashtar.com.ar/admin
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!

Última edición por turco_7; 08/07/2005 a las 12:09 Razón: me olvide
  #8 (permalink)  
Antiguo 08/07/2005, 12:30
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 13 años, 9 meses
Puntos: 0
turco.... ese enlace http://www.academiashtar.com.ar/admin
es una web tuya?

se me ha quedado pillado con el comprobando usuario y password

pero a lo que iba.... ese grafico de donde lo has sacado.. me gustaria tener esa animacion si es posible (la que sale mientras está cargando)

saludos
  #9 (permalink)  
Antiguo 08/07/2005, 22:35
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 14 años
Puntos: 19
bajalo ...


http://www.academiashtar.com.ar/example/1.rar


Es mio lo hize yo .. se me ocurrio .. saludos ..
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!
  #10 (permalink)  
Antiguo 09/07/2005, 10:07
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 13 años, 9 meses
Puntos: 0
gracias tio!


una duda.... como se carga el objeto flash? como una imagen normal?

saludos
  #11 (permalink)  
Antiguo 09/07/2005, 23:33
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 14 años
Puntos: 19
Asi se incluye un SWF ... byebye

Código HTML:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="65" height="19">
    <param name="movie" value="1.swf">
    <param name="quality" value="high">
    <param name="menu" value="false">
    <embed src="1.swf" width="65" height="19" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" menu="false"></embed>
</object> 
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!
  #12 (permalink)  
Antiguo 10/07/2005, 04:26
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 13 años, 9 meses
Puntos: 0
gracias de nuevo, lo probaré

aunque viendo que hay que poner "codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"

me da que no me va a servir en un ordenador que no esté conectado a internet.

bueno lo probaré

saludos
  #13 (permalink)  
Antiguo 13/07/2005, 05:39
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 14 años, 3 meses
Puntos: 4
Pregunta

No entiendo muy bien como usar las funciones stripslashes() y addslashes(), ¿podriais explicarmelo con un breve ejemplo?

Gracias.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
  #14 (permalink)  
Antiguo 13/07/2005, 13:47
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 14 años
Puntos: 19
Este link corresponde a stripslashes();
http://ar2.php.net/manual/es/function.stripslashes.php

Este otro a htmlentities();
http://ar2.php.net/manual/es/function.htmlentities.php

Espero que te sirva saludos ..
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!
  #15 (permalink)  
Antiguo 13/07/2005, 20:49
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 12 años, 5 meses
Puntos: 2
addslashes() Modifica la cadena anteponiéndole una " \ " frente a los caracteres que lo necesiten para ser usados, por ejemplo, en base de datos.

stripslashes() Desmarca la cadena.

Aquí te demuestro con un ejemplo muy simple.
Código PHP:
<?

$cadena 
' Hola me llamo "Darío" y estoy respondiendo en el foro.';

$cadena_add addslashes($cadena);

$cadena_strip stripslashes($cadena_add);

echo 
$cadena_add."<br>".$cadena_strip;

?>
Esto imprimiría algo así.
Cita:
Hola me llamo \"Darío\" y estoy respondiendo en el foro.
Hola me llamo "Darío" y estoy respondiendo en el foro.
¿Observas como le antepone una \ frente a las comillas dobles? Básicamente sirve solamente para esto. Esto es importante como una medida más frente a la posibilidad de una inyección de SQL.

Saludos y espero que se allá entendido.
  #16 (permalink)  
Antiguo 15/07/2005, 08:34
Avatar de elangelcaido  
Fecha de Ingreso: septiembre-2003
Ubicación: Oviedo
Mensajes: 1.068
Antigüedad: 14 años, 3 meses
Puntos: 4
Bien, entiendo lo que hacen ambas funciones, pero ¿podrias ponerme un ejemplo del que hablas para hacer una consulta a una base de datos usando esas funciones?

Gracias.
__________________
Ta Luego! Al final sólo puede quedar uno...
________
lukos.org
  #17 (permalink)  
Antiguo 15/07/2005, 11:44
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 12 años, 5 meses
Puntos: 2
Hola, mirá un ejemplo real de SQL inyección no te puedo dar porque no me gusta SQL y tampoco se todo. Pero te puedo dar una orientación, por ejemplo siempre es bueno pasar las variables remotas (Get o post) por addslashes()cuando van directamente a una consulta SQL, porque es aquí donde se producen los ataques.
Por ejemplo: Los nombre de usuario y contraseña siempre van directo a la consulta SQL, la consulta puede ser esta:
Código:
SELECT * FROM usuario WHERE usuario='usuario_post' AND pass='pass_post'
Pero en la contraseña en vez de enviar la contraseña el atacante envia esto:
Código:
' OR 1='1
La consulta completa quedaria:
Código:
SELECT * FROM usuario WHERE usuario='usuario_post' AND pass='' OR 1='1'
Como 1=1 siempre da verdadero se podria logear con cualquier usuario, o en su defecto como administrador, para evitar que las comillas que son enviadas en la contraseña se pasa por addslashes() y las consulta quedaria:
Código:
SELECT * FROM usuario WHERE usuario='usuario_post' AND pass=' \' OR 1=\'1'
Ves que addslashes() le antepuso una \ a las comillas simples que fue enviado en lugar de la contraseña? Bueno despues de eso ese atanque queda totalmente inservible ya que con addslashes se marcaron las comillas simples y ahora todo eso se toma como un string y no dara por validado nunca.

PD: Seguramente hay muchos errores en el ejemplo, esto solamente fue una forma de representar lo que queria explicar.

Saludos y espero que allá sido claro. Suerte.
  #18 (permalink)  
Antiguo 15/07/2005, 12:21
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 13 años, 9 meses
Puntos: 0
pero tambien te ha cambiado el campo de la pass. no se loguearia no? aunque no sufrieras el ataque
  #19 (permalink)  
Antiguo 15/07/2005, 12:59
Avatar de turco_7  
Fecha de Ingreso: diciembre-2003
Ubicación: Córdoba, Argentina
Mensajes: 1.044
Antigüedad: 14 años
Puntos: 19
Para mi la mejor forma de evitar esto y si las funciones agregan o no una barra ... se me ocurre preguntar si los resultados que encontro son iguales a lo que habia en la caja de texto, caso contrario, no le permito el acceso, si vos me pones ' OR 1 = '1 no importa, vos si queres podes escribir una subconsulta, que nunca va a poder acceder, repito, ya que cuando termino de hacer la consulta, pregunto si los valores que encontre son los mismos que venian del FORM .. es simple... con eso no tengo problema ..saludos ...
codigo de ejemplo:

Código PHP:
if ($_POST["usuario"]!="" && $_POST["clave"]!=""){ 
    
$usuario $_POST["usuario"]; 
    
$clave $_POST["clave"]; 
    
$clave md5($clave);
    
$sql "SELECT * FROM usuarios where usuario='$usuario' and clave='$clave'"
    
$res mysql_query($sql) or die("Error en la consult SQL: " mysql_error()); 
    if(
mysql_num_rows($res) > 0){ 
        list(
$usr,$pwd) = mysql_fetch_array($res)
     if(
$usr == $usuario and $pwd == $clave){
        
//session_start(); 
        
$_SESSION["autentificado"]= "SI"
        print 
"<meta http-equiv=Refresh content=\"3 ; url=panel.php\">"
      }else{
                echo 
"El usuario o clave es incorrecta";
       }
   }else{ 
        print 
"<meta http-equiv=Refresh content=\"3 ; url=index.php?errorusuario=si\">"
    } 

Asi evitaria de que inyecten codigo SQL ... saludos
__________________
Mi Blog http://turco7.blogspot.com
Usuario Linux : 404289
Mi última página: http://www.digitalservicecba.com.ar - Reparacion de camaras digitales!

Última edición por turco_7; 15/07/2005 a las 13:06
  #20 (permalink)  
Antiguo 15/07/2005, 13:26
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 12 años, 5 meses
Puntos: 2
Cita:
Iniciado por cyborg
pero tambien te ha cambiado el campo de la pass. no se loguearia no? aunque no sufrieras el ataque
No, no se logearia...

Cita:
Iniciado por turco_7
Para mi la mejor forma de evitar esto y si las funciones agregan o no una barra ... se me ocurre preguntar si los resultados que encontro son iguales a lo que habia en la caja de texto, caso contrario, no le permito el acceso, si vos me pones ' OR 1 = '1 no importa, vos si queres podes escribir una subconsulta, que nunca va a poder acceder, repito, ya que cuando termino de hacer la consulta, pregunto si los valores que encontre son los mismos que venian del FORM .. es simple... con eso no tengo problema ..saludos ...
codigo de ejemplo:

Código PHP:
if ($_POST["usuario"]!="" && $_POST["clave"]!=""){ 
    
$usuario $_POST["usuario"]; 
    
$clave $_POST["clave"]; 
    
$clave md5($clave);
    
$sql "SELECT * FROM usuarios where usuario='$usuario' and clave='$clave'"
    
$res mysql_query($sql) or die("Error en la consult SQL: " mysql_error()); 
    if(
mysql_num_rows($res) > 0){ 
        list(
$usr,$pwd) = mysql_fetch_array($res)
     if(
$usr == $usuario and $pwd == $clave){
        
//session_start(); 
        
$_SESSION["autentificado"]= "SI"
        print 
"<meta http-equiv=Refresh content=\"3 ; url=panel.php\">"
      }else{
                echo 
"El usuario o clave es incorrecta";
       }
   }else{ 
        print 
"<meta http-equiv=Refresh content=\"3 ; url=index.php?errorusuario=si\">"
    } 

Asi evitaria de que inyecten codigo SQL ... saludos
Esta bien, tienes razon, tu forma es otra variante de seguridad, pero lo que yo esta tratando hacer, era dar un ejemplo practico de addslashes().
Yo lo que hago tambien es cuando se espera un valor entero verificarlo y tratar de convertirlo, si no se logra la converción es seguramente un ataque. Tambien trato de que los campos tengan un valor maximo de entrada, por ejemplo, el nombre de usuario lo seteo a 10 caracteres, y verifico cuando llega que no sea mayor a 10, si lo es no prosigo y aborto. En fin hay muchisimas cosas más para verificar. Saludos, y espero que participe mas personas que este thread es interesante.
  #21 (permalink)  
Antiguo 16/07/2005, 03:31
 
Fecha de Ingreso: febrero-2004
Ubicación: España. Madrid
Mensajes: 454
Antigüedad: 13 años, 9 meses
Puntos: 0
bueno..... quizas el addslashes, deberia bastar..... me refiero...... si pones como usuario o password algo normal que no vaya entre "" ni '' no añadirá nada no?
  #22 (permalink)  
Antiguo 22/07/2005, 17:16
 
Fecha de Ingreso: abril-2005
Mensajes: 15
Antigüedad: 12 años, 7 meses
Puntos: 0
Cita:
Iniciado por turco_7
Para mi la mejor forma de evitar esto y si las funciones agregan o no una barra ... se me ocurre preguntar si los resultados que encontro son iguales a lo que habia en la caja de texto, caso contrario, no le permito el acceso, si vos me pones ' OR 1 = '1 no importa, vos si queres podes escribir una subconsulta, que nunca va a poder acceder, repito, ya que cuando termino de hacer la consulta, pregunto si los valores que encontre son los mismos que venian del FORM .. es simple... con eso no tengo problema ..saludos ...
codigo de ejemplo:

Código PHP:
if ($_POST["usuario"]!="" && $_POST["clave"]!=""){ 
    
$usuario $_POST["usuario"]; 
    
$clave $_POST["clave"]; 
    
$clave md5($clave);
    
$sql "SELECT * FROM usuarios where usuario='$usuario' and clave='$clave'"
    
$res mysql_query($sql) or die("Error en la consult SQL: " mysql_error()); 
    if(
mysql_num_rows($res) > 0){ 
        list(
$usr,$pwd) = mysql_fetch_array($res)
     if(
$usr == $usuario and $pwd == $clave){
        
//session_start(); 
        
$_SESSION["autentificado"]= "SI"
        print 
"<meta http-equiv=Refresh content=\"3 ; url=panel.php\">"
      }else{
                echo 
"El usuario o clave es incorrecta";
       }
   }else{ 
        print 
"<meta http-equiv=Refresh content=\"3 ; url=index.php?errorusuario=si\">"
    } 

Asi evitaria de que inyecten codigo SQL ... saludos
mmm con eso solucionas que no se pueda autentificar, pero no solucionas el tema de que no te puedan hacer un sql injection, porque, yo pued inyectar algun sentencia, que haga que la consulta de error, y como consecuencia sacar info de la bd, o del servidor, etc. O sea, esta bien, nose van a poder loguear, pero no solucionas el tema de SQL Injection.

Ademas el SQL Injection no necesriamente puede estar en un formulario de login sino en cualquier lado que haga una consulta a una base de datos. Por lo que yo recomiendo siempre hacerles un addslashes() a cualquier campo que vaya a pasar por una consulta. Y si por ejemplo tenemos que guardar el registro para luego poder mostrarlo, le hariamos un addslashes() al momento de agregarlo, y cuando lo vayamos a imprimir le hacemos un stripslashes() que devolveria la cadena al formato original.

Y para evitar HTML Injection como ya dije puede usar htmlentities() que convierte todos los caracteres html en sus respectivas entidades, de manera tal que se impriman tal cual en la pagina, y que no puedan afectar al codigo html.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:14.