Foros del Web » Programando para Internet » PHP »

¿Problemas de servidor?

Estas en el tema de ¿Problemas de servidor? en el foro de PHP en Foros del Web. Hola, estoy creando un proyecto, y para ello necesito un sistema de noticias. Me iba todo bien, iba haciéndolo a mi ritmo, pero lo fui ...
  #1 (permalink)  
Antiguo 05/02/2011, 18:37
 
Fecha de Ingreso: enero-2011
Ubicación: Internet
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Pregunta ¿Problemas de servidor?

Hola,

estoy creando un proyecto, y para ello necesito un sistema de noticias. Me iba todo bien, iba haciéndolo a mi ritmo, pero lo fui dejando de lado hasta que ayer me puse de nuevo.

Sin tocar nada, corrí el script en el server local (localhost) desde Wamp Server y me daba un error, que lo pondré más adelante. Pero después, lo corría en otro servidor, un free server y no me salía ningún error, no sé si será porque se ha cambiado la configuración de PHP o yo que sé. Primero, el código de la página es este:
Código PHP:
Ver original
  1. <?php
  2. // Página para mostrar las noticias que tenemos en la base de datos.
  3. // Incluimos el archivo de conexión, en este caso conect.php
  4. include("conect.php");
  5. include("cat.php");
  6. ?>
  7. <!-- Creamos el div de las noticias -->
  8. <div style="float:left;width:50%;">
  9. <?php
  10.  
  11. // Mostramos un titulo
  12. echo "<h1>Noticias</h1><br />";
  13. // Seleccionamos los datos de la base de datos.
  14. $select = mysql_query("select * from noticias $where order by ID_noticias DESC", $conectar);
  15. // Hacemos el array de todas las celdas de la tabla de noticias.
  16. while ($not = mysql_fetch_array($select)){
  17. // Mostramos el título, hipervinculado a otra página donde se motrarán los comentarios.
  18. echo "<a href=m.php?id=$not[ID_noticias]><h1>$not[titulo]</h1></a>";
  19. // Mostramos el contenido de la noticia.
  20. echo nl2br($not['noticia'])."<br /><br /> Posteado por $not[autor] el $not[fecha] a las $not[hora]";
  21. // Hacemos un select para comprobar si el usuario está logueado o no y mostrar o no las opciones de editar o borrar.
  22. $slctsgrdd = mysql_query("select count(USR_id) from usuarios where nick_usr = '$_COOKIE[nick]' or email_usr = '$_COOKIE[email]' or pass_usr = '$_COOKIE[pass]'")or die(mysql_error);
  23. // Si la cookie, tiene el mismo valor que el de la celda de la BD, significará que está logueado, si la cookie está "vacía" significará que no está logueado.
  24. if(mysql_result($slctsgrdd,0,0)){
  25. if($_COOKIE['nick'] == $not['autor'] or $_COOKIE['rango'] == 1){
  26. echo " || <a href=editnot.php?id=$not[ID_noticias]>Editar</a> || <a href=borrar.php?id=$not[ID_noticias]>Borrar</a>.";
  27. }
  28. }
  29. echo "<br /><br />";
  30. }
  31. ?>

El error es el siguiente:
Cita:
Notice: Undefined index: nick in C:\wamp\www\SistemaNoticias\index.php on line 28
La línea 28 es la siguiente:
Código PHP:
$slctsgrdd mysql_query("select count(USR_id) from usuarios where nick_usr = '$_COOKIE[nick]' or email_usr = '$_COOKIE[email]' or pass_usr = '$_COOKIE[pass]'")or die(mysql_error); 
ATENCIÓN: El error me da cuando aún no se ha iniciado NUNCA sesión en el sistema, ya que no existen las variables, por eso probé a usar un if y la función isset, para que solo corriera la función si las cookies 'nick', 'email' y 'pass' estaban definidas, pero aún así me sale el error.

Si el usuario ya ha iniciado sesión en el sistema, no sale ningún error, ya que aunque este cierre sesión, seguirán existiendo las cookies mencionadas anteriormente, aunque vacías, pero seguirán estando creadas.

Muchas gracias a los usuarios de Foros del Web por la ayuda que prestan, gracias por adelantado.

Última edición por erikcf; 05/02/2011 a las 18:58
  #2 (permalink)  
Antiguo 05/02/2011, 19:19
 
Fecha de Ingreso: octubre-2009
Mensajes: 245
Antigüedad: 14 años, 6 meses
Puntos: 17
Respuesta: ¿Problemas de servidor?

Código PHP:
Ver original
  1. "select count(USR_id) from usuarios where nick_usr = '$_COOKIE['nick']' or email_usr = '$_COOKIE['email']' or pass_usr = '$_COOKIE['pass']'"

El erro es claro no existe un indice con nick, te faltaron las comillas.
__________________
Saludos.
  #3 (permalink)  
Antiguo 05/02/2011, 19:28
 
Fecha de Ingreso: enero-2011
Ubicación: Internet
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: ¿Problemas de servidor?

Cita:
Iniciado por JaimeSavines Ver Mensaje
Código PHP:
Ver original
  1. "select count(USR_id) from usuarios where nick_usr = '$_COOKIE['nick']' or email_usr = '$_COOKIE['email']' or pass_usr = '$_COOKIE['pass']'"

El erro es claro no existe un indice con nick, te faltaron las comillas.
Cuando la variable está encerrada entre comillas dobles (") no se deben poner comillas individuales (').
Si fuera como tú dices, sería:
Código PHP:
Ver original
  1. "select count(USR_id) from usuarios where nick_usr = '".$_COOKIE['nick']."' or email_usr = '".$_COOKIE['email']."' or pass_usr = '".$_COOKIE['pass']."'"
  #4 (permalink)  
Antiguo 05/02/2011, 20:11
 
Fecha de Ingreso: junio-2008
Mensajes: 131
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: ¿Problemas de servidor?

Puede quedar asi:

Código:
$slctsgrdd = mysql_query("select count(USR_id) from usuarios where nick_usr = '{$_COOKIE['nick']}' or email_usr = '{$_COOKIE['email']' or pass_usr = '{$_COOKIE['pass']}'")or die(mysql_error);

                                                                                 .
El problema es que no existe un indice nick (sin comillas). Lo de poner comillas dentro de comillas lo solucionas usando la interpolacion con las llaves: {$array['indice']}
  #5 (permalink)  
Antiguo 06/02/2011, 05:58
 
Fecha de Ingreso: enero-2011
Ubicación: Internet
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: ¿Problemas de servidor?

Cita:
Iniciado por Charlii Ver Mensaje
Puede quedar asi:

Código:
$slctsgrdd = mysql_query("select count(USR_id) from usuarios where nick_usr = '{$_COOKIE['nick']}' or email_usr = '{$_COOKIE['email']' or pass_usr = '{$_COOKIE['pass']}'")or die(mysql_error);

                                                                                 .
El problema es que no existe un indice nick (sin comillas). Lo de poner comillas dentro de comillas lo solucionas usando la interpolacion con las llaves: {$array['indice']}
Eso que cuentas no lo sabía. Ya aprendí algo. :P

Bueno, probé lo que mencionas, pero sigue sin funcionar, el problema es cuando alguien no ha generado ninguna Cookie en el sitio aún, ya sea porque es su primera visita o porque ha limpiado sus datos de navegación, le sale el error.

Es por eso que creo que con un simple if debería solucionarse, pero no es así. Ya lo probé y no funciona...
  #6 (permalink)  
Antiguo 06/02/2011, 06:34
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 2 meses
Puntos: 16
Respuesta: ¿Problemas de servidor?

Los "Notice", es recomendable solucionarlos siempre, aunque en la mayoría de los casos se quedan en un aviso sin consecuencias.

Por ejemplo, en tu caso, esa query la deberías hacer única y exclusivamente si dispones de las cookies que pides para ella. Con un if, lo solucionarías.

A las malas, y si ya lo tienes protegido y la aplicación te funciona sin problemas, podrías ocultar los mensajes Notice (que será lo que ocurra en el hosting que comentas). Hay dos formas de ocultarlo, a través de la configuración del PHP, o utilizando la función error_reporting.

Por cierto, y como consejo de seguridad, te recomiendo escapar SIEMPRE las cadenas que puedan ser modificadas por el cliente (cookies, get, post...) y que utilices para querys:
http://www.php.net/manual/es/functio...ape-string.php
  #7 (permalink)  
Antiguo 06/02/2011, 06:50
 
Fecha de Ingreso: enero-2011
Ubicación: Internet
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: ¿Problemas de servidor?

Cita:
Iniciado por WeSoRz Ver Mensaje
Los "Notice", es recomendable solucionarlos siempre, aunque en la mayoría de los casos se quedan en un aviso sin consecuencias.

Por ejemplo, en tu caso, esa query la deberías hacer única y exclusivamente si dispones de las cookies que pides para ella. Con un if, lo solucionarías.

A las malas, y si ya lo tienes protegido y la aplicación te funciona sin problemas, podrías ocultar los mensajes Notice (que será lo que ocurra en el hosting que comentas). Hay dos formas de ocultarlo, a través de la configuración del PHP, o utilizando la función [URL="http://es2.php.net/manual/es/function.error-reporting.php"]error_reporting[/URL].

Por cierto, y como consejo de seguridad, te recomiendo escapar SIEMPRE las cadenas que puedan ser modificadas por el cliente (cookies, get, post...) y que utilices para querys:
[url]http://www.php.net/manual/es/function.mysql-real-escape-string.php[/url]
Sé que con un if lo solucionaría, lo intento pero no se me soluciona, tengo lo siguiente:
Código PHP:
while ($not mysql_fetch_array($select)){
// Mostramos el título, hipervinculado a otra página donde se motrarán los comentarios.
echo "<a href=m.php?id=$not[ID_noticias]><h1>$not[titulo]</h1></a>";
// Mostramos el contenido de la noticia.
echo nl2br($not['noticia'])."<br /><br /> Posteado por $not[autor] el $not[fecha] a las $not[hora]";
if(isset(
$_COOKIE['nick']) && $_COOKIE['email'] && $_COOKIE['pass']){
// Hacemos un select para comprobar si el usuario está logueado o no y mostrar o no las opciones de editar o borrar.
$slctsgrdd mysql_query("select count(USR_id) from usuarios where nick_usr = '{$_COOKIE['nick']}' or email_usr = '{$_COOKIE['email']}' or pass_usr = '{$_COOKIE['pass']}'")or die(mysql_error);
// Si la cookie, tiene el mismo valor que el de la celda de la BD, significará que está logueado, si la cookie está "vacía" significará que no está logueado.
if(mysql_result($slctsgrdd,0,0)){
if(
$_COOKIE['nick'] == $not['autor'] or $_COOKIE['rango'] == 1){
echo 
" || <a href=editnot.php?id=$not[ID_noticias]>Editar</a> || <a href=borrar.php?id=$not[ID_noticias]>Borrar</a>.";
}
}
echo 
"<br /><br />";
}

El if es el siguiente:
Código PHP:
if(isset($_COOKIE['nick']) && $_COOKIE['email'] && $_COOKIE['pass']) 
Y sobre la función que mencionas de escapar las querys, no entendí lo que me quieres decir, no sé como usarla, ya miré la documentación, pero no entendí mucho.

Muchas gracias.

EDITO: Ya lo solucioné, el problema es que abría el index.php desde la copia de seguridad, no desde la carpeta www del servidor.
  #8 (permalink)  
Antiguo 06/02/2011, 07:19
 
Fecha de Ingreso: enero-2007
Mensajes: 146
Antigüedad: 17 años, 2 meses
Puntos: 16
Respuesta: ¿Problemas de servidor?

Lo de escapar cadenas es para evitar SQL Injection. Te recomiendo que mires artículos sobre el asunto. Básicamente, y contando por encima, la inyección consiste en modificar las querys variando su sintaxis con, en la mayoría de los casos, operaciones lógicas.

Para protegerte de eso, sería tan sencillo como hacer lo siguiente (en tu caso):
Código PHP:
Ver original
  1. 1.
  2.       "select count(USR_id) from usuarios where nick_usr = '".mysql_real_escape_string($_COOKIE['nick'])."' or email_usr = '".mysql_real_escape_string($_COOKIE['email'])."' or pass_usr = '".mysql_real_escape_string($_COOKIE['pass'])."'"
  #9 (permalink)  
Antiguo 06/02/2011, 07:39
 
Fecha de Ingreso: enero-2011
Ubicación: Internet
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: ¿Problemas de servidor?

Cita:
Iniciado por WeSoRz Ver Mensaje
Lo de escapar cadenas es para evitar SQL Injection. Te recomiendo que mires artículos sobre el asunto. Básicamente, y contando por encima, la inyección consiste en modificar las querys variando su sintaxis con, en la mayoría de los casos, operaciones lógicas.

Para protegerte de eso, sería tan sencillo como hacer lo siguiente (en tu caso):
Código PHP:
Ver original
  1. 1.
  2.       "select count(USR_id) from usuarios where nick_usr = '".mysql_real_escape_string($_COOKIE['nick'])."' or email_usr = '".mysql_real_escape_string($_COOKIE['email'])."' or pass_usr = '".mysql_real_escape_string($_COOKIE['pass'])."'"
wow, muchas gracias, era justo eso lo que buscaba, un ejemplo.
Muchas gracias.

Etiquetas: servidores
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




La zona horaria es GMT -6. Ahora son las 03:24.