Foros del Web » Programando para Internet » PHP »

Seguridad en PHP

Estas en el tema de Seguridad en PHP en el foro de PHP en Foros del Web. Hace algún tiempo ya que programo en PHP (y utilizo MySQL como manejador de BBDD), nunca estuve demasiado involucrado en la seguridad web, me gustaría ...
  #1 (permalink)  
Antiguo 24/09/2007, 22:12
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 19 años, 4 meses
Puntos: 28
Seguridad en PHP

Hace algún tiempo ya que programo en PHP (y utilizo MySQL como manejador de BBDD), nunca estuve demasiado involucrado en la seguridad web, me gustaría saber que cosas o puntos fuertes debemos tener en cuenta.

Por ejemplo, protegernos contra Inyección de código SQL, controlar los tipos de archivos que se suben en un upload, y que más...?


Se escuchan ideas de Cosas a tener en cuenta para un script PHP seguro...


Saludos, espero que alguien se sume a tirar algunas cosas a tener en cuenta

__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #2 (permalink)  
Antiguo 25/09/2007, 06:39
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Re: Seguridad en PHP

Uffff, por dónde empezar...

register_globals OFFFFFFFFFFFFFFFFFFFFFFFFFF
Creo que a estas alturas ya debería ser obvio, pero sigue habiendo gente que hace que sus programas dependan de eso.

Controlar inyección de cabeceras en formularios de correo:
No permitir caracteres \r o \n en campos que deberían ser de 1 sola línea ("asunto", "de", etc).

NO confiar en el usuario:
El programa tiene que considerar cualquier interacción con el "mundo exterior" como peligrosa y no confiable. Creo que esta es la "regla de oro"...


Usar transacciones en las BD
Tenemos que hacer todo lo que esté a nuestro alcance a la hora de mantener la integridad de los datos, las transacciones son una buena forma. Las tablas MyISAM de MySQL no soportan transacciones, pero sí las soportan las tablas InnoDB. Si hay que hacer varias "guardadas", mejor juntarlas en una transacción.

Eso se me ocurre por ahora...
  #3 (permalink)  
Antiguo 25/09/2007, 10:05
Avatar de nicolaspar  
Fecha de Ingreso: noviembre-2004
Ubicación: Villa Ballester Bs-As|Ar
Mensajes: 2.002
Antigüedad: 20 años
Puntos: 34
Re: Seguridad en PHP

Tenes muuucho a tener en cuenta, pero inicialmente, contestándote:
1- protegernos contra Inyección de código SQL,
2- controlar los tipos de archivos que se suben en un upload
.

1- Lo mejor es usar las funciones que te da, en este caso, mysql (en si la dll de php que conecta con la db). Hay funciones como mysql_real_escape_string con eso ya estarías cubierto.

2- Como general y básico usa los headers propios de los archivos NO valides jamás por extensión, si es imagen/flash tenes la dg, sino siempre hay algun script que ayude (ej, para leer un mp3, o un doc).

Y como dice alvin, nunca hay que confiar en el usuario pero con tener los datos de entrada controlados contra sql inyección y xss ya estas dando un gran paso.
__________________
Mi punto de partida es Que Bueno Lo Nuevo
  #4 (permalink)  
Antiguo 26/09/2007, 11:24
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 19 años, 4 meses
Puntos: 28
Re: Seguridad en PHP

Muchas gracias a ambos por las ideas y consejos, encontré por ahí una función (que adjunto abajo) para hacer segura una consulta a BBDD, simplemente usandola ya estaría protegido contra cualquier tipo de injección de SQL, verdad?

Código PHP:
function limpiar_sql($var) {
$var addslashes(trim($variable));
return 
$var;

__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #5 (permalink)  
Antiguo 26/09/2007, 12:40
Avatar de Seppo  
Fecha de Ingreso: marzo-2005
Ubicación: Buenos Aires, Argentina
Mensajes: 1.284
Antigüedad: 19 años, 8 meses
Puntos: 17
Re: Seguridad en PHP

Cita:
Iniciado por Anarninquë Ver Mensaje
Muchas gracias a ambos por las ideas y consejos, encontré por ahí una función (que adjunto abajo) para hacer segura una consulta a BBDD, simplemente usandola ya estaría protegido contra cualquier tipo de injección de SQL, verdad?

Código PHP:
function limpiar_sql($var) {
$var addslashes(trim($variable));
return 
$var;

En vez de addslashes deberías usar *_escape_string, que es mejor para bases de datos, si es Mysql mysql_real_escape_string
  #6 (permalink)  
Antiguo 26/09/2007, 17:54
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 19 años, 4 meses
Puntos: 28
Re: Seguridad en PHP

Así que esta sería nuestra función para prevenir sql inyections:

Código:
function limpiar_sql($var) {
$var = mysql_real_escape_string(trim($variable));
return $var;
}
Correcto? alguna sugerencia mejor?

Digo para dejar plasmada una linda solución (para que sirva mas que a mi a todos los que en algún momento lleguen a este post )
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #7 (permalink)  
Antiguo 26/09/2007, 20:40
Avatar de hgp147  
Fecha de Ingreso: diciembre-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 980
Antigüedad: 17 años, 10 meses
Puntos: 36
Re: Seguridad en PHP

Hola Anarninquë, encontre estos articulos de seguridad para PHP:

http://64.233.169.104/search?q=cache...hp_seguridad_I

http://64.233.169.104/search?q=cache...p_seguridad_II

http://64.233.169.104/search?q=cache..._seguridad_III
  #8 (permalink)  
Antiguo 26/09/2007, 22:25
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 19 años, 4 meses
Puntos: 28
Re: Seguridad en PHP

Gracias hgp147 por enviar esos artículos, lamentablemente no me permite cargarlos :s si los tienes en tu pc me los enviarías por e-mail?

Aprovechando para continuar con los temas de seguridad en php, consulto sobre que precausiones habría que tomar en cuenta a la hora de hacer una conexión a la base de datos, yo muchas veces tengo un archivo que incluyo en las páginas en el que me conecto de la forma mas "común y simple":

Código PHP:
$db_conect mysql_connect (HOSTUSUARIOPASSWORD) or die ('Error al intentar establecer una conexión con la base de datos. ' mysql_error());
mysql_select_db (BASE_DE_DATOS); 
Mi duda es si sería recomendable hacerlo de alguna otra manera más segura, y en el caso de haberla, cuál?




Saludos, comento que mi idea es al final de este thred hacer una recopilación de varios consejos y tips de seguridad a la hora de programar

Incluso se podría poner como una FAQ


Saludos
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
  #9 (permalink)  
Antiguo 27/09/2007, 02:53
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 20 años
Puntos: 48
Re: Seguridad en PHP

display_errors 0 - no hay que dar pistas al enemigo

log_errors 1 - pero tienes que poder ver los mensajes de error

usar trigger_error() en lugar de die() para registrar los errores de ejecucion.
Código PHP:
$db_conect mysql_connect (HOSTUSUARIOPASSWORD);
if (
false===$db_connect) {
// si se puede recuperar, recuperar
// si se quiere mostrar algo en pantalla, mostrar
// pero para que se registre el error, trigger_error
  
trigger_error ('Error al intentar establecer una conexión con la base de datos. ' mysql_error(), E_USER_ERROR);
}
mysql_select_db (BASE_DE_DATOS); 
  #10 (permalink)  
Antiguo 28/09/2007, 17:41
Avatar de Anarninquë
Colaborador
 
Fecha de Ingreso: julio-2005
Ubicación: MVD | Uruguay
Mensajes: 1.096
Antigüedad: 19 años, 4 meses
Puntos: 28
Re: Seguridad en PHP

Muchas gracias DarkJ por el consejo, una pregunta, cual es bien la salida de trigger_error?


Me explico, que genera? supongo que nada por pantalla, genera un archivo con el log en el server? dónde?

Gracias por la info!
__________________
Marcelo Ferreiro - Desarrollador Web
Mi Web - Pixelar.me
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.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 13:09.