Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - Txapu

Páginas: [1] 2
1
PHP / Re: [D] Impedir que se repitan los mismos valores. (Leer mas)
« en: 13 de Agosto de 2007, 13:19:46 pm »
Yo hago una extracción  a la base de datos de un sistema de mensajería  que estoy haciendo, entonces hago un SELECT a la tabla de mensajes para extraer  los nicks  de los usuarios que escribieron en los últimos  10 minutos, pero quisiera que no se repitan los nicks.

Es decir si Blackenger publico 2 mensajes en los últimos minutos no quiero que aparezca el nick 2 veces, solo que se muestre una vez.

El código por el momento luce así


$query 
"SELECT * FROM `mensajes` ORDER BY nick LIMIT 100";
$rest = @mysql_query($query);
while(
$info = @mysql_fetch_array($rest)){

echo 
"<table>";
echo 
"<td>".$info[&#39;nick&#39;]."</td>";
echo "</table>";
}


¿Que función o cadena debo utilizar para que los nicks no se repitan?


Saludos.

Lo suyo seria usar el "group by" en la select. Si nos pasas el listado de campos del que esta compuesta la tabla, puedo hacerte la select...

Otra cosa: si quieres mostrar los ultimos 10 minutos deberias tener un campo fecha/hora en esa tabla, de lo contrario solo podremos mostrar los 10 últimos registros

Saludos, M

2
PHP / Re: Codigo que no funciona...
« en: 02 de Agosto de 2007, 21:07:25 pm »
Perdon por no contestar antes, tengo mi pc fastidiado (estoy escribiendo desde el curro :P)

Pero si cambio las barras por contrabarras no las confunidira o algo? Porque ya uso barras y contrabarras... :S

Usas barras y/o contrabarras para el nombre archivo??

Seguramente ya lo habras hecho, pero por si las moscas te paso otra posible solucion:
Si donde lo estas subiendo es un linux, asegurate que el directorio donde se copia el archivo existe y tiene permisos de lectura, escritura y ejecucion para todos (por si las moscas, luego si quieres vas quitandole permisos...): "777"

Si usas un hosting, al igual tienen capada esa funcion, o no se ha especificado un directorio temporal valido en su php.ini (creo que era algo como "upload_tmp_dir = [algo]")

Saludos,
M

3
PHP / Re: Codigo que no funciona...
« en: 31 de Julio de 2007, 01:26:52 am »
A mi me funciona, lo que he tenido que añadir una linea que no esta en el codigo que has publicado (seguramente se te habrá escapado :P)

Código: [Seleccionar]
$archivo = $HTTP_POST_FILES['archivo']['tmp_name'];
Mi php esta montado sobre un linux. Si usas win, al igual debes cambiar la barra "/" por una contrabarra "\" (ahora no se me ocurre nada mas...)

4
PHP / Re: Una pequeña duda...
« en: 05 de Julio de 2007, 19:53:45 pm »
Prueba con la funcion javascript:submit()

Algo como:
Código: [Seleccionar]
<input name="xxxxxxxx" type="radio" onClick="javascript:submit()" value="xxxxxxx"> ...y lo que vaya a continuacion...
Saludos,
M

5
PHP / Re: buenas... necesito ayuda sobre un pequeño script avanzado...
« en: 01 de Julio de 2007, 22:17:58 pm »
Tambien puedes usar esta query:
SELECT * FROM tabla ORDER BY RAND() LIMIT 1;

Asi te ahorras 1 consulta :P

Saludos,
M

6
PHP / Re: [D] recoger valor de un formulario
« en: 27 de Junio de 2007, 13:58:03 pm »
El problema esta en el isset(), que se usa para ver si se ha declarado la variable
Yo emplearia empty() en vez de isset(), pues la variable siempre estara declarada y lo que nos interesa es saber si esta vacio el campo

Saludos,
M

7
Yo quiero evitar todo tipo de hackeo

Pues en ese caso debes tener en cuenta tanto lo que dice naveda como lo que te dije yo, ya que son 2 cosas distintas.

Saludos,
M

8
PHP / Re: [Petición] Código para el pfUsers
« en: 25 de Junio de 2007, 21:02:53 pm »
Un reto interesante!  ;D

Lo que yo haría sería añadir un campo a la tabla de usuarios para registrar la última vez que se comprobaron los mensajes para un usuario en concreto.

Por otro lado hacer una funcion tipo ajax que haga consultas a la bdd cada x segundos y si el campo que he dicho antes es menor que los que se compararan con la tabla de mensajes, y para el usuario en concreto, abrir un popup (como ha dicho G2K) haciendo referencia a ese mensaje nuevo. Se podria usar los Ids de los mensajes nuevos como respuesta del ajax y podria ser el trigger para el popup (si no devuelve nada, no dispara el popup).

Despues de cada ejecucion del ajax, actualizar el nuevo campo que he dicho antes con la fecha de actualizacion.

EDITO: No habia leido la 2a pagina del tema :P

Yo no me basaria en los mensajes no leidos, pues estaria el popup dando por c*** hasta que no leyeras todos los mensajes que tienes pendientes...

Saludos,
M

9

Pero alguien hizo algo para limpiar los datos que entran por formulario para filtrarlos y que cuando se suba a la base de datos o algo pues que no se pueda eliminar datos de la base de datos ni nada...

No se si me entiendes xDDD

Mmmm... eso me suena... xDDD

Creo que estas algo confundido:
Naveda te esta explicando como evitar el HTML injection y lo que te expliqué yo era SQL injection.

Saludos,
M

10
PHP / Re: Mostrar datos base de datos
« en: 18 de Junio de 2007, 20:34:37 pm »
[..........]
Eso ya lo se ;) porque es solo un unico dato, pero si son 2 o más? :O

Pues separas las condiciones con parentesis y añades AND u OR segun te interese, por ejemplo:
SELECT [Campos_Separados_Por_Comas_o_Asterisco]
FROM [Tabla/s]
WHERE ((( [Condicion1] ) AND ( [Condicion2] ) AND ( [Condicion3] )) OR ( [Condicion4] ))
ORDER BY [Campo_A_Ordenar]

Saludos,
M

11
PHP / Re: Creando un foro
« en: 18 de Junio de 2007, 20:28:30 pm »

[....................]

Si por ejemplo quieo hacer una consulta a tal mensaje con tal id como id es numerico hago eso de:

if (isset($_GET['numero']) && ($_GET['numero'] != '') && is_numeric($_GET['numero']) {
   $Pnumero = limpiain($_GET['numero']);
}

y luego la consulta con envez de $_GET['numero'] utilizo a variable $Pnumero??

Exacto, pero eso lo debes hacer con cualquier variable. Una cosa que me he fijado ahora es que es absurdo hacer el limpiain a un campo numérico, ya que no se puede hacer SQLinjection poniendo unicamente numeros: ten encuenta el is_numeric ya descarta todo lo que no sea exclusivamente numerico. Ya estoy cambiando todos mis scripts...  :P

Y cuando sea para mensajes privados, o el foro o cualquier cosa de estas deberia utilizar este codigo:?

Sipe. Como norma general: usa la funcion limpiain para todas las variables de texto (ni binarias, ni numericas, solo cadenas o ficheros que sólo contengan texto), y pasa siempre cada una de las variables que vengan del exterior (tipo $_POST, $_GET) a una nueva (sean del tipo que sean).

Si tienes mas dudas, ya sabes  ;)
Saludos, M

12
PHP / Re: Mostrar datos base de datos
« en: 17 de Junio de 2007, 12:03:28 pm »
No he podico probarlo, pero creo que con esta select ya lo tendrias:

SELECT * FROM `nombredelatabla`
WHERE ((SELECT COUNT(*) FROM 'nombredelatabla' WHERE ('usuario' = 'Paquito') AND ('usuario' = 'Grupo')) >= 'NumeroDeMensajes')
ORDER BY `id` DESC"

Saludos,
M

13
PHP / Re: Creando un foro
« en: 17 de Junio de 2007, 11:51:23 am »
Si, si no te sabe mal pasame el codigo para evitar SQLinjection ;)

segun la Wiki el siguiente codigo evitaria que alguien escriviera hay cualquier url externa..:

<?

    
die(&#39;Error. intento de RFI..&#39;);
else
    include (
$url);
?>


Alguien me lo podria confirmar? muchas gracias

Saludos

Para mi que falta un "if..." que debe ser lo importante, porque asi... no se como se va a proteger del RFI...

Te paso el codigo que me pedias:
Código: [Seleccionar]
function limpiain( $variable )
{
        // Inicio bloque eliminacion palabras restringidas
$banlist = array
("insert", "select", "update", "delete", "having", "truncate", "replace",
"handler", "procedure", "order by", "group by", "drop", "where");
$variable = trim ( str_replace ( $banlist, '', $variable ) );
        //Fin bloque eliminacion palabras restringidas

$rvar = addslashes(trim($variable));
return $rvar;
}

function limpiaout($variable) {
$rvar = stripslashes($variable);
return $rvar;
}

La funcion limpiain elimina las palabras que hay en el array de la funcion, de la variable que pasamos como parametro, y ademas te añade una barra invertida (\) delante de las comillas simples ('), comillas dobles ("), barras invertidas (\). Esos simbolos, como quizas ya sabes, suele ser el metodo mas comun para hacer sql injection.

La otra funcion, limpiaout, solo te quita las barras invertidas (\) que tenga la variable que le pasemos.

El gran problema de la funcion limpiain es que te elimina palabras que al igual queremos usar.
Por ejemplo: insertar, insertando, etc y dejaria unicamente "ar", "ando", etc respectivamente.
Lo que yo hago es deshabilitar (comento) el bloque que suprime esas palabras y dejo solo la parte que me añade las barras invertidas. Yo creo que con eso hay mas que suficiente, pero si eres muy paranoico, siempre puedes dejar habilitado dicho bloque quitando o añadiendo palabras al array.

Unos ejemplos:
Código: [Seleccionar]
<?php
//Definir funciones. 

/* Lo mejor es ponerlo en otro archivo e incluirlo (con require/include),
   ya que seguramente lo emplearas para otras páginas.
*/


function limpiain$variable )
{
/* $banlist = array
("insert", "select", "update", "delete", "having", "truncate", "replace",
 "handler", "procedure", "order by", "group by", "drop", "where");
$variable = trim ( str_replace ( $banlist, &#39;&#39;, $variable ) );
*/
$rvar addslashes(trim($variable));
return 
$rvar;
}

function 
limpiaout($variable) {
$rvar stripslashes($variable);
return $rvar;
}


// Limpiamos unas variables

if (isset($_POST[&#39;usuario&#39;]) && ($_POST[&#39;usuario&#39;] != &#39;&#39;)) {
$Pusuario limpiain($_POST[&#39;usuario&#39;]);
}

if (isset(
$_GET[&#39;numero&#39;]) && ($_GET[&#39;numero&#39;] != &#39;&#39;) && is_numeric($_GET[&#39;numero&#39;]) {
$Pnumero limpiain($_GET[&#39;numero&#39;]);
}

if (isset(
$_POST[&#39;pass&#39;]) && ($_POST[&#39;pass&#39;] != &#39;&#39;)) {
$Ppass limpiain($_POST[&#39;pass&#39;]);
}


// Llamamos a las nuevas variables que ya estan tratadas. Dos ejemplos:
// Si vas a ejecutar sentencias sql, pasa las variables tratadas SIN LIMPIAR. 

if ((isset($Pusuario)) && (isset($Ppass)) && (isset($Pnumero))) {
$Consulta = &#39;SELECT SysUsr.IdUsuario, SysUsr.Password FROM SysUsr WHERE SysUsr.Usuario = "&#39;.$Pusuario.&#39;"&#39;;
//Fijate que aqui NO he tratado la variable con limpiaout
}

// Si por el contrario las variables van a ser mostradas en pagina (tanto las procedan de la bdd y hayan sido 
// indroducidas con limpiain, como las que se usen directamente en la página), deben ser tratadas con limpiaout:

echo limpiaout($Pusuario);

// o tambien:

if(mysql_num_rows($Consulta)) {
    while(
$salida mysql_fetch_array($Consulta)) {
        echo 
limpiaout($salida[&#39;usuario&#39;]);
    
}
}

?>



Un pequeño resumen:
- Si el campo a tratar va a ser siempre numérico, usa la funcion "is_numeric()"
- Siempre trata todas las variables al principio del script pasando el nuevo valor a una variable nueva. A partir de ese momento, olvidate de la variable que te haya venido de otra pagina ($_GET, etc...) y usa siempre la nueva que hayas creado ($Pusuario, $Pnumero, etc. de los ejemplos que he puesto antes) volviendola a convertir con limpiaout cuando sea necesario (insisto: no uses limpiaout para hacer consultas o meter datos en una bdd, solo trata sus respuestas)


Espero que te haya servido de ayuda, y perdona por el tocho de post, es que cuando me emociono escribiendo... :P

Saludos,
M

14
PHP / Re: Creando un foro
« en: 17 de Junio de 2007, 10:19:23 am »

[..............]
Y bueno pues eso que antes de publicar nada quiero saber como chaparlo para que no me puedan hacer RFI mediante eso que es muy facil...

Saludos

Hay un par de consejos en http://es.wikipedia.org/wiki/Remote_File_Inclusion_%28RFI%29

De todos modos, creo que basta con que únicamente pases por parametros $_POST, $_GET, $_LoQueSea (no se como se llaman este tipo de variables :P) únicamente valores y no urls, para que despues sean tratadas desde la página que debe procesar la query.

Yo lo que hago es filtrar TODAS las variables que me vienen de otras páginas ($_POST, etc), y siempre al principio del programa. Tengo por ahi una funcion muy "simplona" para evitar el SQLinjection, si te interesa te lo paso.

Tengo que reconocer que no sabia lo que significaba el término "RFI"  ::), y aun no se si únicamente abarca el envio de ficheros para modificar el funcionamiento de la página, o si ese termino tambien incluye SQL/HTML injection. En cualquier caso, un buen filtrado de las variables como he dicho antes, deberia solucionar todo ese tipo de ataques (al menos en lo que a programacion se refiere, pues desgraciadamente tambien existen bugs en php...)

Saludos,
M

15
General / Re: XUL
« en: 16 de Junio de 2007, 01:37:18 am »
Que es eso de XUL? :S xD

Es un lenguaje con el cual se hacen las extensiones para firefox. Por lo poco que tengo entendido, no sirve para nada mas :( (Al menos de momento...), pero las posibilidades que tiene son bastante interesantes!

Yo quiero usarlo para hacer una especie de greasemonkey pero personalizado a mi manera. MAs concretamente, para modificar el contenido en mi navegador de páginas webs externas y controladas por una aplicacion y bdd local. Pero sobre todo lo quiero... para aprender cosas nuevas ;D, que ya me estaba aburriendo...

Saludos,
M

Páginas: [1] 2